From f95fef17d2c4354567deb0d9490277844284a8eb Mon Sep 17 00:00:00 2001 From: "|| Prof. - Xadk3!#0000 || @naryal2580" Date: Sat, 20 May 2023 20:32:19 +0530 Subject: [PATCH] CORE+LATEST --- core/src/app/Constants.js | 54 + core/src/app/GPUSettings.js | 20 + core/src/app/appBadge.js | 86 + core/src/app/appConfig.js | 49 + core/src/app/appFeatures.js | 16 + core/src/app/applicationMenu/darwin.js | 150 + core/src/app/applicationMenu/index.js | 11 + core/src/app/applicationMenu/linux.js | 78 + core/src/app/applicationMenu/win32.js | 57 + core/src/app/bootstrapModules/appSettings.js | 12 + core/src/app/bootstrapModules/autoStart.js | 12 + .../app/bootstrapModules/bootstrapModules.js | 52 + core/src/app/bootstrapModules/buildInfo.js | 12 + .../bootstrapModules/crashReporterSetup.js | 10 + .../src/app/bootstrapModules/moduleUpdater.js | 12 + core/src/app/bootstrapModules/paths.js | 12 + core/src/app/bootstrapModules/splashScreen.js | 12 + core/src/app/bootstrapModules/updater.js | 12 + core/src/app/data/cacert.pem | 3865 +++++++++++++++++ .../discord_native/browser/accessibility.js | 8 + core/src/app/discord_native/browser/app.js | 96 + .../app/discord_native/browser/clipboard.js | 19 + core/src/app/discord_native/browser/clips.js | 134 + .../app/discord_native/browser/constants.js | 26 + .../discord_native/browser/crashReporter.js | 25 + .../discord_native/browser/desktopCapturer.js | 8 + .../app/discord_native/browser/features.js | 25 + .../app/discord_native/browser/fileManager.js | 32 + .../discord_native/browser/globalOverlay.js | 89 + .../app/discord_native/browser/gpuSettings.js | 25 + .../discord_native/browser/nativeModules.js | 97 + .../discord_native/browser/powerMonitor.js | 33 + .../browser/powerSaveBlocker.js | 25 + .../discord_native/browser/processUtils.js | 80 + .../app/discord_native/browser/safeStorage.js | 29 + .../app/discord_native/browser/settings.js | 36 + .../app/discord_native/browser/spellCheck.js | 39 + .../discord_native/browser/userDataCache.js | 54 + core/src/app/discord_native/browser/window.js | 97 + .../app/discord_native/common/DiscordIPC.js | 62 + .../app/discord_native/common/constants.js | 116 + .../app/discord_native/common/fileutils.js | 105 + core/src/app/discord_native/common/paths.js | 53 + core/src/app/discord_native/common/utils.js | 17 + .../discord_native/renderer/accessibility.js | 9 + core/src/app/discord_native/renderer/app.js | 90 + .../app/discord_native/renderer/clipboard.js | 42 + core/src/app/discord_native/renderer/clips.js | 18 + .../discord_native/renderer/crashReporter.js | 27 + .../discord_native/renderer/desktopCapture.js | 25 + .../app/discord_native/renderer/features.js | 14 + .../discord_native/renderer/fileManager.js | 167 + core/src/app/discord_native/renderer/files.js | 9 + .../discord_native/renderer/globalOverlay.js | 10 + .../discord_native/renderer/gpuSettings.js | 20 + core/src/app/discord_native/renderer/http.js | 96 + core/src/app/discord_native/renderer/ipc.js | 35 + .../app/discord_native/renderer/minidump.js | 458 ++ .../discord_native/renderer/minidumpReader.js | 23 + .../discord_native/renderer/nativeModules.js | 50 + core/src/app/discord_native/renderer/os.js | 12 + .../discord_native/renderer/powerMonitor.js | 42 + .../renderer/powerSaveBlocker.js | 22 + .../app/discord_native/renderer/process.js | 18 + .../discord_native/renderer/processUtils.js | 98 + .../discord_native/renderer/safeStorage.js | 22 + .../app/discord_native/renderer/settings.js | 29 + .../app/discord_native/renderer/spellCheck.js | 48 + .../app/discord_native/renderer/thumbar.js | 16 + .../discord_native/renderer/userDataCache.js | 23 + .../src/app/discord_native/renderer/window.js | 95 + core/src/app/images/badges/badge-1.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-10.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-11.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-2.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-3.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-4.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-5.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-6.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-7.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-8.ico | Bin 0 -> 15086 bytes core/src/app/images/badges/badge-9.ico | Bin 0 -> 15086 bytes core/src/app/images/close.svg | 15 + core/src/app/images/discord.svg | 34 + .../darwin/tray-connectedTemplate.png | Bin 0 -> 153 bytes .../darwin/tray-connectedTemplate@1.25x.png | Bin 0 -> 189 bytes .../darwin/tray-connectedTemplate@1.33x.png | Bin 0 -> 232 bytes .../darwin/tray-connectedTemplate@1.4x.png | Bin 0 -> 238 bytes .../darwin/tray-connectedTemplate@1.5x.png | Bin 0 -> 205 bytes .../darwin/tray-connectedTemplate@1.8x.png | Bin 0 -> 281 bytes .../darwin/tray-connectedTemplate@2.5x.png | Bin 0 -> 294 bytes .../darwin/tray-connectedTemplate@2x.png | Bin 0 -> 229 bytes .../darwin/tray-connectedTemplate@3x.png | Bin 0 -> 301 bytes .../darwin/tray-connectedTemplate@4x.png | Bin 0 -> 421 bytes .../darwin/tray-connectedTemplate@5x.png | Bin 0 -> 540 bytes .../darwin/tray-deafenedTemplate.png | Bin 0 -> 233 bytes .../darwin/tray-deafenedTemplate@1.25x.png | Bin 0 -> 291 bytes .../darwin/tray-deafenedTemplate@1.33x.png | Bin 0 -> 308 bytes .../darwin/tray-deafenedTemplate@1.4x.png | Bin 0 -> 313 bytes .../darwin/tray-deafenedTemplate@1.5x.png | Bin 0 -> 305 bytes .../darwin/tray-deafenedTemplate@1.8x.png | Bin 0 -> 383 bytes .../darwin/tray-deafenedTemplate@2.5x.png | Bin 0 -> 470 bytes .../darwin/tray-deafenedTemplate@2x.png | Bin 0 -> 385 bytes .../darwin/tray-deafenedTemplate@3x.png | Bin 0 -> 491 bytes .../darwin/tray-deafenedTemplate@4x.png | Bin 0 -> 668 bytes .../darwin/tray-deafenedTemplate@5x.png | Bin 0 -> 834 bytes .../systemtray/darwin/tray-mutedTemplate.png | Bin 0 -> 216 bytes .../darwin/tray-mutedTemplate@1.25x.png | Bin 0 -> 271 bytes .../darwin/tray-mutedTemplate@1.33x.png | Bin 0 -> 284 bytes .../darwin/tray-mutedTemplate@1.4x.png | Bin 0 -> 298 bytes .../darwin/tray-mutedTemplate@1.5x.png | Bin 0 -> 293 bytes .../darwin/tray-mutedTemplate@1.8x.png | Bin 0 -> 368 bytes .../darwin/tray-mutedTemplate@2.5x.png | Bin 0 -> 454 bytes .../darwin/tray-mutedTemplate@2x.png | Bin 0 -> 354 bytes .../darwin/tray-mutedTemplate@3x.png | Bin 0 -> 496 bytes .../darwin/tray-mutedTemplate@4x.png | Bin 0 -> 609 bytes .../darwin/tray-mutedTemplate@5x.png | Bin 0 -> 753 bytes .../darwin/tray-speakingTemplate.png | Bin 0 -> 199 bytes .../darwin/tray-speakingTemplate@1.25x.png | Bin 0 -> 261 bytes .../darwin/tray-speakingTemplate@1.33x.png | Bin 0 -> 297 bytes .../darwin/tray-speakingTemplate@1.4x.png | Bin 0 -> 325 bytes .../darwin/tray-speakingTemplate@1.5x.png | Bin 0 -> 303 bytes .../darwin/tray-speakingTemplate@1.8x.png | Bin 0 -> 387 bytes .../darwin/tray-speakingTemplate@2.5x.png | Bin 0 -> 461 bytes .../darwin/tray-speakingTemplate@2x.png | Bin 0 -> 337 bytes .../darwin/tray-speakingTemplate@3x.png | Bin 0 -> 520 bytes .../darwin/tray-speakingTemplate@4x.png | Bin 0 -> 695 bytes .../darwin/tray-speakingTemplate@5x.png | Bin 0 -> 846 bytes .../systemtray/darwin/tray-unreadTemplate.png | Bin 0 -> 272 bytes .../images/systemtray/darwin/trayTemplate.png | Bin 0 -> 232 bytes .../systemtray/linux/tray-connected.png | Bin 0 -> 289 bytes .../images/systemtray/linux/tray-deafened.png | Bin 0 -> 365 bytes .../images/systemtray/linux/tray-muted.png | Bin 0 -> 381 bytes .../images/systemtray/linux/tray-speaking.png | Bin 0 -> 420 bytes .../images/systemtray/linux/tray-unread.png | Bin 0 -> 906 bytes core/src/app/images/systemtray/linux/tray.png | Bin 0 -> 718 bytes .../systemtray/win32/tray-connected.png | Bin 0 -> 276 bytes .../systemtray/win32/tray-connected@1.25x.png | Bin 0 -> 378 bytes .../systemtray/win32/tray-connected@1.33x.png | Bin 0 -> 604 bytes .../systemtray/win32/tray-connected@1.4x.png | Bin 0 -> 663 bytes .../systemtray/win32/tray-connected@1.5x.png | Bin 0 -> 423 bytes .../systemtray/win32/tray-connected@1.8x.png | Bin 0 -> 855 bytes .../systemtray/win32/tray-connected@2.5x.png | Bin 0 -> 709 bytes .../systemtray/win32/tray-connected@2x.png | Bin 0 -> 551 bytes .../systemtray/win32/tray-connected@3x.png | Bin 0 -> 862 bytes .../systemtray/win32/tray-connected@4x.png | Bin 0 -> 1142 bytes .../systemtray/win32/tray-connected@5x.png | Bin 0 -> 1371 bytes .../images/systemtray/win32/tray-deafened.png | Bin 0 -> 301 bytes .../systemtray/win32/tray-deafened@1.25x.png | Bin 0 -> 376 bytes .../systemtray/win32/tray-deafened@1.33x.png | Bin 0 -> 381 bytes .../systemtray/win32/tray-deafened@1.4x.png | Bin 0 -> 407 bytes .../systemtray/win32/tray-deafened@1.5x.png | Bin 0 -> 365 bytes .../systemtray/win32/tray-deafened@1.8x.png | Bin 0 -> 468 bytes .../systemtray/win32/tray-deafened@2.5x.png | Bin 0 -> 560 bytes .../systemtray/win32/tray-deafened@2x.png | Bin 0 -> 475 bytes .../systemtray/win32/tray-deafened@3x.png | Bin 0 -> 607 bytes .../systemtray/win32/tray-deafened@4x.png | Bin 0 -> 827 bytes .../systemtray/win32/tray-deafened@5x.png | Bin 0 -> 991 bytes .../images/systemtray/win32/tray-muted.png | Bin 0 -> 287 bytes .../systemtray/win32/tray-muted@1.25x.png | Bin 0 -> 334 bytes .../systemtray/win32/tray-muted@1.33x.png | Bin 0 -> 363 bytes .../systemtray/win32/tray-muted@1.4x.png | Bin 0 -> 359 bytes .../systemtray/win32/tray-muted@1.5x.png | Bin 0 -> 381 bytes .../systemtray/win32/tray-muted@1.8x.png | Bin 0 -> 454 bytes .../systemtray/win32/tray-muted@2.5x.png | Bin 0 -> 561 bytes .../images/systemtray/win32/tray-muted@2x.png | Bin 0 -> 431 bytes .../images/systemtray/win32/tray-muted@3x.png | Bin 0 -> 611 bytes .../images/systemtray/win32/tray-muted@4x.png | Bin 0 -> 746 bytes .../images/systemtray/win32/tray-muted@5x.png | Bin 0 -> 932 bytes .../images/systemtray/win32/tray-speaking.png | Bin 0 -> 248 bytes .../systemtray/win32/tray-speaking@1.25x.png | Bin 0 -> 331 bytes .../systemtray/win32/tray-speaking@1.33x.png | Bin 0 -> 479 bytes .../systemtray/win32/tray-speaking@1.4x.png | Bin 0 -> 502 bytes .../systemtray/win32/tray-speaking@1.5x.png | Bin 0 -> 353 bytes .../systemtray/win32/tray-speaking@1.8x.png | Bin 0 -> 612 bytes .../systemtray/win32/tray-speaking@2.5x.png | Bin 0 -> 512 bytes .../systemtray/win32/tray-speaking@2x.png | Bin 0 -> 415 bytes .../systemtray/win32/tray-speaking@3x.png | Bin 0 -> 609 bytes .../systemtray/win32/tray-speaking@4x.png | Bin 0 -> 813 bytes .../systemtray/win32/tray-speaking@5x.png | Bin 0 -> 947 bytes .../images/systemtray/win32/tray-unread.png | Bin 0 -> 512 bytes .../systemtray/win32/tray-unread@1.25x.png | Bin 0 -> 736 bytes .../systemtray/win32/tray-unread@1.33x.png | Bin 0 -> 785 bytes .../systemtray/win32/tray-unread@1.4x.png | Bin 0 -> 848 bytes .../systemtray/win32/tray-unread@1.5x.png | Bin 0 -> 892 bytes .../systemtray/win32/tray-unread@1.8x.png | Bin 0 -> 1112 bytes .../systemtray/win32/tray-unread@2.5x.png | Bin 0 -> 1637 bytes .../systemtray/win32/tray-unread@2x.png | Bin 0 -> 1143 bytes .../systemtray/win32/tray-unread@3x.png | Bin 0 -> 1944 bytes .../systemtray/win32/tray-unread@4x.png | Bin 0 -> 2888 bytes .../systemtray/win32/tray-unread@5x.png | Bin 0 -> 3881 bytes core/src/app/images/systemtray/win32/tray.png | Bin 0 -> 359 bytes .../images/systemtray/win32/tray@1.25x.png | Bin 0 -> 523 bytes .../images/systemtray/win32/tray@1.33x.png | Bin 0 -> 555 bytes .../app/images/systemtray/win32/tray@1.4x.png | Bin 0 -> 586 bytes .../app/images/systemtray/win32/tray@1.5x.png | Bin 0 -> 632 bytes .../app/images/systemtray/win32/tray@1.8x.png | Bin 0 -> 1052 bytes .../app/images/systemtray/win32/tray@2.5x.png | Bin 0 -> 1136 bytes .../app/images/systemtray/win32/tray@2x.png | Bin 0 -> 1145 bytes .../app/images/systemtray/win32/tray@3x.png | Bin 0 -> 1406 bytes .../app/images/systemtray/win32/tray@4x.png | Bin 0 -> 2105 bytes .../app/images/systemtray/win32/tray@5x.png | Bin 0 -> 2907 bytes .../app/images/thumbar/darwin/deafen-off.png | Bin 0 -> 679 bytes core/src/app/images/thumbar/darwin/deafen.png | Bin 0 -> 894 bytes .../app/images/thumbar/darwin/disconnect.png | Bin 0 -> 683 bytes .../app/images/thumbar/darwin/mute-off.png | Bin 0 -> 566 bytes core/src/app/images/thumbar/darwin/mute.png | Bin 0 -> 767 bytes .../app/images/thumbar/darwin/video-off.png | Bin 0 -> 509 bytes core/src/app/images/thumbar/darwin/video.png | Bin 0 -> 403 bytes .../app/images/thumbar/win32/deafen-light.png | Bin 0 -> 876 bytes .../images/thumbar/win32/deafen-off-light.png | Bin 0 -> 849 bytes .../app/images/thumbar/win32/deafen-off.png | Bin 0 -> 892 bytes core/src/app/images/thumbar/win32/deafen.png | Bin 0 -> 932 bytes .../images/thumbar/win32/disconnect-light.png | Bin 0 -> 903 bytes .../app/images/thumbar/win32/disconnect.png | Bin 0 -> 918 bytes .../app/images/thumbar/win32/mute-light.png | Bin 0 -> 794 bytes .../images/thumbar/win32/mute-off-light.png | Bin 0 -> 711 bytes .../src/app/images/thumbar/win32/mute-off.png | Bin 0 -> 749 bytes core/src/app/images/thumbar/win32/mute.png | Bin 0 -> 830 bytes .../app/images/thumbar/win32/video-light.png | Bin 0 -> 423 bytes .../images/thumbar/win32/video-off-light.png | Bin 0 -> 617 bytes .../app/images/thumbar/win32/video-off.png | Bin 0 -> 619 bytes core/src/app/images/thumbar/win32/video.png | Bin 0 -> 443 bytes core/src/app/index.js | 104 + core/src/app/ipcMain.js | 16 + core/src/app/jest.config.js | 14 + core/src/app/mainScreen.js | 999 +++++ core/src/app/mainScreenPreload.js | 74 + core/src/app/mouse.js | 18 + core/src/app/notificationScreen.js | 192 + core/src/app/notificationScreenPreload.js | 17 + .../14f734d6803726c94b970c3ed80c0864.svg | 15 + .../33ca047f7152c1abc7d3cb1c4bc64aab.woff2 | Bin 0 -> 30460 bytes .../587be4501122cedab165d89ee2ee446d.svg | 34 + .../ac3f027697c11abd84295888e843f3d2.woff2 | Bin 0 -> 29668 bytes .../bf3d19297ef12291559b3edae977480c.woff2 | Bin 0 -> 30600 bytes core/src/app/notifications/index.html | 10 + core/src/app/notifications/index.js | 33 + core/src/app/notifications/variables.json | 6 + core/src/app/popoutWindows.js | 153 + core/src/app/rootCertificates.js | 32 + core/src/app/systemTray.js | 229 + core/src/app/thumbarButtons.js | 80 + core/src/app/utils.js | 30 + core/src/common/Backoff.js | 90 + core/src/common/FeatureFlags.js | 26 + core/src/common/Settings.js | 58 + core/src/common/crashReporterSetup.js | 101 + core/src/common/crashReporterUtils.js | 42 + core/src/common/moduleUpdater.js | 859 ++++ core/src/common/nodeGlobalPaths.js | 31 + core/src/common/paths.js | 101 + core/src/common/processUtils.js | 51 + core/src/common/securityUtils.js | 42 + core/src/common/typings/global.d.ts | 14 + core/src/common/updater.js | 394 ++ core/src/package.json | 25 + 257 files changed, 11319 insertions(+) create mode 100644 core/src/app/Constants.js create mode 100644 core/src/app/GPUSettings.js create mode 100644 core/src/app/appBadge.js create mode 100644 core/src/app/appConfig.js create mode 100644 core/src/app/appFeatures.js create mode 100644 core/src/app/applicationMenu/darwin.js create mode 100644 core/src/app/applicationMenu/index.js create mode 100644 core/src/app/applicationMenu/linux.js create mode 100644 core/src/app/applicationMenu/win32.js create mode 100644 core/src/app/bootstrapModules/appSettings.js create mode 100644 core/src/app/bootstrapModules/autoStart.js create mode 100644 core/src/app/bootstrapModules/bootstrapModules.js create mode 100644 core/src/app/bootstrapModules/buildInfo.js create mode 100644 core/src/app/bootstrapModules/crashReporterSetup.js create mode 100644 core/src/app/bootstrapModules/moduleUpdater.js create mode 100644 core/src/app/bootstrapModules/paths.js create mode 100644 core/src/app/bootstrapModules/splashScreen.js create mode 100644 core/src/app/bootstrapModules/updater.js create mode 100644 core/src/app/data/cacert.pem create mode 100644 core/src/app/discord_native/browser/accessibility.js create mode 100644 core/src/app/discord_native/browser/app.js create mode 100644 core/src/app/discord_native/browser/clipboard.js create mode 100644 core/src/app/discord_native/browser/clips.js create mode 100644 core/src/app/discord_native/browser/constants.js create mode 100644 core/src/app/discord_native/browser/crashReporter.js create mode 100644 core/src/app/discord_native/browser/desktopCapturer.js create mode 100644 core/src/app/discord_native/browser/features.js create mode 100644 core/src/app/discord_native/browser/fileManager.js create mode 100644 core/src/app/discord_native/browser/globalOverlay.js create mode 100644 core/src/app/discord_native/browser/gpuSettings.js create mode 100644 core/src/app/discord_native/browser/nativeModules.js create mode 100644 core/src/app/discord_native/browser/powerMonitor.js create mode 100644 core/src/app/discord_native/browser/powerSaveBlocker.js create mode 100644 core/src/app/discord_native/browser/processUtils.js create mode 100644 core/src/app/discord_native/browser/safeStorage.js create mode 100644 core/src/app/discord_native/browser/settings.js create mode 100644 core/src/app/discord_native/browser/spellCheck.js create mode 100644 core/src/app/discord_native/browser/userDataCache.js create mode 100644 core/src/app/discord_native/browser/window.js create mode 100644 core/src/app/discord_native/common/DiscordIPC.js create mode 100644 core/src/app/discord_native/common/constants.js create mode 100644 core/src/app/discord_native/common/fileutils.js create mode 100644 core/src/app/discord_native/common/paths.js create mode 100644 core/src/app/discord_native/common/utils.js create mode 100644 core/src/app/discord_native/renderer/accessibility.js create mode 100644 core/src/app/discord_native/renderer/app.js create mode 100644 core/src/app/discord_native/renderer/clipboard.js create mode 100644 core/src/app/discord_native/renderer/clips.js create mode 100644 core/src/app/discord_native/renderer/crashReporter.js create mode 100644 core/src/app/discord_native/renderer/desktopCapture.js create mode 100644 core/src/app/discord_native/renderer/features.js create mode 100644 core/src/app/discord_native/renderer/fileManager.js create mode 100644 core/src/app/discord_native/renderer/files.js create mode 100644 core/src/app/discord_native/renderer/globalOverlay.js create mode 100644 core/src/app/discord_native/renderer/gpuSettings.js create mode 100644 core/src/app/discord_native/renderer/http.js create mode 100644 core/src/app/discord_native/renderer/ipc.js create mode 100644 core/src/app/discord_native/renderer/minidump.js create mode 100644 core/src/app/discord_native/renderer/minidumpReader.js create mode 100644 core/src/app/discord_native/renderer/nativeModules.js create mode 100644 core/src/app/discord_native/renderer/os.js create mode 100644 core/src/app/discord_native/renderer/powerMonitor.js create mode 100644 core/src/app/discord_native/renderer/powerSaveBlocker.js create mode 100644 core/src/app/discord_native/renderer/process.js create mode 100644 core/src/app/discord_native/renderer/processUtils.js create mode 100644 core/src/app/discord_native/renderer/safeStorage.js create mode 100644 core/src/app/discord_native/renderer/settings.js create mode 100644 core/src/app/discord_native/renderer/spellCheck.js create mode 100644 core/src/app/discord_native/renderer/thumbar.js create mode 100644 core/src/app/discord_native/renderer/userDataCache.js create mode 100644 core/src/app/discord_native/renderer/window.js create mode 100644 core/src/app/images/badges/badge-1.ico create mode 100644 core/src/app/images/badges/badge-10.ico create mode 100644 core/src/app/images/badges/badge-11.ico create mode 100644 core/src/app/images/badges/badge-2.ico create mode 100644 core/src/app/images/badges/badge-3.ico create mode 100644 core/src/app/images/badges/badge-4.ico create mode 100644 core/src/app/images/badges/badge-5.ico create mode 100644 core/src/app/images/badges/badge-6.ico create mode 100644 core/src/app/images/badges/badge-7.ico create mode 100644 core/src/app/images/badges/badge-8.ico create mode 100644 core/src/app/images/badges/badge-9.ico create mode 100644 core/src/app/images/close.svg create mode 100644 core/src/app/images/discord.svg create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.25x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.33x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.8x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@2.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@2x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@3x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-connectedTemplate@5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@1.25x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@1.33x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@1.4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@1.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@1.8x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@2.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@2x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@3x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-deafenedTemplate@5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.25x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.33x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.8x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@2.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@2x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@3x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-mutedTemplate@5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.25x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.33x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.8x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@2.5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@2x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@3x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@4x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-speakingTemplate@5x.png create mode 100644 core/src/app/images/systemtray/darwin/tray-unreadTemplate.png create mode 100644 core/src/app/images/systemtray/darwin/trayTemplate.png create mode 100644 core/src/app/images/systemtray/linux/tray-connected.png create mode 100644 core/src/app/images/systemtray/linux/tray-deafened.png create mode 100644 core/src/app/images/systemtray/linux/tray-muted.png create mode 100644 core/src/app/images/systemtray/linux/tray-speaking.png create mode 100644 core/src/app/images/systemtray/linux/tray-unread.png create mode 100644 core/src/app/images/systemtray/linux/tray.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@1.25x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@1.33x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@1.4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@1.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@1.8x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@2.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@2x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@3x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-connected@5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@1.25x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@1.33x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@1.4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@1.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@1.8x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@2.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@2x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@3x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-deafened@5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@1.25x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@1.33x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@1.4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@1.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@1.8x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@2.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@2x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@3x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-muted@5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@1.25x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@1.33x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@1.4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@1.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@1.8x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@2.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@2x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@3x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-speaking@5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@1.25x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@1.33x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@1.4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@1.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@1.8x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@2.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@2x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@3x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@4x.png create mode 100644 core/src/app/images/systemtray/win32/tray-unread@5x.png create mode 100644 core/src/app/images/systemtray/win32/tray.png create mode 100644 core/src/app/images/systemtray/win32/tray@1.25x.png create mode 100644 core/src/app/images/systemtray/win32/tray@1.33x.png create mode 100644 core/src/app/images/systemtray/win32/tray@1.4x.png create mode 100644 core/src/app/images/systemtray/win32/tray@1.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray@1.8x.png create mode 100644 core/src/app/images/systemtray/win32/tray@2.5x.png create mode 100644 core/src/app/images/systemtray/win32/tray@2x.png create mode 100644 core/src/app/images/systemtray/win32/tray@3x.png create mode 100644 core/src/app/images/systemtray/win32/tray@4x.png create mode 100644 core/src/app/images/systemtray/win32/tray@5x.png create mode 100644 core/src/app/images/thumbar/darwin/deafen-off.png create mode 100644 core/src/app/images/thumbar/darwin/deafen.png create mode 100644 core/src/app/images/thumbar/darwin/disconnect.png create mode 100644 core/src/app/images/thumbar/darwin/mute-off.png create mode 100644 core/src/app/images/thumbar/darwin/mute.png create mode 100644 core/src/app/images/thumbar/darwin/video-off.png create mode 100644 core/src/app/images/thumbar/darwin/video.png create mode 100644 core/src/app/images/thumbar/win32/deafen-light.png create mode 100644 core/src/app/images/thumbar/win32/deafen-off-light.png create mode 100644 core/src/app/images/thumbar/win32/deafen-off.png create mode 100644 core/src/app/images/thumbar/win32/deafen.png create mode 100644 core/src/app/images/thumbar/win32/disconnect-light.png create mode 100644 core/src/app/images/thumbar/win32/disconnect.png create mode 100644 core/src/app/images/thumbar/win32/mute-light.png create mode 100644 core/src/app/images/thumbar/win32/mute-off-light.png create mode 100644 core/src/app/images/thumbar/win32/mute-off.png create mode 100644 core/src/app/images/thumbar/win32/mute.png create mode 100644 core/src/app/images/thumbar/win32/video-light.png create mode 100644 core/src/app/images/thumbar/win32/video-off-light.png create mode 100644 core/src/app/images/thumbar/win32/video-off.png create mode 100644 core/src/app/images/thumbar/win32/video.png create mode 100644 core/src/app/index.js create mode 100644 core/src/app/ipcMain.js create mode 100644 core/src/app/jest.config.js create mode 100644 core/src/app/mainScreen.js create mode 100644 core/src/app/mainScreenPreload.js create mode 100644 core/src/app/mouse.js create mode 100644 core/src/app/notificationScreen.js create mode 100644 core/src/app/notificationScreenPreload.js create mode 100644 core/src/app/notifications/14f734d6803726c94b970c3ed80c0864.svg create mode 100644 core/src/app/notifications/33ca047f7152c1abc7d3cb1c4bc64aab.woff2 create mode 100644 core/src/app/notifications/587be4501122cedab165d89ee2ee446d.svg create mode 100644 core/src/app/notifications/ac3f027697c11abd84295888e843f3d2.woff2 create mode 100644 core/src/app/notifications/bf3d19297ef12291559b3edae977480c.woff2 create mode 100644 core/src/app/notifications/index.html create mode 100644 core/src/app/notifications/index.js create mode 100644 core/src/app/notifications/variables.json create mode 100644 core/src/app/popoutWindows.js create mode 100644 core/src/app/rootCertificates.js create mode 100644 core/src/app/systemTray.js create mode 100644 core/src/app/thumbarButtons.js create mode 100644 core/src/app/utils.js create mode 100644 core/src/common/Backoff.js create mode 100644 core/src/common/FeatureFlags.js create mode 100644 core/src/common/Settings.js create mode 100644 core/src/common/crashReporterSetup.js create mode 100644 core/src/common/crashReporterUtils.js create mode 100644 core/src/common/moduleUpdater.js create mode 100644 core/src/common/nodeGlobalPaths.js create mode 100644 core/src/common/paths.js create mode 100644 core/src/common/processUtils.js create mode 100644 core/src/common/securityUtils.js create mode 100644 core/src/common/typings/global.d.ts create mode 100644 core/src/common/updater.js create mode 100644 core/src/package.json diff --git a/core/src/app/Constants.js b/core/src/app/Constants.js new file mode 100644 index 0000000..453567c --- /dev/null +++ b/core/src/app/Constants.js @@ -0,0 +1,54 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +// before we can set up (and export) our constants, we first need to grab bootstrap's constants +// so we can merge them in with our constants +function init(bootstrapConstants) { + const APP_NAME = bootstrapConstants.APP_NAME; + const API_ENDPOINT = bootstrapConstants.API_ENDPOINT; + const NEW_UPDATE_ENDPOINT = bootstrapConstants.NEW_UPDATE_ENDPOINT; + const UPDATE_ENDPOINT = bootstrapConstants.UPDATE_ENDPOINT; + const APP_ID = bootstrapConstants.APP_ID; + const DEFAULT_MAIN_WINDOW_ID = 0; + const MAIN_APP_DIRNAME = __dirname; + const UpdaterEvents = { + UPDATE_NOT_AVAILABLE: 'UPDATE_NOT_AVAILABLE', + CHECKING_FOR_UPDATES: 'CHECKING_FOR_UPDATES', + UPDATE_ERROR: 'UPDATE_ERROR', + UPDATE_MANUALLY: 'UPDATE_MANUALLY', + UPDATE_AVAILABLE: 'UPDATE_AVAILABLE', + MODULE_INSTALL_PROGRESS: 'MODULE_INSTALL_PROGRESS', + UPDATE_DOWNLOADED: 'UPDATE_DOWNLOADED', + MODULE_INSTALLED: 'MODULE_INSTALLED', + CHECK_FOR_UPDATES: 'CHECK_FOR_UPDATES', + QUIT_AND_INSTALL: 'QUIT_AND_INSTALL', + MODULE_INSTALL: 'MODULE_INSTALL', + MODULE_QUERY: 'MODULE_QUERY', + UPDATER_HISTORY_QUERY_AND_TRUNCATE: 'UPDATER_HISTORY_QUERY_AND_TRUNCATE', + UPDATER_HISTORY_RESPONSE: 'UPDATER_HISTORY_RESPONSE' + }; + const MenuEvents = { + OPEN_HELP: 'menu:open-help', + OPEN_SETTINGS: 'menu:open-settings', + CHECK_FOR_UPDATES: 'menu:check-for-updates' + }; + const exported = { + APP_NAME, + DEFAULT_MAIN_WINDOW_ID, + MAIN_APP_DIRNAME, + APP_ID, + API_ENDPOINT, + NEW_UPDATE_ENDPOINT, + UPDATE_ENDPOINT, + UpdaterEvents, + MenuEvents + }; + for (const [k, v] of Object.entries(exported)) { + module.exports[k] = v; + } +} +module.exports = { + init +}; \ No newline at end of file diff --git a/core/src/app/GPUSettings.js b/core/src/app/GPUSettings.js new file mode 100644 index 0000000..8aad4c1 --- /dev/null +++ b/core/src/app/GPUSettings.js @@ -0,0 +1,20 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getEnableHardwareAcceleration = getEnableHardwareAcceleration; +exports.setEnableHardwareAcceleration = setEnableHardwareAcceleration; +var _electron = require("electron"); +var _appSettings = require("./bootstrapModules/appSettings"); +const settings = _appSettings.appSettings.getSettings(); +function getEnableHardwareAcceleration() { + // TODO: This should probably a constant + return settings.get('enableHardwareAcceleration', true); +} +function setEnableHardwareAcceleration(enableHardwareAcceleration) { + settings.set('enableHardwareAcceleration', enableHardwareAcceleration); + settings.save(); + _electron.app.relaunch(); + _electron.app.exit(0); +} \ No newline at end of file diff --git a/core/src/app/appBadge.js b/core/src/app/appBadge.js new file mode 100644 index 0000000..ccf83b2 --- /dev/null +++ b/core/src/app/appBadge.js @@ -0,0 +1,86 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.hasInit = void 0; +exports.init = init; +var _electron = require("electron"); +var _utils = require("./utils"); +var _mainScreen = require("./mainScreen"); +var _ipcMain = _interopRequireDefault(require("./ipcMain")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +let hasInit = false; +exports.hasInit = hasInit; +let lastIndex; +let appIcons; + +/** + * Used on Windows to set the taskbar icon + */ +function init() { + // Only init on win32 platforms + if (process.platform !== 'win32') return; + if (hasInit) { + console.warn('appBadge: Has already init! Cancelling init.'); + return; + } + exports.hasInit = hasInit = true; + lastIndex = null; + appIcons = []; + const resourcePath = `app/images/badges`; + for (let i = 1; i <= 11; i++) { + appIcons.push((0, _utils.exposeModuleResource)(resourcePath, `badge-${i}.ico`)); + } + _ipcMain.default.on('APP_BADGE_SET', (_event, count) => setAppBadge(count)); +} +function setAppBadge(count) { + const win = _electron.BrowserWindow.fromId((0, _mainScreen.getMainWindowId)()); + const { + index, + description + } = getOverlayIconData(count); + + // Prevent setting a new icon when the icon is the same + if (lastIndex !== index) { + if (index == null) { + win.setOverlayIcon(null, description); + } else { + win.setOverlayIcon(appIcons[index], description); + } + lastIndex = index; + } +} + +/* + * -1 is bullet + * 0 is nothing + * 1-9 is a number badge + * 10+ is `9+` + */ +function getOverlayIconData(count) { + // Unread message badge + if (count === -1) { + return { + index: 10, + // this.appIcons.length - 1 + description: `Unread messages` + }; + } + + // Clear overlay icon + if (count === 0) { + return { + index: null, + // null is used to clear the overlay icon + description: 'No Notifications' + }; + } + + // Notification badge + const index = Math.max(1, Math.min(count, 10)) - 1; // arrays are 0 based + return { + index, + description: `${index} notifications` + }; +} \ No newline at end of file diff --git a/core/src/app/appConfig.js b/core/src/app/appConfig.js new file mode 100644 index 0000000..91e893b --- /dev/null +++ b/core/src/app/appConfig.js @@ -0,0 +1,49 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.hasInit = void 0; +exports.init = init; +var _autoStart = require("./bootstrapModules/autoStart"); +var _appSettings = require("./bootstrapModules/appSettings"); +var _ipcMain = _interopRequireDefault(require("./ipcMain")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const settings = _appSettings.appSettings.getSettings(); +const NOOP = () => {}; +let hasInit = false; +exports.hasInit = hasInit; +function init() { + if (hasInit) { + console.warn('appConfig: Has already init! Cancelling init.'); + return; + } + exports.hasInit = hasInit = true; + _ipcMain.default.on('TOGGLE_MINIMIZE_TO_TRAY', (_event, value) => setMinimizeOnClose(value)); + _ipcMain.default.on('TOGGLE_OPEN_ON_STARTUP', (_event, value) => toggleRunOnStartup(value)); + _ipcMain.default.on('TOGGLE_START_MINIMIZED', (_event, value) => toggleStartMinimized(value)); + _ipcMain.default.on('UPDATE_OPEN_ON_STARTUP', _event => updateOpenOnStartup()); +} +function setMinimizeOnClose(minimizeToTray) { + settings.set('MINIMIZE_TO_TRAY', minimizeToTray); +} +function toggleRunOnStartup(openOnStartup) { + settings.set('OPEN_ON_STARTUP', openOnStartup); + if (openOnStartup) { + _autoStart.autoStart.install(NOOP); + } else { + _autoStart.autoStart.uninstall(NOOP); + } +} +function toggleStartMinimized(startMinimized) { + settings.set('START_MINIMIZED', startMinimized); + _autoStart.autoStart.isInstalled(installed => { + // Only update the registry for this toggle if the app was already set to autorun + if (installed) { + _autoStart.autoStart.install(NOOP); + } + }); +} +function updateOpenOnStartup() { + _autoStart.autoStart.update(NOOP); +} \ No newline at end of file diff --git a/core/src/app/appFeatures.js b/core/src/app/appFeatures.js new file mode 100644 index 0000000..5eda701 --- /dev/null +++ b/core/src/app/appFeatures.js @@ -0,0 +1,16 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getFeatures = getFeatures; +exports.init = init; +var _FeatureFlags = _interopRequireDefault(require("../common/FeatureFlags")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +let features; +function init() { + features = new _FeatureFlags.default(); +} +function getFeatures() { + return features; +} \ No newline at end of file diff --git a/core/src/app/applicationMenu/darwin.js b/core/src/app/applicationMenu/darwin.js new file mode 100644 index 0000000..5d0ca75 --- /dev/null +++ b/core/src/app/applicationMenu/darwin.js @@ -0,0 +1,150 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var _securityUtils = require("../../common/securityUtils"); +var Constants = _interopRequireWildcard(require("../Constants")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +const { + MenuEvents +} = Constants; +const SEPARATOR = { + type: 'separator' +}; +function getWindow() { + let window = _electron.BrowserWindow.getFocusedWindow(); + if (!window) { + const windowList = _electron.BrowserWindow.getAllWindows(); + if (windowList && windowList[0]) { + window = windowList[0]; + window.show(); + window.focus(); + } + } + return window; +} +var _default = enableDevtools => [{ + label: 'Discord', + submenu: [{ + label: 'About Discord', + selector: 'orderFrontStandardAboutPanel:' + }, { + label: 'Check for Updates...', + click: () => _electron.app.emit(MenuEvents.CHECK_FOR_UPDATES) + }, { + label: 'Acknowledgements', + click: () => (0, _securityUtils.saferShellOpenExternal)('https://discord.com/acknowledgements') + }, SEPARATOR, { + label: 'Preferences', + click: () => _electron.app.emit(MenuEvents.OPEN_SETTINGS), + accelerator: 'Command+,' + }, SEPARATOR, { + label: 'Services', + submenu: [] + }, SEPARATOR, { + label: 'Hide Discord', + selector: 'hide:', + accelerator: 'Command+H' + }, { + label: 'Hide Others', + selector: 'hideOtherApplications:', + accelerator: 'Command+Alt+H' + }, { + label: 'Show All', + selector: 'unhideAllApplications:' + }, SEPARATOR, { + label: 'Quit', + click: () => _electron.app.quit(), + accelerator: 'Command+Q' + }] +}, { + label: 'Edit', + submenu: [{ + role: 'undo', + accelerator: 'Command+Z' + }, { + role: 'redo', + accelerator: 'Shift+Command+Z' + }, SEPARATOR, { + role: 'cut', + accelerator: 'Command+X' + }, { + role: 'copy', + accelerator: 'Command+C' + }, { + role: 'paste', + accelerator: 'Command+V' + }, { + role: 'selectAll', + accelerator: 'Command+A' + }] +}, { + label: 'View', + submenu: [{ + label: 'Reload', + click: () => { + const window = getWindow(); + if (window) { + window.webContents.reloadIgnoringCache(); + } + }, + accelerator: 'Command+R' + }, { + label: 'Toggle Full Screen', + click: () => { + const window = getWindow(); + if (window) { + window.setFullScreen(!window.isFullScreen()); + } + }, + accelerator: 'Command+Control+F' + }, ...(enableDevtools ? [SEPARATOR, { + label: 'Developer', + submenu: [{ + label: 'Toggle Developer Tools', + click: () => { + const window = getWindow(); + if (window) { + window.toggleDevTools(); + } + }, + accelerator: 'Alt+Command+I' + }] + }] : [])] +}, { + label: 'Window', + submenu: [{ + label: 'Minimize', + selector: 'performMiniaturize:', + accelerator: 'Command+M' + }, { + label: 'Zoom', + selector: 'performZoom:' + }, { + label: 'Close', + accelerator: 'Command+W', + click: (_, window) => { + // Main window + if (window == null || window.windowKey == null) { + _electron.Menu.sendActionToFirstResponder('hide:'); + } else { + window.close(); + } + } + }, SEPARATOR, { + label: 'Bring All to Front', + selector: 'arrangeInFront:' + }] +}, { + label: 'Help', + submenu: [{ + label: 'Discord Help', + click: () => _electron.app.emit(MenuEvents.OPEN_HELP) + }] +}]; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/core/src/app/applicationMenu/index.js b/core/src/app/applicationMenu/index.js new file mode 100644 index 0000000..4f7270a --- /dev/null +++ b/core/src/app/applicationMenu/index.js @@ -0,0 +1,11 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +const createMenu = require('./' + process.platform); +var _default = enableDevtools => _electron.Menu.buildFromTemplate(createMenu(enableDevtools)); +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/core/src/app/applicationMenu/linux.js b/core/src/app/applicationMenu/linux.js new file mode 100644 index 0000000..0740054 --- /dev/null +++ b/core/src/app/applicationMenu/linux.js @@ -0,0 +1,78 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var Constants = _interopRequireWildcard(require("../Constants")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +const { + MenuEvents +} = Constants; +const SEPARATOR = { + type: 'separator' +}; +var _default = enableDevtools => [{ + label: '&File', + submenu: [{ + label: '&Options', + click: () => _electron.app.emit(MenuEvents.OPEN_SETTINGS), + accelerator: 'Control+,' + }, SEPARATOR, { + label: 'E&xit', + click: () => _electron.app.quit(), + accelerator: 'Control+Q' + }] +}, { + label: '&Edit', + submenu: [{ + role: 'undo', + accelerator: 'Control+Z' + }, { + role: 'redo', + accelerator: 'Shift+Control+Z' + }, SEPARATOR, { + role: 'cut', + accelerator: 'Control+X' + }, { + role: 'copy', + accelerator: 'Control+C' + }, { + role: 'paste', + accelerator: 'Control+V' + }, { + role: 'selectAll', + accelerator: 'Control+A' + }] +}, { + label: '&View', + submenu: [{ + label: '&Reload', + click: () => _electron.BrowserWindow.getFocusedWindow().webContents.reloadIgnoringCache(), + accelerator: 'Control+R' + }, { + label: 'Toggle &Full Screen', + click: () => _electron.BrowserWindow.getFocusedWindow().setFullScreen(!_electron.BrowserWindow.getFocusedWindow().isFullScreen()), + accelerator: 'Control+Shift+F' + }, ...(enableDevtools ? [SEPARATOR, { + label: '&Developer', + submenu: [{ + label: 'Toggle Developer &Tools', + click: () => _electron.BrowserWindow.getFocusedWindow().toggleDevTools(), + accelerator: 'Control+Shift+I' + }] + }] : [])] +}, { + label: '&Help', + submenu: [{ + label: 'Check for Updates', + click: () => _electron.app.emit(MenuEvents.CHECK_FOR_UPDATES) + }, SEPARATOR, { + label: 'Discord Help', + click: () => _electron.app.emit(MenuEvents.OPEN_HELP) + }] +}]; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/core/src/app/applicationMenu/win32.js b/core/src/app/applicationMenu/win32.js new file mode 100644 index 0000000..4877864 --- /dev/null +++ b/core/src/app/applicationMenu/win32.js @@ -0,0 +1,57 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var Constants = _interopRequireWildcard(require("../Constants")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +const { + MenuEvents +} = Constants; +const SEPARATOR = { + type: 'separator' +}; +var _default = enableDevtools => [{ + label: '&File', + submenu: [{ + label: '&Options', + click: () => _electron.app.emit(MenuEvents.OPEN_SETTINGS), + accelerator: 'Ctrl+,' + }, SEPARATOR, { + label: '&Exit', + click: () => _electron.app.quit(), + accelerator: 'Alt+F4' + }] +}, { + label: '&View', + submenu: [{ + label: '&Reload', + click: () => _electron.BrowserWindow.getFocusedWindow().webContents.reloadIgnoringCache(), + accelerator: 'Control+R' + }, { + label: 'Toggle &Full Screen', + click: () => _electron.BrowserWindow.getFocusedWindow().setFullScreen(!_electron.BrowserWindow.getFocusedWindow().isFullScreen()), + accelerator: 'Control+Shift+F' + }, ...(enableDevtools ? [SEPARATOR, { + label: '&Developer', + submenu: [{ + label: 'Toggle Developer &Tools', + click: () => _electron.BrowserWindow.getFocusedWindow().toggleDevTools(), + accelerator: 'Control+Shift+I' + }] + }] : [])] +}, { + label: '&Help', + submenu: [{ + label: 'Check for Updates', + click: () => _electron.app.emit(MenuEvents.CHECK_FOR_UPDATES) + }, SEPARATOR, { + label: 'Discord Help', + click: () => _electron.app.emit(MenuEvents.OPEN_HELP) + }] +}]; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/core/src/app/bootstrapModules/appSettings.js b/core/src/app/bootstrapModules/appSettings.js new file mode 100644 index 0000000..a613967 --- /dev/null +++ b/core/src/app/bootstrapModules/appSettings.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "appSettings", { + enumerable: true, + get: function () { + return _bootstrapModules.appSettings; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/bootstrapModules/autoStart.js b/core/src/app/bootstrapModules/autoStart.js new file mode 100644 index 0000000..03a70cd --- /dev/null +++ b/core/src/app/bootstrapModules/autoStart.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "autoStart", { + enumerable: true, + get: function () { + return _bootstrapModules.autoStart; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/bootstrapModules/bootstrapModules.js b/core/src/app/bootstrapModules/bootstrapModules.js new file mode 100644 index 0000000..0af0a69 --- /dev/null +++ b/core/src/app/bootstrapModules/bootstrapModules.js @@ -0,0 +1,52 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.crashReporterSetup = exports.buildInfo = exports.autoStart = exports.appSettings = exports.GPUSettings = exports.Constants = void 0; +exports.init = init; +exports.updater = exports.splashScreen = exports.requireNative = exports.paths = exports.moduleUpdater = void 0; +let hasInit = false; + +// NOTE: We may want to instead of initializing these to null, instead initialize them to their normal files. +// This way each one (see `crashReporterSetup`) would not need to do their own self-detection of loading when +// inside the overlay (or any future relevant code). +let paths = null; +exports.paths = paths; +let splashScreen = null; +exports.splashScreen = splashScreen; +let autoStart = null; +exports.autoStart = autoStart; +let requireNative = null; +exports.requireNative = requireNative; +let appSettings = null; +exports.appSettings = appSettings; +let Constants = null; +exports.Constants = Constants; +let GPUSettings = null; +exports.GPUSettings = GPUSettings; +let buildInfo = null; +exports.buildInfo = buildInfo; +let moduleUpdater = null; +exports.moduleUpdater = moduleUpdater; +let updater = null; +exports.updater = updater; +let crashReporterSetup = null; +exports.crashReporterSetup = crashReporterSetup; +function init(bootstrapModules) { + if (hasInit) { + throw new Error(`bootstrapModules has already init`); + } + exports.paths = paths = bootstrapModules.paths; + exports.splashScreen = splashScreen = bootstrapModules.splashScreen; + exports.autoStart = autoStart = bootstrapModules.autoStart; + exports.requireNative = requireNative = bootstrapModules.requireNative; + exports.appSettings = appSettings = bootstrapModules.appSettings; + exports.Constants = Constants = bootstrapModules.Constants; + exports.GPUSettings = GPUSettings = bootstrapModules.GPUSettings; + exports.buildInfo = buildInfo = bootstrapModules.buildInfo; + exports.moduleUpdater = moduleUpdater = bootstrapModules.moduleUpdater; + exports.updater = updater = bootstrapModules.updater; + exports.crashReporterSetup = crashReporterSetup = bootstrapModules.crashReporterSetup; + hasInit = true; +} \ No newline at end of file diff --git a/core/src/app/bootstrapModules/buildInfo.js b/core/src/app/bootstrapModules/buildInfo.js new file mode 100644 index 0000000..6cfe98b --- /dev/null +++ b/core/src/app/bootstrapModules/buildInfo.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "buildInfo", { + enumerable: true, + get: function () { + return _bootstrapModules.buildInfo; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/bootstrapModules/crashReporterSetup.js b/core/src/app/bootstrapModules/crashReporterSetup.js new file mode 100644 index 0000000..0cc30b6 --- /dev/null +++ b/core/src/app/bootstrapModules/crashReporterSetup.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.crashReporterSetup = void 0; +var _bootstrapModules = require("./bootstrapModules"); +// Note: bootstrapCrashReporterSetup will not be set in the overlay. +const crashReporterSetup = _bootstrapModules.crashReporterSetup ?? require('../../common/crashReporterSetup'); +exports.crashReporterSetup = crashReporterSetup; \ No newline at end of file diff --git a/core/src/app/bootstrapModules/moduleUpdater.js b/core/src/app/bootstrapModules/moduleUpdater.js new file mode 100644 index 0000000..ad408cb --- /dev/null +++ b/core/src/app/bootstrapModules/moduleUpdater.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "moduleUpdater", { + enumerable: true, + get: function () { + return _bootstrapModules.moduleUpdater; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/bootstrapModules/paths.js b/core/src/app/bootstrapModules/paths.js new file mode 100644 index 0000000..a9856a3 --- /dev/null +++ b/core/src/app/bootstrapModules/paths.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "paths", { + enumerable: true, + get: function () { + return _bootstrapModules.paths; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/bootstrapModules/splashScreen.js b/core/src/app/bootstrapModules/splashScreen.js new file mode 100644 index 0000000..c40bf2e --- /dev/null +++ b/core/src/app/bootstrapModules/splashScreen.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "splashScreen", { + enumerable: true, + get: function () { + return _bootstrapModules.splashScreen; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/bootstrapModules/updater.js b/core/src/app/bootstrapModules/updater.js new file mode 100644 index 0000000..7a01c45 --- /dev/null +++ b/core/src/app/bootstrapModules/updater.js @@ -0,0 +1,12 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "updater", { + enumerable: true, + get: function () { + return _bootstrapModules.updater; + } +}); +var _bootstrapModules = require("./bootstrapModules"); \ No newline at end of file diff --git a/core/src/app/data/cacert.pem b/core/src/app/data/cacert.pem new file mode 100644 index 0000000..c15368b --- /dev/null +++ b/core/src/app/data/cacert.pem @@ -0,0 +1,3865 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Wed Apr 20 03:12:05 2016 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.25. +## SHA1: 5df367cda83086392e1acdf22bfef00c48d5eba6 +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +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 +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg +RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw +ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w +SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE +n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp +ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 +jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m +ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP +9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV +4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH +HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo +BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl +lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 +B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 +MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL +BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf +aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm +aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a +2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED +wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb +HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV ++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT +9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R +fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy +o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW +hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 +O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +Certification Authority of WoSign G2 +==================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx +CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai +XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du +W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 +5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK +v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI +hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY +P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 +TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu ++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ +7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +CA WoSign ECC Root +================== +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD +TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v +dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU +t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw +QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R +MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 +Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu +a/GRspBl9JrmkO5K +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- diff --git a/core/src/app/discord_native/browser/accessibility.js b/core/src/app/discord_native/browser/accessibility.js new file mode 100644 index 0000000..025fe78 --- /dev/null +++ b/core/src/app/discord_native/browser/accessibility.js @@ -0,0 +1,8 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.ACCESSIBILITY_GET_ENABLED, _ => { + return Promise.resolve(_electron.default.app.accessibilitySupportEnabled); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/app.js b/core/src/app/discord_native/browser/app.js new file mode 100644 index 0000000..1036d8c --- /dev/null +++ b/core/src/app/discord_native/browser/app.js @@ -0,0 +1,96 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.injectBuildInfo = injectBuildInfo; +exports.injectModuleUpdater = injectModuleUpdater; +exports.injectUpdater = injectUpdater; +var _electron = _interopRequireDefault(require("electron")); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable require-await */ + +let injectedBuildInfo = null; +let injectedModuleUpdater = null; +let injectedUpdater = null; +function injectBuildInfo(buildInfo) { + injectedBuildInfo = buildInfo; +} +function injectModuleUpdater(moduleUpdater) { + injectedModuleUpdater = moduleUpdater; +} +function injectUpdater(updater) { + injectedUpdater = updater; +} +_DiscordIPC.DiscordIPC.main.on(_DiscordIPC.IPCEvents.APP_GET_RELEASE_CHANNEL_SYNC, event => { + event.returnValue = injectedBuildInfo.releaseChannel; +}); +_DiscordIPC.DiscordIPC.main.on(_DiscordIPC.IPCEvents.APP_GET_HOST_VERSION_SYNC, event => { + event.returnValue = _electron.default.app.getVersion(); +}); +async function newUpdaterGetModuleVersions(updater) { + // eslint-disable-next-line camelcase + return (await updater.queryCurrentVersions()).current_modules; +} +function newUpdaterGetBuildNumber(updater) { + const version = updater.queryCurrentVersionsSync(); + // eslint-disable-next-line camelcase + if (version.running_update != null) { + return version.running_update.metadata_version; + } + return version.last_successful_update.metadata_version; +} +_DiscordIPC.DiscordIPC.main.on(_DiscordIPC.IPCEvents.APP_GET_BUILD_NUMBER, event => { + var _injectedUpdater; + const newUpdater = (_injectedUpdater = injectedUpdater) === null || _injectedUpdater === void 0 ? void 0 : _injectedUpdater.getUpdater(); + if (newUpdater != null) { + event.returnValue = newUpdaterGetBuildNumber(newUpdater); + return; + } + event.returnValue = null; +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_GET_MODULE_VERSIONS, async _ => { + var _injectedUpdater2; + const newUpdater = (_injectedUpdater2 = injectedUpdater) === null || _injectedUpdater2 === void 0 ? void 0 : _injectedUpdater2.getUpdater(); + if (newUpdater != null) { + return newUpdaterGetModuleVersions(newUpdater); + } + const versions = {}; + const installed = injectedModuleUpdater != null ? injectedModuleUpdater.getInstalled() : {}; + for (const name of Object.keys(installed)) { + versions[name] = installed[name].installedVersion; + } + return versions; +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_GET_PATH, async (_, path) => { + // TODO: Fix argument in AsyncIPCEventMap. + return _electron.default.app.getPath(path); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_SET_BADGE_COUNT, async (_, count) => { + _electron.default.app.setBadgeCount(count); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_DOCK_SET_BADGE, async (_, badge) => { + if (_electron.default.app.dock != null) { + _electron.default.app.dock.setBadge(badge); + } +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_DOCK_BOUNCE, async (_, type) => { + if (_electron.default.app.dock != null) { + return _electron.default.app.dock.bounce(type); + } else { + return -1; + } +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_DOCK_CANCEL_BOUNCE, async (_, id) => { + if (_electron.default.app.dock != null) { + _electron.default.app.dock.cancelBounce(id); + } +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_RELAUNCH, async _ => { + _electron.default.app.relaunch(); + _electron.default.app.exit(0); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.APP_GET_DEFAULT_DOUBLE_CLICK_ACTION, async _ => { + return _electron.default.systemPreferences.getUserDefault('AppleActionOnDoubleClick', 'string'); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/clipboard.js b/core/src/app/discord_native/browser/clipboard.js new file mode 100644 index 0000000..53f52fb --- /dev/null +++ b/core/src/app/discord_native/browser/clipboard.js @@ -0,0 +1,19 @@ +"use strict"; + +// @ts-nocheck +/* eslint-disable */ +const electron = require('electron'); +const { + CLIPBOARD_COPY, + CLIPBOARD_CUT, + CLIPBOARD_PASTE +} = require('../common/constants').IPCEvents; +electron.ipcMain.handle(CLIPBOARD_COPY, async _ => { + electron.webContents.getFocusedWebContents().copy(); +}); +electron.ipcMain.handle(CLIPBOARD_CUT, async _ => { + electron.webContents.getFocusedWebContents().cut(); +}); +electron.ipcMain.handle(CLIPBOARD_PASTE, async _ => { + electron.webContents.getFocusedWebContents().paste(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/clips.js b/core/src/app/discord_native/browser/clips.js new file mode 100644 index 0000000..ae5d305 --- /dev/null +++ b/core/src/app/discord_native/browser/clips.js @@ -0,0 +1,134 @@ +"use strict"; + +var _buffer = _interopRequireDefault(require("buffer")); +var _promises = _interopRequireDefault(require("fs/promises")); +var _path = _interopRequireDefault(require("path")); +var _DiscordIPC = require("../common/DiscordIPC"); +var _fileutils = require("../common/fileutils"); +var _utils = require("../common/utils"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable no-console */ + +const MAX_LENGTH = _buffer.default.constants.MAX_LENGTH; +const DISCORD_HEADER_NAME = 'dscl'; +const INVALID_FILE_ERROR = 'Invalid file'; +class InvalidFileError extends Error {} +function verifyIsMP4(buffer) { + if (getBoxHeaderName(buffer, 0) !== 'ftyp') { + throw new InvalidFileError(INVALID_FILE_ERROR); + } +} +function verifyHasMP4Extension(filename) { + if (_path.default.parse(filename).ext !== '.mp4') { + throw new InvalidFileError(INVALID_FILE_ERROR); + } +} +function getBoxSize(buffer, startIndex) { + return buffer.readUInt32BE(startIndex); +} +function getBoxHeaderName(buffer, startIndex) { + return buffer.toString('ascii', startIndex + 4, startIndex + 8); +} +function verifyValidClip(buffer) { + let currIndex = 0; + while (currIndex < buffer.byteLength) { + const boxHeaderName = getBoxHeaderName(buffer, currIndex); + if (boxHeaderName === DISCORD_HEADER_NAME) { + return; + } + const boxSize = getBoxSize(buffer, currIndex); + //box size must be at least 8 to account for header, so return false for malformed file + if (boxSize < 8) { + throw new InvalidFileError(INVALID_FILE_ERROR); + } + currIndex += boxSize; + } + throw new InvalidFileError(INVALID_FILE_ERROR); +} +async function loadClip(filename) { + try { + verifyHasMP4Extension(filename); + const result = await (0, _fileutils.readFulfilledFiles)([filename], MAX_LENGTH, true); + const buffer = result[0].data; + verifyIsMP4(buffer); + verifyValidClip(buffer); + return result[0]; + } catch (e) { + if (e instanceof InvalidFileError) { + console.log(`Invalid clips file: ${e}`); + } else { + console.error(`Invalid clips file: ${e}`); + } + throw new Error(INVALID_FILE_ERROR); + } +} +async function getClipMetadata(filename, dirPath) { + try { + verifyHasMP4Extension(filename); + } catch (e) { + return null; + } + const filepath = _path.default.join(dirPath, filename); + const handle = await _promises.default.open(filepath, 'r'); + const stats = await handle.stat(); + let currIndex = 0; + const mp4HeaderBuffer = Buffer.alloc(8); + try { + await handle.read({ + buffer: mp4HeaderBuffer, + position: 0 + }); + verifyIsMP4(mp4HeaderBuffer); + currIndex += getBoxSize(mp4HeaderBuffer, currIndex); + while (currIndex < stats.size) { + await handle.read({ + buffer: mp4HeaderBuffer, + position: currIndex + }); + const boxSize = getBoxSize(mp4HeaderBuffer, 0); + if (boxSize < 8) { + return null; + } + const header = getBoxHeaderName(mp4HeaderBuffer, 0); + if (header === DISCORD_HEADER_NAME) { + const metadataBuffer = Buffer.alloc(boxSize - 8); + await handle.read({ + buffer: metadataBuffer, + position: currIndex + 8 + }); + const metadata = JSON.parse(metadataBuffer.toString('utf-8')); + return { + filepath: filepath, + metadata: metadata + }; + } + currIndex += boxSize; + } + return null; + } catch (e) { + console.log(`error: ${e}`); + return null; + } finally { + await handle.close(); + } +} +async function deleteClip(path) { + try { + await loadClip(path); + await (0, _fileutils.deleteFile)(path); + } catch (e) { + console.log(`Invalid clips file to delete: ${e}`); + throw new Error(INVALID_FILE_ERROR); + } +} +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.LOAD_CLIP, (_, path) => { + return loadClip(path); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.LOAD_CLIPS_DIRECTORY, async (_, dirPath) => { + const filenames = await (0, _fileutils.getFilesnamesFromDirectory)(dirPath); + const filteredFiles = (await Promise.all(filenames.map(filename => getClipMetadata(filename, dirPath)))).filter(_utils.isNotNullish); + return filteredFiles; +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.DELETE_CLIP, (_, path) => { + return deleteClip(path); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/constants.js b/core/src/app/discord_native/browser/constants.js new file mode 100644 index 0000000..02790b1 --- /dev/null +++ b/core/src/app/discord_native/browser/constants.js @@ -0,0 +1,26 @@ +"use strict"; + +// @ts-nocheck +/* eslint-disable */ +const electron = require('electron'); +const { + CONSTANTS_GET +} = require('../common/constants').IPCEvents; +const { + APP_NAME, + APP_ID, + API_ENDPOINT, + UPDATE_ENDPOINT +} = require('../../Constants'); +const exposedConstants = { + APP_NAME, + APP_ID, + API_ENDPOINT, + UPDATE_ENDPOINT +}; +electron.ipcMain.handle(CONSTANTS_GET, async (_, name) => { + if (!exposedConstants.hasOwnProperty(name)) { + return undefined; + } + return exposedConstants[name]; +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/crashReporter.js b/core/src/app/discord_native/browser/crashReporter.js new file mode 100644 index 0000000..00e7e44 --- /dev/null +++ b/core/src/app/discord_native/browser/crashReporter.js @@ -0,0 +1,25 @@ +"use strict"; + +var _assert = _interopRequireDefault(require("assert")); +var _electron = _interopRequireDefault(require("electron")); +var _lodash = _interopRequireDefault(require("lodash")); +var _crashReporterUtils = require("../../../common/crashReporterUtils"); +var _crashReporterSetup = require("../../bootstrapModules/crashReporterSetup"); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.CRASH_REPORTER_UPDATE_METADATA, (_, additionalMetadata) => { + const metadata = _crashReporterSetup.crashReporterSetup.metadata; + (0, _assert.default)(metadata != null, 'Metadata imported improperly.'); + const finalMetadata = _lodash.default.defaultsDeep(metadata, additionalMetadata ?? {}); + (0, _crashReporterUtils.reconcileCrashReporterMetadata)(_electron.default.crashReporter, finalMetadata); + return Promise.resolve({ + metadata: finalMetadata + }); +}); + +// Internal test for unhandled JS exception +_electron.default.ipcMain.handle(_DiscordIPC.IPCEvents.UNHANDLED_JS_EXCEPTION, _ => { + setTimeout(() => { + throw new Error('UNHANDLED_EXCEPTION ' + process.type); + }, 50); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/desktopCapturer.js b/core/src/app/discord_native/browser/desktopCapturer.js new file mode 100644 index 0000000..9ef617a --- /dev/null +++ b/core/src/app/discord_native/browser/desktopCapturer.js @@ -0,0 +1,8 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.DESKTOP_CAPTURER_GET_SOURCES, (_, opts) => { + return _electron.default.desktopCapturer.getSources(opts); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/features.js b/core/src/app/discord_native/browser/features.js new file mode 100644 index 0000000..a3215f9 --- /dev/null +++ b/core/src/app/discord_native/browser/features.js @@ -0,0 +1,25 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.injectFeaturesBackend = injectFeaturesBackend; +var _DiscordIPC = require("../common/DiscordIPC"); +let injectedFeatures = null; +function getFeatures() { + return injectedFeatures != null ? injectedFeatures : { + getSupported: () => { + return []; + }, + supports: () => { + return false; + }, + declareSupported: () => {} + }; +} +function injectFeaturesBackend(features) { + injectedFeatures = features; +} +_DiscordIPC.DiscordIPC.main.on(_DiscordIPC.IPCEvents.FEATURES_GET_BROWSER_FEATURES, event => { + event.returnValue = getFeatures().getSupported(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/fileManager.js b/core/src/app/discord_native/browser/fileManager.js new file mode 100644 index 0000000..c5cfe77 --- /dev/null +++ b/core/src/app/discord_native/browser/fileManager.js @@ -0,0 +1,32 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable require-await */ + +function getModulePath() { + // The smoketest's need to be able to: + // 1) store multiple running instances data separately, + // 2) have it in a known location so it can be used as a build artifact. + if (process.env.DISCORD_USER_DATA_DIR != null) { + return process.env.DISCORD_USER_DATA_DIR; + } + return global.moduleDataPath ?? global.modulePath; +} +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.FILE_MANAGER_GET_MODULE_PATH, async _ => { + return getModulePath(); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.FILE_MANAGER_SHOW_SAVE_DIALOG, async (_, dialogOptions) => { + return await _electron.default.dialog.showSaveDialog(dialogOptions); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.FILE_MANAGER_SHOW_OPEN_DIALOG, async (_, dialogOptions) => { + return await _electron.default.dialog.showOpenDialog(dialogOptions); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.FILE_MANAGER_SHOW_ITEM_IN_FOLDER, async (_, path) => { + _electron.default.shell.showItemInFolder(path); +}); +_DiscordIPC.DiscordIPC.main.on(_DiscordIPC.IPCEvents.FILE_MANAGER_GET_MODULE_DATA_PATH_SYNC, event => { + // This is kind of a lie... we offer no promise that moduleDataPath or modulePath are set. + event.returnValue = getModulePath(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/globalOverlay.js b/core/src/app/discord_native/browser/globalOverlay.js new file mode 100644 index 0000000..e4fb02b --- /dev/null +++ b/core/src/app/discord_native/browser/globalOverlay.js @@ -0,0 +1,89 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _path = _interopRequireDefault(require("path")); +var _url = require("url"); +var _processUtils = require("../../../common/processUtils"); +var _mainScreen = require("../../mainScreen"); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable no-console */ + +let interactiveWindow = null; +// let transparentWindow: electron.BrowserWindow | null = null; + +// We need to be restrictive about what url's are accepted. +function isValidUrl(url) { + try { + const parsedUrl = new _url.URL(url); + if (parsedUrl.origin !== _mainScreen.WEBAPP_ENDPOINT) { + console.error(`isValidUrl: "${parsedUrl.origin}" !== "${_mainScreen.WEBAPP_ENDPOINT}" (${url})`); + return false; + } + if (parsedUrl.pathname !== '/overlay') { + console.error(`isValidUrl: Invalid pathname "${parsedUrl.pathname}" (${url})`); + return false; + } + return true; + } catch (e) { + console.error(`isValidUrl: Error "${e}" (${url})`); + return false; + } +} +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.GLOBAL_OVERLAY_OPEN, (_, url) => { + if (!_processUtils.IS_WIN) { + console.log('GLOBAL_OVERLAY_OPEN: Windows only.'); + return Promise.resolve(); + } + + // TODO: Check if the url has changed...? + if (interactiveWindow != null) { + console.log('GLOBAL_OVERLAY_OPEN: Window already open.'); + return Promise.resolve(); + } + if (!isValidUrl(url)) { + return Promise.resolve(); + } + + // The title is randomized to prevent multiple instances from having conflicting titles. + // We may want a global lock on there being a single global overlay tho. + // TODO: The titlebar is blanked out by the javascript code, which is fine'ish for now because the mixture + // of window class and window title are unique for the time being. + const windowOptions = { + width: 0, + height: 0, + x: 0, + y: 0, + transparent: true, + title: 'Discord_Overlay3' + Math.round(Math.random() * 1e9).toString(16), + // TODO: For some reason, it does not workout if the window starts hidden. Perhaps it's not loading and the native + // code isn't firing? + // show: false, // It's shown when initialized by the native code. + frame: false, + // Sets WS_EX_NOACTIVATE, which keeps it out of the taskbar prior to our initialization running. + // Disabled for the time being as it appears to make opening dev tools impossible. + // focusable: true, + webPreferences: { + preload: _path.default.join(__dirname, '..', '..', 'mainScreenPreload.js'), + nodeIntegration: false, + sandbox: false, + contextIsolation: true + } + }; + try { + interactiveWindow = new _electron.default.BrowserWindow(windowOptions); + interactiveWindow.once('closed', () => { + // Untested code path. + interactiveWindow = null; + console.log('GLOBAL_OVERLAY_OPEN: closed'); + }); + + // Enable when finally working on the non-interactive layer. + // transparentWindow = new electron.BrowserWindow(windowOptions); + + interactiveWindow.loadURL(url + '#global_overlay'); + } catch (e) { + console.log(`GLOBAL_OVERLAY_OPEN: Error "${e.text}"\n${e.stack}`); + } + return Promise.resolve(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/gpuSettings.js b/core/src/app/discord_native/browser/gpuSettings.js new file mode 100644 index 0000000..f64fe76 --- /dev/null +++ b/core/src/app/discord_native/browser/gpuSettings.js @@ -0,0 +1,25 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.injectGpuSettingsBackend = injectGpuSettingsBackend; +// @ts-nocheck +/* eslint-disable */ +const electron = require('electron'); +const { + GPU_SETTINGS_SET_ENABLE_HWACCEL, + GPU_SETTINGS_GET_ENABLE_HWACCEL_SYNC +} = require('../common/constants').IPCEvents; +let injectedGpuSettings = null; +function injectGpuSettingsBackend(gpuSettings) { + injectedGpuSettings = gpuSettings; +} +electron.ipcMain.handle(GPU_SETTINGS_SET_ENABLE_HWACCEL, async (_, enable) => { + if (injectedGpuSettings) { + injectedGpuSettings.setEnableHardwareAcceleration(enable); + } +}); +electron.ipcMain.on(GPU_SETTINGS_GET_ENABLE_HWACCEL_SYNC, event => { + event.returnValue = injectedGpuSettings != null ? injectedGpuSettings.getEnableHardwareAcceleration() : false; +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/nativeModules.js b/core/src/app/discord_native/browser/nativeModules.js new file mode 100644 index 0000000..27213c9 --- /dev/null +++ b/core/src/app/discord_native/browser/nativeModules.js @@ -0,0 +1,97 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.injectModuleUpdater = injectModuleUpdater; +exports.injectUpdater = injectUpdater; +const childProcess = require('child_process'); +const electron = require('electron'); +const { + once +} = require('events'); +const path = require('path'); +const process = require('process'); +const { + getGlobalPaths +} = require('../../../common/nodeGlobalPaths'); +const { + NATIVE_MODULES_GET_PATHS, + NATIVE_MODULES_INSTALL, + NATIVE_MODULES_FINISH_UPDATER_BOOTSTRAP, + NATIVE_MODULES_GET_HAS_NEW_UPDATER +} = require('../common/constants').IPCEvents; +let injectedModuleUpdater = null; +let injectedUpdater = null; +function injectModuleUpdater(moduleUpdater) { + injectedModuleUpdater = moduleUpdater; +} +function injectUpdater(updater) { + injectedUpdater = updater; +} +electron.ipcMain.on(NATIVE_MODULES_GET_PATHS, event => { + event.returnValue = { + mainAppDirname: global.mainAppDirname, + browserModulePaths: getGlobalPaths() + }; +}); +async function newUpdaterInstall(updater, moduleName) { + try { + await updater.installModule(moduleName); + await updater.commitModules(); + } catch (e) { + throw new Error(`Failed to install ${moduleName}: ${e}`); + } +} +electron.ipcMain.handle(NATIVE_MODULES_INSTALL, async (_, moduleName) => { + var _injectedUpdater; + const newUpdater = (_injectedUpdater = injectedUpdater) === null || _injectedUpdater === void 0 ? void 0 : _injectedUpdater.getUpdater(); + if (newUpdater != null) { + return newUpdaterInstall(newUpdater, moduleName); + } + const updater = injectedModuleUpdater; + if (!updater) { + throw new Error('Module updater is not available!'); + } + const waitForInstall = new Promise((resolve, reject) => { + const installedHandler = installedModuleEvent => { + if (installedModuleEvent.name === moduleName) { + updater.events.removeListener(updater.INSTALLED_MODULE, installedHandler); + if (installedModuleEvent.succeeded) { + resolve(); + } else { + reject(new Error(`Failed to install ${moduleName}`)); + } + } + }; + updater.events.on(updater.INSTALLED_MODULE, installedHandler); + }); + updater.install(moduleName, false); + await waitForInstall; +}); +electron.ipcMain.on(NATIVE_MODULES_GET_HAS_NEW_UPDATER, event => { + var _injectedUpdater2; + event.returnValue = ((_injectedUpdater2 = injectedUpdater) === null || _injectedUpdater2 === void 0 ? void 0 : _injectedUpdater2.getUpdater()) != null; +}); + +// This endpoint is a bit special in the sense that it's exposed from +// discord_updater_bootstrap instead of discord_desktop_core. The reason for +// this is so that a malicious app can't pass in an arbitrary version number to +// launch. +electron.ipcMain.on(NATIVE_MODULES_FINISH_UPDATER_BOOTSTRAP, async (_, [major, minor, revision]) => { + // TODO(eiz): This code is currently duplicated between the updater and here + // due to bootstrapping reasons. I'd like to not have it be that way. + if (typeof major !== 'number' || typeof minor !== 'number' || typeof revision !== 'number') { + throw new Error('You tried.'); + } + const hostVersionStr = `${major}.${minor}.${revision}`; + const hostExePath = path.join(path.dirname(process.execPath), '..', `app-${hostVersionStr}`, path.basename(process.execPath)); + electron.app.once('will-quit', () => { + childProcess.spawn(hostExePath, [], { + detached: true, + stdio: 'inherit' + }); + }); + console.log(`Restarting from ${path.resolve(process.execPath)} to ${path.resolve(hostExePath)}`); + electron.app.quit(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/powerMonitor.js b/core/src/app/discord_native/browser/powerMonitor.js new file mode 100644 index 0000000..2f8f8b9 --- /dev/null +++ b/core/src/app/discord_native/browser/powerMonitor.js @@ -0,0 +1,33 @@ +"use strict"; + +const electron = require('electron'); +const { + POWER_MONITOR_RESUME, + POWER_MONITOR_SUSPEND, + POWER_MONITOR_LOCK_SCREEN, + POWER_MONITOR_UNLOCK_SCREEN, + POWER_MONITOR_GET_SYSTEM_IDLE_TIME +} = require('../common/constants').IPCEvents; +electron.ipcMain.handle(POWER_MONITOR_GET_SYSTEM_IDLE_TIME, async _ => { + return electron.powerMonitor.getSystemIdleTime() * 1000; +}); +function sendToAllWindows(channel) { + electron.BrowserWindow.getAllWindows().forEach(win => { + const contents = win.webContents; + if (contents != null) { + contents.send(channel); + } + }); +} +electron.powerMonitor.on('resume', () => { + sendToAllWindows(POWER_MONITOR_RESUME); +}); +electron.powerMonitor.on('suspend', () => { + sendToAllWindows(POWER_MONITOR_SUSPEND); +}); +electron.powerMonitor.on('lock-screen', () => { + sendToAllWindows(POWER_MONITOR_LOCK_SCREEN); +}); +electron.powerMonitor.on('unlock-screen', () => { + sendToAllWindows(POWER_MONITOR_UNLOCK_SCREEN); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/powerSaveBlocker.js b/core/src/app/discord_native/browser/powerSaveBlocker.js new file mode 100644 index 0000000..16aec1b --- /dev/null +++ b/core/src/app/discord_native/browser/powerSaveBlocker.js @@ -0,0 +1,25 @@ +"use strict"; + +const electron = require('electron'); +const { + POWER_SAVE_BLOCKER_BLOCK_DISPLAY_SLEEP, + POWER_SAVE_BLOCKER_UNBLOCK_DISPLAY_SLEEP, + POWER_SAVE_BLOCKER_CLEANUP_DISPLAY_SLEEP +} = require('../common/constants').IPCEvents; +const powerSaveBlockerIds = new Set(); +electron.ipcMain.handle(POWER_SAVE_BLOCKER_BLOCK_DISPLAY_SLEEP, async _ => { + const newId = electron.powerSaveBlocker.start('prevent-display-sleep'); + powerSaveBlockerIds.add(newId); + return newId; +}); +electron.ipcMain.handle(POWER_SAVE_BLOCKER_UNBLOCK_DISPLAY_SLEEP, async (_, id) => { + electron.powerSaveBlocker.stop(id); + powerSaveBlockerIds.delete(id); +}); +electron.ipcMain.handle(POWER_SAVE_BLOCKER_CLEANUP_DISPLAY_SLEEP, async _ => { + // cleanup all previous sleeps + for (const id of powerSaveBlockerIds) { + electron.powerSaveBlocker.stop(id); + } + powerSaveBlockerIds.clear(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/processUtils.js b/core/src/app/discord_native/browser/processUtils.js new file mode 100644 index 0000000..c9bfddf --- /dev/null +++ b/core/src/app/discord_native/browser/processUtils.js @@ -0,0 +1,80 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.processUtilsSettings = void 0; +var _electron = _interopRequireDefault(require("electron")); +var _os = _interopRequireDefault(require("os")); +var _process = _interopRequireDefault(require("process")); +var _systeminformation = _interopRequireDefault(require("systeminformation")); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// Since crashes normally happen inside of the renderer process, we can store crash information inside of the +// browser/main process, and report it back after the next startup. +// lastRunsStoredInformation is set from currentStoredInformation, and currentStoredInformation is cleared on startup. +const processUtilsSettings = { + rendererCrashReason: null, + rendererCrashExitCode: null, + lastRunsStoredInformation: {}, + currentStoredInformation: {} +}; +exports.processUtilsSettings = processUtilsSettings; +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_CPU_USAGE, _ => { + let totalProcessorUsagePercent = 0.0; + for (const processMetric of _electron.default.app.getAppMetrics()) { + totalProcessorUsagePercent += processMetric.cpu.percentCPUUsage; + } + return Promise.resolve(totalProcessorUsagePercent); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_LAST_CRASH, _ => { + return Promise.resolve({ + ..._electron.default.crashReporter.getLastCrashReport(), + rendererCrashReason: processUtilsSettings.rendererCrashReason, + rendererCrashExitCode: processUtilsSettings.rendererCrashExitCode, + storedInformation: processUtilsSettings.lastRunsStoredInformation + }); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_MEMORY_INFO, _ => { + return _process.default.getProcessMemoryInfo(); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_SYSTEM_INFO, async _ => { + const gpuInfo = await _systeminformation.default.graphics(); + return { + cpus: _os.default.cpus().map(cpu => ({ + model: cpu.model, + speed: cpu.speed + })), + gpus: gpuInfo.controllers.map(({ + model, + vendor, + vram + }) => ({ + model, + vendor, + memory: vram ?? -1 + })), + total_memory: _os.default.totalmem() + }; +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_FLUSH_DNS_CACHE, _ => { + const defaultSession = _electron.default.session.defaultSession; + if (defaultSession != null && defaultSession.clearHostResolverCache != null) { + defaultSession.clearHostResolverCache(); + } + return Promise.resolve(); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_FLUSH_COOKIES, _ => { + return _electron.default.session.defaultSession.cookies.flushStore(); +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_FLUSH_STORAGE_DATA, _ => { + _electron.default.session.defaultSession.flushStorageData(); + return Promise.resolve(); +}); +_DiscordIPC.DiscordIPC.main.on(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_MAIN_ARGV_SYNC, event => { + event.returnValue = _process.default.argv; +}); +_DiscordIPC.DiscordIPC.main.handle(_DiscordIPC.IPCEvents.PROCESS_UTILS_SET_CRASH_INFORMATION, (_, crashInformation, state) => { + processUtilsSettings.currentStoredInformation[crashInformation] = state; + return Promise.resolve(); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/safeStorage.js b/core/src/app/discord_native/browser/safeStorage.js new file mode 100644 index 0000000..3fdd8fd --- /dev/null +++ b/core/src/app/discord_native/browser/safeStorage.js @@ -0,0 +1,29 @@ +"use strict"; + +const electron = require('electron'); +const { + SAFE_STORAGE_IS_ENCRYPTION_AVAILABLE, + SAFE_STORAGE_ENCRYPT_STRING, + SAFE_STORAGE_DECRYPT_STRING +} = require('../common/constants').IPCEvents; +electron.ipcMain.on(SAFE_STORAGE_IS_ENCRYPTION_AVAILABLE, event => { + event.returnValue = electron.safeStorage != null && electron.safeStorage.isEncryptionAvailable(); +}); +electron.ipcMain.on(SAFE_STORAGE_ENCRYPT_STRING, (event, plainText) => { + if (plainText) { + event.returnValue = electron.safeStorage.encryptString(plainText).toString('base64'); + } else { + event.returnValue = null; + } +}); +electron.ipcMain.on(SAFE_STORAGE_DECRYPT_STRING, (event, encrypted) => { + if (encrypted) { + try { + event.returnValue = electron.safeStorage.decryptString(Buffer.from(encrypted, 'base64')); + } catch { + event.returnValue = null; + } + } else { + event.returnValue = null; + } +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/settings.js b/core/src/app/discord_native/browser/settings.js new file mode 100644 index 0000000..2240772 --- /dev/null +++ b/core/src/app/discord_native/browser/settings.js @@ -0,0 +1,36 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.injectSettingsBackend = injectSettingsBackend; +const electron = require('electron'); +const { + SETTINGS_GET, + SETTINGS_SET, + SETTINGS_GET_SYNC +} = require('../common/constants').IPCEvents; +let injectedSettings = null; +function getSettings() { + return injectedSettings != null ? injectedSettings : { + get: () => {}, + set: () => {}, + save: () => {} + }; +} +function injectSettingsBackend(settings) { + injectedSettings = settings; +} +electron.ipcMain.handle(SETTINGS_GET, (_, name, defaultValue) => { + const settings = getSettings(); + return settings.get(name, defaultValue); +}); +electron.ipcMain.handle(SETTINGS_SET, (_, name, value) => { + const settings = getSettings(); + settings.set(name, value); + settings.save(); +}); +electron.ipcMain.on(SETTINGS_GET_SYNC, (event, name, defaultValue) => { + const settings = getSettings(); + event.returnValue = settings.get(name, defaultValue); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/spellCheck.js b/core/src/app/discord_native/browser/spellCheck.js new file mode 100644 index 0000000..5448848 --- /dev/null +++ b/core/src/app/discord_native/browser/spellCheck.js @@ -0,0 +1,39 @@ +"use strict"; + +const electron = require('electron'); +const { + SPELLCHECK_REPLACE_MISSPELLING, + SPELLCHECK_GET_AVAILABLE_DICTIONARIES, + SPELLCHECK_SET_LOCALE, + SPELLCHECK_SET_LEARNED_WORDS +} = require('../common/constants').IPCEvents; +let _learnedWords = new Set(); +let _hasLoadedLearnedWords = false; +electron.ipcMain.handle(SPELLCHECK_REPLACE_MISSPELLING, async (event, correction) => { + event.sender.replaceMisspelling(correction); +}); +electron.ipcMain.handle(SPELLCHECK_GET_AVAILABLE_DICTIONARIES, async _ => { + return electron.session.defaultSession.availableSpellCheckerLanguages; +}); +electron.ipcMain.handle(SPELLCHECK_SET_LOCALE, async (_, locale) => { + electron.session.defaultSession.setSpellCheckerLanguages([locale]); +}); +electron.ipcMain.handle(SPELLCHECK_SET_LEARNED_WORDS, async (_, newLearnedWords) => { + const session = electron.session.defaultSession; + if (!_hasLoadedLearnedWords) { + const dictionaryContents = await session.listWordsInSpellCheckerDictionary(); + _learnedWords = new Set(dictionaryContents); + _hasLoadedLearnedWords = true; + } + _learnedWords.forEach(word => { + if (!newLearnedWords.has(word)) { + session.removeWordFromSpellCheckerDictionary(word); + } + }); + newLearnedWords.forEach(word => { + if (!_learnedWords.has(word)) { + session.addWordToSpellCheckerDictionary(word); + } + }); + _learnedWords = new Set(newLearnedWords); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/userDataCache.js b/core/src/app/discord_native/browser/userDataCache.js new file mode 100644 index 0000000..f321a89 --- /dev/null +++ b/core/src/app/discord_native/browser/userDataCache.js @@ -0,0 +1,54 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _fs = _interopRequireDefault(require("fs")); +var _path = _interopRequireDefault(require("path")); +var _appFeatures = require("../../appFeatures"); +var _paths = require("../../bootstrapModules/paths"); +var _constants = require("../common/constants"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const { + USER_DATA_CACHE_SAVE, + USER_DATA_CACHE_GET, + USER_DATA_CACHE_DELETE +} = _constants.IPCEvents; +const features = (0, _appFeatures.getFeatures)(); +function getCachePath() { + return _path.default.join(_paths.paths.getUserData(), 'userDataCache.json'); +} +function getMigratedPath() { + return _path.default.join(_paths.paths.getUserData(), 'domainMigrated'); +} +function cacheUserData(userData) { + _fs.default.writeFile(getCachePath(), userData, e => { + if (e) { + console.warn('Failed updating user data cache with error: ', e); + } + }); +} +function getCachedUserData() { + try { + return JSON.parse(_fs.default.readFileSync(getCachePath())); + } catch (_err) {} + return null; +} +function deleteCachedUserData() { + try { + _fs.default.unlinkSync(getCachePath()); + _fs.default.writeFile(getMigratedPath(), '', e => { + if (e) { + console.warn('Failed to create domainMigrated file with error: ', e); + } + }); + } catch (_err) {} +} +_electron.default.ipcMain.handle(USER_DATA_CACHE_GET, () => { + return getCachedUserData(); +}); +_electron.default.ipcMain.on(USER_DATA_CACHE_SAVE, (_event, userData) => { + cacheUserData(userData); +}); +_electron.default.ipcMain.on(USER_DATA_CACHE_DELETE, _event => { + deleteCachedUserData(); +}); +features.declareSupported('user_data_cache'); \ No newline at end of file diff --git a/core/src/app/discord_native/browser/window.js b/core/src/app/discord_native/browser/window.js new file mode 100644 index 0000000..f1ca8ca --- /dev/null +++ b/core/src/app/discord_native/browser/window.js @@ -0,0 +1,97 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.injectGetWindow = injectGetWindow; +const electron = require('electron'); +const process = require('process'); +const { + WINDOW_BLUR, + WINDOW_CLOSE, + WINDOW_FOCUS, + WINDOW_MAXIMIZE, + WINDOW_MINIMIZE, + WINDOW_RESTORE, + WINDOW_FLASH_FRAME, + WINDOW_TOGGLE_FULLSCREEN, + WINDOW_SET_BACKGROUND_THROTTLING, + WINDOW_SET_PROGRESS_BAR, + WINDOW_IS_ALWAYS_ON_TOP, + WINDOW_SET_ALWAYS_ON_TOP +} = require('../common/constants').IPCEvents; +let injectedGetWindow = _key => { + return null; +}; +function injectGetWindow(getWindow) { + injectedGetWindow = getWindow; +} +electron.ipcMain.handle(WINDOW_FLASH_FRAME, async (_, flag) => { + const currentWindow = injectedGetWindow(); + if (currentWindow == null || currentWindow.flashFrame == null) return; + currentWindow.flashFrame(!currentWindow.isFocused() && flag); +}); +electron.ipcMain.handle(WINDOW_MINIMIZE, async (_, key) => { + const win = injectedGetWindow(key); + if (win == null) return; + win.minimize(); +}); +electron.ipcMain.handle(WINDOW_RESTORE, async (_, key) => { + const win = injectedGetWindow(key); + if (win == null) return; + win.restore(); +}); +electron.ipcMain.handle(WINDOW_MAXIMIZE, async (_, key) => { + const win = injectedGetWindow(key); + if (win == null) return; + if (win.isMaximized()) { + win.unmaximize(); + } else { + win.maximize(); + } +}); +electron.ipcMain.handle(WINDOW_FOCUS, async (_, key) => { + const win = injectedGetWindow(key); + if (win == null) return; + win.show(); + win.setSkipTaskbar(false); +}); +electron.ipcMain.handle(WINDOW_SET_ALWAYS_ON_TOP, async (_, key, enabled) => { + const win = injectedGetWindow(key); + if (win == null) return; + win.setAlwaysOnTop(enabled); +}); +electron.ipcMain.handle(WINDOW_IS_ALWAYS_ON_TOP, async (_, key) => { + const win = injectedGetWindow(key); + if (win == null) return false; + return win.isAlwaysOnTop(); +}); +electron.ipcMain.handle(WINDOW_BLUR, async (_, key) => { + const win = injectedGetWindow(key); + if (win != null && !win.isDestroyed()) { + win.blur(); + } +}); +electron.ipcMain.handle(WINDOW_SET_PROGRESS_BAR, async (_, key, progress) => { + const win = injectedGetWindow(key); + if (win == null) return; + win.setProgressBar(progress); +}); +electron.ipcMain.handle(WINDOW_TOGGLE_FULLSCREEN, async (_, key) => { + const currentWindow = injectedGetWindow(key); + currentWindow.setFullScreen(!currentWindow.isFullScreen()); +}); +electron.ipcMain.handle(WINDOW_CLOSE, async (_, key) => { + if (key == null && process.platform === 'darwin') { + electron.Menu.sendActionToFirstResponder('hide:'); + } else { + const win = injectedGetWindow(key); + if (win == null) return; + win.close(); + } +}); +electron.ipcMain.handle(WINDOW_SET_BACKGROUND_THROTTLING, async (_, enabled) => { + const win = injectedGetWindow(); + if (win == null) return; + win.webContents.setBackgroundThrottling(enabled); +}); \ No newline at end of file diff --git a/core/src/app/discord_native/common/DiscordIPC.js b/core/src/app/discord_native/common/DiscordIPC.js new file mode 100644 index 0000000..d34274c --- /dev/null +++ b/core/src/app/discord_native/common/DiscordIPC.js @@ -0,0 +1,62 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.DiscordIPC = void 0; +Object.defineProperty(exports, "IPCEvents", { + enumerable: true, + get: function () { + return _constants.IPCEvents; + } +}); +var _electron = _interopRequireDefault(require("electron")); +var _constants = require("./constants"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable prefer-spread */ + +// Save people from needing two imports. + +class DiscordMainIPC { + /** + * For handling sync events. + */ + + static on(channel, listener) { + _electron.default.ipcMain.on(channel, (...args) => { + return listener.apply(this, args); + }); + } + + /** + * For handling async events. + */ + + static handle(channel, listener) { + return _electron.default.ipcMain.handle(channel, (...args) => { + return listener.apply(this, args); + }); + } +} +class DiscordRendererIPC { + /** + * For sending sync events. + */ + + static sendSync(...args) { + return _electron.default.ipcRenderer.sendSync.apply(_electron.default.ipcRenderer, args); + } + + /** + * For sending async events. + */ + + static invoke(...args) { + return _electron.default.ipcRenderer.invoke.apply(_electron.default.ipcRenderer, args); + } +} +const DiscordIPC = { + main: DiscordMainIPC, + renderer: DiscordRendererIPC +}; +exports.DiscordIPC = DiscordIPC; \ No newline at end of file diff --git a/core/src/app/discord_native/common/constants.js b/core/src/app/discord_native/common/constants.js new file mode 100644 index 0000000..80458ca --- /dev/null +++ b/core/src/app/discord_native/common/constants.js @@ -0,0 +1,116 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.IPCEvents = void 0; +exports.getDiscordIPCEvent = getDiscordIPCEvent; +const discordPrefixRegex = /^DISCORD_/; +function getDiscordIPCEvent(ev) { + return discordPrefixRegex.test(ev) ? ev : `DISCORD_${ev}`; +} + +// Namespace all event names with DISCORD_ +let IPCEvents; +exports.IPCEvents = IPCEvents; +(function (IPCEvents) { + IPCEvents["ACCESSIBILITY_GET_ENABLED"] = "DISCORD_ACCESSIBILITY_GET_ENABLED"; + IPCEvents["APP_BADGE_SET"] = "DISCORD_APP_BADGE_SET"; + IPCEvents["APP_GET_RELEASE_CHANNEL_SYNC"] = "DISCORD_APP_GET_RELEASE_CHANNEL_SYNC"; + IPCEvents["APP_GET_HOST_VERSION_SYNC"] = "DISCORD_APP_GET_HOST_VERSION_SYNC"; + IPCEvents["APP_GET_BUILD_NUMBER"] = "DISCORD_APP_GET_BUILD_NUMBER"; + IPCEvents["APP_GET_MODULE_VERSIONS"] = "DISCORD_APP_GET_MODULE_VERSIONS"; + IPCEvents["APP_GET_PATH"] = "DISCORD_APP_GET_PATH"; + IPCEvents["APP_SET_BADGE_COUNT"] = "DISCORD_APP_SET_BADGE_COUNT"; + IPCEvents["APP_DOCK_SET_BADGE"] = "DISCORD_APP_DOCK_SET_BADGE"; + IPCEvents["APP_DOCK_BOUNCE"] = "DISCORD_APP_DOCK_BOUNCE"; + IPCEvents["APP_DOCK_CANCEL_BOUNCE"] = "DISCORD_APP_DOCK_CANCEL_BOUNCE"; + IPCEvents["APP_RELAUNCH"] = "DISCORD_APP_RELAUNCH"; + IPCEvents["APP_GET_DEFAULT_DOUBLE_CLICK_ACTION"] = "DISCORD_APP_GET_DEFAULT_DOUBLE_CLICK_ACTION"; + IPCEvents["CLIPBOARD_COPY"] = "DISCORD_CLIPBOARD_COPY"; + IPCEvents["CLIPBOARD_CUT"] = "DISCORD_CLIPBOARD_CUT"; + IPCEvents["CLIPBOARD_PASTE"] = "DISCORD_CLIPBOARD_PASTE"; + IPCEvents["LOAD_CLIP"] = "DISCORD_LOAD_CLIP"; + IPCEvents["LOAD_CLIPS_DIRECTORY"] = "DISCORD_LOAD_CLIPS_DIRECTORY"; + IPCEvents["DELETE_CLIP"] = "DISCORD_DELETE_CLIP"; + IPCEvents["CHECK_FOR_UPDATES"] = "DISCORD_CHECK_FOR_UPDATES"; + IPCEvents["DESKTOP_CAPTURER_GET_SOURCES"] = "DISCORD_DESKTOP_CAPTURER_GET_SOURCES"; + IPCEvents["CONSTANTS_GET"] = "DISCORD_CONSTANTS_GET"; + IPCEvents["CRASH_REPORTER_UPDATE_METADATA"] = "DISCORD_CRASH_REPORTER_UPDATE_METADATA"; + IPCEvents["FEATURES_GET_BROWSER_FEATURES"] = "DISCORD_FEATURES_GET_BROWSER_FEATURES"; + IPCEvents["FILE_MANAGER_GET_MODULE_PATH"] = "DISCORD_FILE_MANAGER_GET_MODULE_PATH"; + IPCEvents["FILE_MANAGER_GET_MODULE_DATA_PATH_SYNC"] = "DISCORD_FILE_MANAGER_GET_MODULE_DATA_PATH_SYNC"; + IPCEvents["FILE_MANAGER_SHOW_SAVE_DIALOG"] = "DISCORD_FILE_MANAGER_SHOW_SAVE_DIALOG"; + IPCEvents["FILE_MANAGER_SHOW_OPEN_DIALOG"] = "DISCORD_FILE_MANAGER_SHOW_OPEN_DIALOG"; + IPCEvents["FILE_MANAGER_SHOW_ITEM_IN_FOLDER"] = "DISCORD_FILE_MANAGER_SHOW_ITEM_IN_FOLDER"; + IPCEvents["GPU_SETTINGS_SET_ENABLE_HWACCEL"] = "DISCORD_GPU_SETTINGS_SET_ENABLE_HWACCEL"; + IPCEvents["GPU_SETTINGS_GET_ENABLE_HWACCEL_SYNC"] = "DISCORD_GPU_SETTINGS_GET_ENABLE_HWACCEL_SYNC"; + IPCEvents["NATIVE_MODULES_GET_PATHS"] = "DISCORD_NATIVE_MODULES_GET_PATHS"; + IPCEvents["NATIVE_MODULES_INSTALL"] = "DISCORD_NATIVE_MODULES_INSTALL"; + IPCEvents["NATIVE_MODULES_FINISH_UPDATER_BOOTSTRAP"] = "DISCORD_NATIVE_MODULES_FINISH_UPDATER_BOOTSTRAP"; + IPCEvents["NATIVE_MODULES_GET_HAS_NEW_UPDATER"] = "DISCORD_NATIVE_MODULES_GET_HAS_NEW_UPDATER"; + IPCEvents["NOTIFICATION_CLOSE"] = "DISCORD_NOTIFICATION_CLOSE"; + IPCEvents["NOTIFICATION_SHOW"] = "DISCORD_NOTIFICATION_SHOW"; + IPCEvents["NOTIFICATIONS_CLEAR"] = "DISCORD_NOTIFICATIONS_CLEAR"; + IPCEvents["OPEN_EXTERNAL_URL"] = "DISCORD_OPEN_EXTERNAL_URL"; + IPCEvents["GLOBAL_OVERLAY_OPEN"] = "DISCORD_GLOBAL_OVERLAY_OPEN"; + IPCEvents["POWER_MONITOR_RESUME"] = "DISCORD_POWER_MONITOR_RESUME"; + IPCEvents["POWER_MONITOR_SUSPEND"] = "DISCORD_POWER_MONITOR_SUSPEND"; + IPCEvents["POWER_MONITOR_LOCK_SCREEN"] = "DISCORD_POWER_MONITOR_LOCK_SCREEN"; + IPCEvents["POWER_MONITOR_UNLOCK_SCREEN"] = "DISCORD_POWER_MONITOR_UNLOCK_SCREEN"; + IPCEvents["POWER_MONITOR_GET_SYSTEM_IDLE_TIME"] = "DISCORD_POWER_MONITOR_GET_SYSTEM_IDLE_TIME"; + IPCEvents["POWER_SAVE_BLOCKER_BLOCK_DISPLAY_SLEEP"] = "DISCORD_POWER_SAVE_BLOCKER_BLOCK_DISPLAY_SLEEP"; + IPCEvents["POWER_SAVE_BLOCKER_UNBLOCK_DISPLAY_SLEEP"] = "DISCORD_POWER_SAVE_BLOCKER_UNBLOCK_DISPLAY_SLEEP"; + IPCEvents["POWER_SAVE_BLOCKER_CLEANUP_DISPLAY_SLEEP"] = "DISCORD_POWER_SAVE_BLOCKER_CLEANUP_DISPLAY_SLEEP"; + IPCEvents["PROCESS_UTILS_GET_CPU_USAGE"] = "DISCORD_PROCESS_UTILS_GET_CPU_USAGE"; + IPCEvents["PROCESS_UTILS_GET_MEMORY_INFO"] = "DISCORD_PROCESS_UTILS_GET_MEMORY_INFO"; + IPCEvents["PROCESS_UTILS_FLUSH_DNS_CACHE"] = "DISCORD_PROCESS_UTILS_FLUSH_DNS_CACHE"; + IPCEvents["PROCESS_UTILS_FLUSH_COOKIES"] = "DISCORD_PROCESS_UTILS_FLUSH_COOKIES"; + IPCEvents["PROCESS_UTILS_FLUSH_STORAGE_DATA"] = "DISCORD_PROCESS_UTILS_FLUSH_STORAGE_DATA"; + IPCEvents["PROCESS_UTILS_GET_MAIN_ARGV_SYNC"] = "DISCORD_PROCESS_UTILS_GET_MAIN_ARGV_SYNC"; + IPCEvents["PROCESS_UTILS_GET_LAST_CRASH"] = "DISCORD_PROCESS_UTILS_GET_LAST_CRASH"; + IPCEvents["PROCESS_UTILS_SET_CRASH_INFORMATION"] = "DISCORD_PROCESS_UTILS_SET_CRASH_INFORMATION"; + IPCEvents["PROCESS_UTILS_GET_SYSTEM_INFO"] = "DISCORD_PROCESS_UTILS_GET_SYSTEM_INFO"; + IPCEvents["QUIT_AND_INSTALL"] = "DISCORD_QUIT_AND_INSTALL"; + IPCEvents["SAFE_STORAGE_DECRYPT_STRING"] = "DISCORD_SAFE_STORAGE_DECRYPT_STRING"; + IPCEvents["SAFE_STORAGE_ENCRYPT_STRING"] = "DISCORD_SAFE_STORAGE_ENCRYPT_STRING"; + IPCEvents["SAFE_STORAGE_IS_ENCRYPTION_AVAILABLE"] = "DISCORD_SAFE_STORAGE_IS_ENCRYPTION_AVAILABLE"; + IPCEvents["SETTINGS_GET"] = "DISCORD_SETTINGS_GET"; + IPCEvents["SETTINGS_SET"] = "DISCORD_SETTINGS_SET"; + IPCEvents["SETTINGS_GET_SYNC"] = "DISCORD_SETTINGS_GET_SYNC"; + IPCEvents["SETTINGS_UPDATE_BACKGROUND_COLOR"] = "DISCORD_SETTINGS_UPDATE_BACKGROUND_COLOR"; + IPCEvents["SPELLCHECK_RESULT"] = "DISCORD_SPELLCHECK_RESULT"; + IPCEvents["SPELLCHECK_REPLACE_MISSPELLING"] = "DISCORD_SPELLCHECK_REPLACE_MISSPELLING"; + IPCEvents["SPELLCHECK_GET_AVAILABLE_DICTIONARIES"] = "DISCORD_SPELLCHECK_GET_AVAILABLE_DICTIONARIES"; + IPCEvents["SPELLCHECK_SET_LOCALE"] = "DISCORD_SPELLCHECK_SET_LOCALE"; + IPCEvents["SPELLCHECK_SET_LEARNED_WORDS"] = "DISCORD_SPELLCHECK_SET_LEARNED_WORDS"; + IPCEvents["SYSTEM_TRAY_SET_ICON"] = "DISCORD_SYSTEM_TRAY_SET_ICON"; + IPCEvents["SYSTEM_TRAY_SET_APPLICATIONS"] = "DISCORD_SYSTEM_TRAY_SET_APPLICATIONS"; + IPCEvents["THUMBAR_BUTTONS_UPDATE"] = "DISCORD_THUMBAR_BUTTONS_UPDATE"; + IPCEvents["THUMBAR_BUTTONS_CLICKED"] = "DISCORD_THUMBAR_BUTTONS_CLICKED"; + IPCEvents["TOGGLE_MINIMIZE_TO_TRAY"] = "DISCORD_TOGGLE_MINIMIZE_TO_TRAY"; + IPCEvents["TOGGLE_OPEN_ON_STARTUP"] = "DISCORD_TOGGLE_OPEN_ON_STARTUP"; + IPCEvents["TOGGLE_START_MINIMIZED"] = "DISCORD_TOGGLE_START_MINIMIZED"; + IPCEvents["UPDATE_OPEN_ON_STARTUP"] = "DISCORD_UPDATE_OPEN_ON_STARTUP"; + IPCEvents["UNHANDLED_JS_EXCEPTION"] = "DISCORD_UNHANDLED_JS_EXCEPTION"; + IPCEvents["UPDATER_HISTORY_QUERY_AND_TRUNCATE"] = "DISCORD_UPDATER_HISTORY_QUERY_AND_TRUNCATE"; + IPCEvents["UPDATED_QUOTES"] = "DISCORD_UPDATED_QUOTES"; + IPCEvents["USER_DATA_CACHE_DELETE"] = "DISCORD_USER_DATA_CACHE_DELETE"; + IPCEvents["USER_DATA_CACHE_GET"] = "DISCORD_USER_DATA_CACHE_GET"; + IPCEvents["USER_DATA_CACHE_SAVE"] = "DISCORD_USER_DATA_CACHE_SAVE"; + IPCEvents["WINDOW_BLUR"] = "DISCORD_WINDOW_BLUR"; + IPCEvents["WINDOW_CLOSE"] = "DISCORD_WINDOW_CLOSE"; + IPCEvents["WINDOW_FOCUS"] = "DISCORD_WINDOW_FOCUS"; + IPCEvents["WINDOW_MAXIMIZE"] = "DISCORD_WINDOW_MAXIMIZE"; + IPCEvents["WINDOW_MINIMIZE"] = "DISCORD_WINDOW_MINIMIZE"; + IPCEvents["WINDOW_RESTORE"] = "DISCORD_WINDOW_RESTORE"; + IPCEvents["WINDOW_FLASH_FRAME"] = "DISCORD_WINDOW_FLASH_FRAME"; + IPCEvents["WINDOW_TOGGLE_FULLSCREEN"] = "DISCORD_WINDOW_TOGGLE_FULLSCREEN"; + IPCEvents["WINDOW_SET_BACKGROUND_THROTTLING"] = "DISCORD_WINDOW_SET_BACKGROUND_THROTTLING"; + IPCEvents["WINDOW_SET_PROGRESS_BAR"] = "DISCORD_WINDOW_SET_PROGRESS_BAR"; + IPCEvents["WINDOW_IS_ALWAYS_ON_TOP"] = "DISCORD_WINDOW_IS_ALWAYS_ON_TOP"; + IPCEvents["WINDOW_SET_ALWAYS_ON_TOP"] = "DISCORD_WINDOW_SET_ALWAYS_ON_TOP"; + IPCEvents["WINDOW_DEVTOOLS_OPENED"] = "DISCORD_WINDOW_DEVTOOLS_OPENED"; + IPCEvents["WINDOW_DEVTOOLS_CLOSED"] = "DISCORD_WINDOW_DEVTOOLS_CLOSED"; + IPCEvents["GET_MOUSE_COORDINATES"] = "DISCORD_GET_MOUSE_COORDINATES"; +})(IPCEvents || (exports.IPCEvents = IPCEvents = {})); \ No newline at end of file diff --git a/core/src/app/discord_native/common/fileutils.js b/core/src/app/discord_native/common/fileutils.js new file mode 100644 index 0000000..ececa18 --- /dev/null +++ b/core/src/app/discord_native/common/fileutils.js @@ -0,0 +1,105 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "basename", { + enumerable: true, + get: function () { + return _path.basename; + } +}); +exports.deleteFile = deleteFile; +Object.defineProperty(exports, "dirname", { + enumerable: true, + get: function () { + return _path.dirname; + } +}); +Object.defineProperty(exports, "extname", { + enumerable: true, + get: function () { + return _path.extname; + } +}); +exports.getFilesnamesFromDirectory = getFilesnamesFromDirectory; +Object.defineProperty(exports, "join", { + enumerable: true, + get: function () { + return _path.join; + } +}); +exports.readFiles = readFiles; +exports.readFulfilledFiles = readFulfilledFiles; +var _buffer = _interopRequireDefault(require("buffer")); +var _originalFs = _interopRequireDefault(require("original-fs")); +var _path = _interopRequireWildcard(require("path")); +var _util = _interopRequireDefault(require("util")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable no-console */ + +// eslint-disable-line import/no-unresolved + +// Reason for original-fs being import/no-unresolved: https://github.com/discord/discord/pull/74159#discussion_r893733771 + +const MAX_LENGTH = _buffer.default.constants.MAX_LENGTH; +const promiseFs = { + readdir: _util.default.promisify(_originalFs.default.readdir), + open: _util.default.promisify(_originalFs.default.open), + fstat: _util.default.promisify(_originalFs.default.fstat), + stat: _util.default.promisify(_originalFs.default.stat), + unlink: _util.default.promisify(_originalFs.default.unlink), + read: _util.default.promisify(_originalFs.default.read), + close: _util.default.promisify(_originalFs.default.close) +}; + +// Perform `readFiles` but only return `fulfilled` results. +// If [orException] is set, exception if any of the results were rejected. +async function readFulfilledFiles(filenames, maxSize, orException) { + const files = await readFiles(filenames, maxSize); + if (orException) { + files.forEach(result => { + if (result.status === 'rejected') { + throw result.reason; + } + }); + } + return files.filter(result => result.status === 'fulfilled').map(result => result.value); +} +function readFiles(filenames, maxSize) { + maxSize = Math.min(maxSize, MAX_LENGTH); + return Promise.allSettled(filenames.map(async filename => { + const handle = await promiseFs.open(filename, 'r'); + try { + const stats = await promiseFs.fstat(handle); + if (maxSize != null && stats.size > maxSize) { + // Used to help determine why openFiles failed. + // Cannot use an error here because context bridge will remove the code field. + // eslint-disable-next-line no-throw-literal + throw { + code: 'ETOOLARGE', + message: 'upload too large', + filesize: stats.size, + maxSize + }; + } + const buffer = Buffer.alloc(stats.size); + const data = await promiseFs.read(handle, buffer, 0, stats.size, 0); + return { + data: data.buffer.slice(0, data.bytesRead), + filename: _path.default.basename(filename) + }; + } finally { + promiseFs.close(handle); // No reason to await? + } + })); +} + +function getFilesnamesFromDirectory(path) { + return promiseFs.readdir(path); +} +function deleteFile(filename) { + return promiseFs.unlink(filename); +} \ No newline at end of file diff --git a/core/src/app/discord_native/common/paths.js b/core/src/app/discord_native/common/paths.js new file mode 100644 index 0000000..b8fcf84 --- /dev/null +++ b/core/src/app/discord_native/common/paths.js @@ -0,0 +1,53 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getCrashFiles = getCrashFiles; +exports.getPath = getPath; +var _electron = _interopRequireDefault(require("electron")); +var _fs = _interopRequireDefault(require("fs")); +var _originalFs = _interopRequireDefault(require("original-fs")); +var _path = _interopRequireDefault(require("path")); +var _util = _interopRequireDefault(require("util")); +var _processUtils = require("../../../common/processUtils"); +var _constants = require("../common/constants"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const allowedAppPaths = new Set(['home', 'appData', 'desktop', 'documents', 'downloads', 'crashDumps']); +const readdir = _util.default.promisify(_fs.default.readdir); +async function getPath(path) { + if (!allowedAppPaths.has(path)) { + throw new Error(`${path} is not an allowed app path`); + } + return _electron.default.ipcRenderer.invoke(_constants.IPCEvents.APP_GET_PATH, path); +} +function getTimes(filenames) { + return Promise.allSettled(filenames.map(filename => new Promise((resolve, reject) => { + _originalFs.default.stat(filename, (err, stats) => { + if (err) { + return reject(err); + } + if (!stats.isFile()) { + return reject(new Error('Not a file')); + } + return resolve({ + filename, + mtime: stats.mtime + }); + }); + }))); +} +async function orderedFiles(folder) { + try { + const filenames = await readdir(folder); + const times = await getTimes(filenames.map(filename => _path.default.join(folder, filename))); + return times.filter(result => result.status === 'fulfilled').map(result => result.value).sort((a, b) => b.mtime.getTime() - a.mtime.getTime()).map(a => a.filename); + } catch (err) { + return []; + } +} +async function getCrashFiles() { + const crashBaseFolder = await getPath('crashDumps'); + const crashFolder = _processUtils.IS_WIN ? _path.default.join(crashBaseFolder, 'reports') : _path.default.join(crashBaseFolder, 'completed'); + return orderedFiles(crashFolder); +} \ No newline at end of file diff --git a/core/src/app/discord_native/common/utils.js b/core/src/app/discord_native/common/utils.js new file mode 100644 index 0000000..bd70f96 --- /dev/null +++ b/core/src/app/discord_native/common/utils.js @@ -0,0 +1,17 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isNotNullish = isNotNullish; +/** + * This function is primarly useful to type-erase the `null | undefined` in + * filter statements, allowing you to write more ergonomic code down-the-line. + * + * Usage: + * + * values.filter(isNotNullish).map(v => v.toFoo()); + */ +function isNotNullish(value) { + return value != null; +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/accessibility.js b/core/src/app/discord_native/renderer/accessibility.js new file mode 100644 index 0000000..4102199 --- /dev/null +++ b/core/src/app/discord_native/renderer/accessibility.js @@ -0,0 +1,9 @@ +"use strict"; + +var _DiscordIPC = require("../common/DiscordIPC"); +function isAccessibilitySupportEnabled() { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.ACCESSIBILITY_GET_ENABLED); +} +module.exports = { + isAccessibilitySupportEnabled +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/app.js b/core/src/app/discord_native/renderer/app.js new file mode 100644 index 0000000..76cad63 --- /dev/null +++ b/core/src/app/discord_native/renderer/app.js @@ -0,0 +1,90 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _DiscordIPC = require("../common/DiscordIPC"); +var _paths = require("../common/paths"); +var _crashReporter = require("./crashReporter"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const releaseChannel = _DiscordIPC.DiscordIPC.renderer.sendSync(_DiscordIPC.IPCEvents.APP_GET_RELEASE_CHANNEL_SYNC); +const hostVersion = _DiscordIPC.DiscordIPC.renderer.sendSync(_DiscordIPC.IPCEvents.APP_GET_HOST_VERSION_SYNC); +const buildNumber = _DiscordIPC.DiscordIPC.renderer.sendSync(_DiscordIPC.IPCEvents.APP_GET_BUILD_NUMBER); +(0, _crashReporter.updateCrashReporter)({ + nativeBuildNumber: (buildNumber === null || buildNumber === void 0 ? void 0 : buildNumber.toString()) ?? 'null' +}); +let moduleVersions = {}; +_DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_GET_MODULE_VERSIONS).then(versions => { + moduleVersions = versions; +}); + +// TODO: Fix this .on to be part of our typing. +_electron.default.ipcRenderer.on('DISCORD_MODULE_INSTALLED', async _ => { + moduleVersions = await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_GET_MODULE_VERSIONS); +}); +function getReleaseChannel() { + return releaseChannel; +} +function getVersion() { + return hostVersion; +} +function getBuildNumber() { + return buildNumber; +} +function getModuleVersions() { + return moduleVersions; +} +function setBadgeCount(count) { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_SET_BADGE_COUNT, count); + return Promise.resolve(); +} +function dockSetBadge(badge) { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_DOCK_SET_BADGE, badge); + return Promise.resolve(); +} +function dockBounce(type) { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_DOCK_BOUNCE, type); + return Promise.resolve(); +} +function dockCancelBounce(id) { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_DOCK_CANCEL_BOUNCE, id); + return Promise.resolve(); +} +function relaunch() { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_RELAUNCH); + return Promise.resolve(); +} +function getDefaultDoubleClickAction() { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.APP_GET_DEFAULT_DOUBLE_CLICK_ACTION); +} +function registerUserInteractionHandler(elementId, eventType, callback) { + const element = document.getElementById(elementId); + if (element == null) { + throw new Error(`Element with id '${elementId}' was not found`); + } + function handleUserInteraction(ev) { + if (!ev.isTrusted) { + return; + } + callback(ev); + } + element.addEventListener(eventType, handleUserInteraction); + return () => { + element.removeEventListener(eventType, handleUserInteraction); + }; +} +module.exports = { + getReleaseChannel, + getVersion, + getModuleVersions, + getBuildNumber, + getPath: _paths.getPath, + // used via DiscordNative.remoteApp.getPath + setBadgeCount, + dock: { + setBadge: dockSetBadge, + bounce: dockBounce, + cancelBounce: dockCancelBounce + }, + relaunch, + getDefaultDoubleClickAction, + registerUserInteractionHandler +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/clipboard.js b/core/src/app/discord_native/renderer/clipboard.js new file mode 100644 index 0000000..0ec2fd1 --- /dev/null +++ b/core/src/app/discord_native/renderer/clipboard.js @@ -0,0 +1,42 @@ +"use strict"; + +// @ts-nocheck +/* eslint-disable */ +const electron = require('electron'); +const invariant = require('invariant'); +const { + CLIPBOARD_COPY, + CLIPBOARD_CUT, + CLIPBOARD_PASTE +} = require('../common/constants').IPCEvents; +function copy(text) { + if (text) { + electron.clipboard.writeText(text); + } else { + electron.ipcRenderer.invoke(CLIPBOARD_COPY); + } +} +function copyImage(imageArrayBuffer, imageSrc) { + invariant(imageArrayBuffer != null, 'Image data is empty'); + const nativeImg = electron.nativeImage.createFromBuffer(imageArrayBuffer); + electron.clipboard.write({ + html: ``, + image: nativeImg + }); +} +function cut() { + electron.ipcRenderer.invoke(CLIPBOARD_CUT); +} +function paste() { + electron.ipcRenderer.invoke(CLIPBOARD_PASTE); +} +function read() { + return electron.clipboard.readText(); +} +module.exports = { + copy, + copyImage, + cut, + paste, + read +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/clips.js b/core/src/app/discord_native/renderer/clips.js new file mode 100644 index 0000000..654ecf8 --- /dev/null +++ b/core/src/app/discord_native/renderer/clips.js @@ -0,0 +1,18 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.deleteClip = deleteClip; +exports.loadClip = loadClip; +exports.loadClipsDirectory = loadClipsDirectory; +var _DiscordIPC = require("../common/DiscordIPC"); +function loadClip(path) { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.LOAD_CLIP, path); +} +function loadClipsDirectory(path) { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.LOAD_CLIPS_DIRECTORY, path); +} +function deleteClip(path) { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.DELETE_CLIP, path); +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/crashReporter.js b/core/src/app/discord_native/renderer/crashReporter.js new file mode 100644 index 0000000..aefde50 --- /dev/null +++ b/core/src/app/discord_native/renderer/crashReporter.js @@ -0,0 +1,27 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getMetadata = getMetadata; +exports.triggerUnhandledException = triggerUnhandledException; +exports.updateCrashReporter = updateCrashReporter; +var _electron = _interopRequireDefault(require("electron")); +var _crashReporterUtils = require("../../../common/crashReporterUtils"); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +let metadata = {}; +updateCrashReporter(metadata); +async function updateCrashReporter(additionalMetadata) { + const result = await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.CRASH_REPORTER_UPDATE_METADATA, additionalMetadata); + metadata = result.metadata ?? {}; + (0, _crashReporterUtils.reconcileCrashReporterMetadata)(_electron.default.crashReporter, metadata); +} +function getMetadata() { + return metadata; +} + +// Internal test for unhandled JS exception +async function triggerUnhandledException() { + await _electron.default.ipcRenderer.invoke(_DiscordIPC.IPCEvents.UNHANDLED_JS_EXCEPTION); +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/desktopCapture.js b/core/src/app/discord_native/renderer/desktopCapture.js new file mode 100644 index 0000000..cc24e86 --- /dev/null +++ b/core/src/app/discord_native/renderer/desktopCapture.js @@ -0,0 +1,25 @@ +"use strict"; + +var _electron = _interopRequireDefault(require("electron")); +var _DiscordIPC = require("../common/DiscordIPC"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +async function getDesktopCaptureSources(options) { + let sources = null; + if (_electron.default.desktopCapturer != null) { + // TODO(atlante45): For backwards compatibility with Electron 13, remove once we've fully + // transitionned off of Electron 13 + sources = await _electron.default.desktopCapturer.getSources(options); + } else { + sources = await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.DESKTOP_CAPTURER_GET_SOURCES, options); + } + return sources.map(source => { + return { + id: source.id, + name: source.name, + url: source.thumbnail.toDataURL() + }; + }); +} +module.exports = { + getDesktopCaptureSources +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/features.js b/core/src/app/discord_native/renderer/features.js new file mode 100644 index 0000000..b6ee036 --- /dev/null +++ b/core/src/app/discord_native/renderer/features.js @@ -0,0 +1,14 @@ +"use strict"; + +var _DiscordIPC = require("../common/DiscordIPC"); +const supportedFeatures = new Set(_DiscordIPC.DiscordIPC.renderer.sendSync(_DiscordIPC.IPCEvents.FEATURES_GET_BROWSER_FEATURES)); +function supports(feature) { + return supportedFeatures.has(feature); +} +function declareSupported(feature) { + supportedFeatures.add(feature); +} +module.exports = { + supports, + declareSupported +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/fileManager.js b/core/src/app/discord_native/renderer/fileManager.js new file mode 100644 index 0000000..646effb --- /dev/null +++ b/core/src/app/discord_native/renderer/fileManager.js @@ -0,0 +1,167 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +Object.defineProperty(exports, "basename", { + enumerable: true, + get: function () { + return _path.basename; + } +}); +exports.cleanupTempFiles = cleanupTempFiles; +Object.defineProperty(exports, "dirname", { + enumerable: true, + get: function () { + return _path.dirname; + } +}); +Object.defineProperty(exports, "extname", { + enumerable: true, + get: function () { + return _path.extname; + } +}); +exports.getModuleDataPathSync = getModuleDataPathSync; +exports.getModulePath = getModulePath; +Object.defineProperty(exports, "join", { + enumerable: true, + get: function () { + return _path.join; + } +}); +exports.openFiles = openFiles; +exports.readLogFiles = readLogFiles; +exports.readTimeSeriesLogFiles = readTimeSeriesLogFiles; +exports.saveWithDialog = saveWithDialog; +exports.showItemInFolder = showItemInFolder; +exports.showOpenDialog = showOpenDialog; +var _fs = _interopRequireDefault(require("fs")); +var _originalFs = _interopRequireDefault(require("original-fs")); +var _path = _interopRequireWildcard(require("path")); +var _util = _interopRequireDefault(require("util")); +var _DiscordIPC = require("../common/DiscordIPC"); +var _fileutils = require("../common/fileutils"); +var _paths = require("../common/paths"); +var _files = require("./files"); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable no-console */ + +// eslint-disable-line import/no-unresolved + +// Reason for original-fs being import/no-unresolved: https://github.com/discord/discord/pull/74159#discussion_r893733771 + +const INVALID_FILENAME_CHAR_REGEX = /[^a-zA-Z0-9-_.]/g; +const promiseFs = { + readdir: _util.default.promisify(_originalFs.default.readdir), + open: _util.default.promisify(_originalFs.default.open), + fstat: _util.default.promisify(_originalFs.default.fstat), + stat: _util.default.promisify(_originalFs.default.stat), + unlink: _util.default.promisify(_originalFs.default.unlink), + read: _util.default.promisify(_originalFs.default.read), + close: _util.default.promisify(_originalFs.default.close) +}; +async function saveWithDialog(fileContents, fileName) { + if (INVALID_FILENAME_CHAR_REGEX.test(fileName)) { + throw new Error('fileName has invalid characters'); + } + const defaultPath = _path.default.join(await (0, _paths.getPath)('downloads'), fileName); + const results = await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.FILE_MANAGER_SHOW_SAVE_DIALOG, { + defaultPath + }); + if (results != null && results.filePath != null) { + _fs.default.writeFileSync(results.filePath, fileContents); + } +} +async function showOpenDialog({ + filters, + properties +}) { + const results = await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.FILE_MANAGER_SHOW_OPEN_DIALOG, { + filters, + properties + }); + return results.filePaths; +} +async function readLogFiles(maxSize) { + // MAX_DEBUG_LOG_FILES may need to be increased as more files are added. + const modulePath = await getModulePath(); + const voicePath = _path.default.join(modulePath, 'discord_voice'); + const hookPath = _path.default.join(modulePath, 'discord_hook'); + const utilsPath = _path.default.join(modulePath, 'discord_utils'); + const filesToUpload = [_path.default.join(voicePath, 'discord-webrtc_0'), _path.default.join(voicePath, 'discord-webrtc_1'), _path.default.join(voicePath, 'discord-last-webrtc_0'), _path.default.join(voicePath, 'discord-last-webrtc_1'), _path.default.join(voicePath, 'audio_state.json'), _path.default.join(hookPath, 'hook.log'), _path.default.join(utilsPath, 'live_minidump.dmp')]; + const crashFiles = await (0, _paths.getCrashFiles)(); + if (crashFiles.length > 0) { + filesToUpload.push(crashFiles[0]); + } + return (0, _fileutils.readFulfilledFiles)(filesToUpload, maxSize, false); +} +async function readTimeSeriesLogFiles(maxSize, blindChannelId) { + if (blindChannelId == null) { + console.error('readTimeSeriesLogFiles: blindChannelId missing.'); + return []; + } + const modulePath = await getModulePath(); + const voicePath = _path.default.join(modulePath, 'discord_voice'); + // Example filename: "channel.17812072731293278934.16605628624321906260.tsi" + const filter = new RegExp(`^channel\\.${blindChannelId}\\.\\d+\\.(?:tsi|tsd)$`, 'i'); + const filenames = []; + for (const file of await promiseFs.readdir(voicePath)) { + if (filter.test(file)) { + filenames.push(_path.default.join(voicePath, file)); + } + } + const allLogFiles = [...filenames]; + const maxLogFiles = 10; // 10 is arbitrary but seems reasonable as each would be ~1mb. + if (filenames.length > maxLogFiles) { + console.warn(`readTimeSeriesLogFiles: Exceeded limit of ${maxLogFiles} files, had ${filenames.length}.`); + filenames.splice(maxLogFiles); + } + const readfiles = await (0, _fileutils.readFulfilledFiles)(filenames, maxSize, false); + // Delete the files after they've been read. + await Promise.all(allLogFiles.map(filename => promiseFs.unlink(filename))); + return readfiles; +} +async function cleanupTempFiles() { + // Since this runs on startup, handle and report all errors as cleanly as possible. + try { + const modulePath = await getModulePath(); + const voicePath = _path.default.join(modulePath, 'discord_voice'); + const deleteAgeTimeSpan = 1 * 24 * 60 * 60 * 1000; // 1 day. + const deleteAge = new Date(Date.now() - deleteAgeTimeSpan); + for (const filename of await promiseFs.readdir(voicePath)) { + if (!(0, _files.isTempFile)(filename)) { + continue; + } + const fullpath = _path.default.join(voicePath, filename); + const stat = await promiseFs.stat(fullpath); + if (!stat.isFile() || stat.mtime > deleteAge) { + continue; + } + console.log(`cleanupTempFiles: Deleting "${fullpath}" due to age.`); + try { + await promiseFs.unlink(fullpath); + } catch (e) { + console.error(`cleanupTempFiles: Failed to unlink ${fullpath}: ${e}`); + } + } + } catch (e) { + console.error(`cleanupTempFiles: Failed ${e}`); + } +} +function showItemInFolder(path) { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.FILE_MANAGER_SHOW_ITEM_IN_FOLDER, path); + return Promise.resolve(); +} +async function openFiles(dialogOptions, maxSize) { + const filenames = await showOpenDialog(dialogOptions); + return (0, _fileutils.readFulfilledFiles)(filenames, maxSize, true); +} +function getModulePath() { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.FILE_MANAGER_GET_MODULE_PATH); +} +function getModuleDataPathSync() { + return _DiscordIPC.DiscordIPC.renderer.sendSync(_DiscordIPC.IPCEvents.FILE_MANAGER_GET_MODULE_DATA_PATH_SYNC); +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/files.js b/core/src/app/discord_native/renderer/files.js new file mode 100644 index 0000000..00137fe --- /dev/null +++ b/core/src/app/discord_native/renderer/files.js @@ -0,0 +1,9 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.isTempFile = isTempFile; +function isTempFile(filename) { + return /(?:^channel\..+(?:tsi|tsd)$)|(?:^\.tmp.+)/i.test(filename); +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/globalOverlay.js b/core/src/app/discord_native/renderer/globalOverlay.js new file mode 100644 index 0000000..db02cc7 --- /dev/null +++ b/core/src/app/discord_native/renderer/globalOverlay.js @@ -0,0 +1,10 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.openOverlay = openOverlay; +var _DiscordIPC = require("../common/DiscordIPC"); +function openOverlay(url) { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.GLOBAL_OVERLAY_OPEN, url); +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/gpuSettings.js b/core/src/app/discord_native/renderer/gpuSettings.js new file mode 100644 index 0000000..6515b7c --- /dev/null +++ b/core/src/app/discord_native/renderer/gpuSettings.js @@ -0,0 +1,20 @@ +"use strict"; + +// @ts-nocheck +/* eslint-disable */ +const electron = require('electron'); +const { + GPU_SETTINGS_SET_ENABLE_HWACCEL, + GPU_SETTINGS_GET_ENABLE_HWACCEL_SYNC +} = require('../common/constants').IPCEvents; +const hardwareAccelerationEnabled = electron.ipcRenderer.sendSync(GPU_SETTINGS_GET_ENABLE_HWACCEL_SYNC); +function getEnableHardwareAcceleration() { + return hardwareAccelerationEnabled; +} +async function setEnableHardwareAcceleration(enable) { + electron.ipcRenderer.invoke(GPU_SETTINGS_SET_ENABLE_HWACCEL, enable); +} +module.exports = { + getEnableHardwareAcceleration, + setEnableHardwareAcceleration +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/http.js b/core/src/app/discord_native/renderer/http.js new file mode 100644 index 0000000..21b62ef --- /dev/null +++ b/core/src/app/discord_native/renderer/http.js @@ -0,0 +1,96 @@ +"use strict"; + +const electron = require('electron'); +const http = require('http'); +const https = require('https'); +const { + CONSTANTS_GET +} = require('../common/constants').IPCEvents; +async function getAPIEndpoint() { + const apiEndpoint = await electron.ipcRenderer.invoke(CONSTANTS_GET, 'API_ENDPOINT'); + if (apiEndpoint == null || apiEndpoint === '') { + return null; + } + return apiEndpoint; +} +async function makeChunkedRequest(route, chunks, options) { + /** + * Given an array of chunks, make a slow request, only writing chunks + * after a specified amount of time + * + * route: string + * options: object + * method: the method of the request + * contentType: the content type of the request + * chunkInterval: how long to wait to upload a chunk after the last chunk was flushed + * token: the token to make an authorized request from + * chunks: chunked body of the request to upload + */ + + const { + method, + chunkInterval, + token, + contentType + } = options; + let httpModule = http; + if (route.startsWith('https')) { + httpModule = https; + } + + // we will force the URL to hit only API_ENDPOINT + const apiEndpoint = await getAPIEndpoint(); + if (apiEndpoint == null) { + throw new Error('missing api endpoint setting'); + } + const apiEndpointUrl = new URL(apiEndpoint); + const url = new URL(route, apiEndpoint); + url.protocol = apiEndpointUrl.protocol; + url.host = apiEndpointUrl.host; + if (!url.pathname.startsWith(apiEndpointUrl.pathname)) { + url.pathname = `${apiEndpointUrl.pathname}${url.pathname}`; + } + return new Promise(async (resolve, reject) => { + let writeTimeout; + const req = httpModule.request(url.toString(), { + method, + headers: { + authorization: token, + 'Content-Type': contentType, + 'Content-Length': Buffer.byteLength(chunks.join('')) + } + }, res => { + let responseData = ''; + res.setEncoding('utf8'); + res.on('data', chunk => { + responseData += chunk; + }); + res.on('end', () => { + resolve({ + status: res.statusCode, + body: responseData + }); + }); + }); + req.on('error', e => { + if (writeTimeout != null) { + clearTimeout(writeTimeout); + } + reject(e); + }); + for (let i = 0; i < chunks.length; i++) { + await new Promise(resolve => { + req.write(chunks[i], () => { + writeTimeout = setTimeout(resolve, chunkInterval); + }); + }); + } + req.end(); + }); +} +module.exports = { + getAPIEndpoint, + makeChunkedRequest: function (route, chunks, options, callback) { + makeChunkedRequest(route, chunks, options).then(body => callback(null, body)).catch(err => callback(err)); + } +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/ipc.js b/core/src/app/discord_native/renderer/ipc.js new file mode 100644 index 0000000..6a95d8b --- /dev/null +++ b/core/src/app/discord_native/renderer/ipc.js @@ -0,0 +1,35 @@ +"use strict"; + +const electron = require('electron'); +const { + getDiscordIPCEvent, + IPCEvents +} = require('../common/constants'); +const ipcRenderer = electron.ipcRenderer; +const RENDERER_IPC_SEND_WHITELIST = new Set([IPCEvents.APP_BADGE_SET, IPCEvents.CHECK_FOR_UPDATES, IPCEvents.NOTIFICATION_CLOSE, IPCEvents.NOTIFICATION_SHOW, IPCEvents.NOTIFICATIONS_CLEAR, IPCEvents.OPEN_EXTERNAL_URL, IPCEvents.QUIT_AND_INSTALL, IPCEvents.SETTINGS_UPDATE_BACKGROUND_COLOR, IPCEvents.SYSTEM_TRAY_SET_ICON, IPCEvents.SYSTEM_TRAY_SET_APPLICATIONS, IPCEvents.THUMBAR_BUTTONS_UPDATE, IPCEvents.TOGGLE_MINIMIZE_TO_TRAY, IPCEvents.TOGGLE_OPEN_ON_STARTUP, IPCEvents.TOGGLE_START_MINIMIZED, IPCEvents.UPDATE_OPEN_ON_STARTUP, IPCEvents.UPDATER_HISTORY_QUERY_AND_TRUNCATE, IPCEvents.UPDATED_QUOTES]); +const RENDERER_IPC_INVOKE_WHITELIST = new Set([IPCEvents.GET_MOUSE_COORDINATES]); +function send(ev, ...args) { + const prefixedEvent = getDiscordIPCEvent(ev); + if (!RENDERER_IPC_SEND_WHITELIST.has(prefixedEvent)) { + throw new Error('cannot send this event'); + } + ipcRenderer.send(prefixedEvent, ...args); +} +function on(ev, callback) { + ipcRenderer.on(getDiscordIPCEvent(ev), function () { + // Sender is dangerous, do not expose. + callback.apply(callback, [null, ...[...arguments].slice(1)]); + }); +} +function invoke(ev, ...args) { + const prefixedEvent = getDiscordIPCEvent(ev); + if (!RENDERER_IPC_INVOKE_WHITELIST.has(prefixedEvent)) { + throw new Error('cannot invoke this event'); + } + return ipcRenderer.invoke(prefixedEvent, ...args); +} +module.exports = { + send, + on, + invoke +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/minidump.js b/core/src/app/discord_native/renderer/minidump.js new file mode 100644 index 0000000..2d50e9e --- /dev/null +++ b/core/src/app/discord_native/renderer/minidump.js @@ -0,0 +1,458 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.readMinidump = readMinidump; +var _fs = _interopRequireDefault(require("fs")); +var _util = _interopRequireDefault(require("util")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/* eslint-disable no-console */ +/* eslint-disable @typescript-eslint/naming-convention */ + +const exceptionTypes = { + C0000005: 'EXCEPTION_ACCESS_VIOLATION', + '80000002': 'EXCEPTION_DATATYPE_MISALIGNMENT', + '80000003': 'EXCEPTION_BREAKPOINT', + '80000004': 'EXCEPTION_SINGLE_STEP', + C000008C: 'EXCEPTION_ARRAY_BOUNDS_EXCEEDED', + C000008D: 'EXCEPTION_FLT_DENORMAL_OPERAND', + C000008E: 'EXCEPTION_FLT_DIVIDE_BY_ZERO', + C000008F: 'EXCEPTION_FLT_INEXACT_RESULT', + C0000090: 'EXCEPTION_FLT_INVALID_OPERATION', + C0000091: 'EXCEPTION_FLT_OVERFLOW', + C0000092: 'EXCEPTION_FLT_STACK_CHECK', + C0000093: 'EXCEPTION_FLT_UNDERFLOW', + C0000094: 'EXCEPTION_INT_DIVIDE_BY_ZERO', + C0000095: 'EXCEPTION_INT_OVERFLOW', + C0000096: 'EXCEPTION_PRIV_INSTRUCTION', + C0000006: 'EXCEPTION_IN_PAGE_ERROR', + C000001D: 'EXCEPTION_ILLEGAL_INSTRUCTION', + C0000025: 'EXCEPTION_NONCONTINUABLE_EXCEPTION', + C00000FD: 'EXCEPTION_STACK_OVERFLOW', + C0000026: 'EXCEPTION_INVALID_DISPOSITION', + '80000001': 'EXCEPTION_GUARD_PAGE', + C0000008: 'EXCEPTION_INVALID_HANDLE' +}; +class FileReader { + utf16Decoder = new _util.default.TextDecoder('utf-16'); + static promiseFs = Object.freeze({ + open: _util.default.promisify(_fs.default.open), + read: _util.default.promisify(_fs.default.read), + close: _util.default.promisify(_fs.default.close) + }); + constructor(path, bufferSize = 2048) { + this.handle = FileReader.promiseFs.open(path, 'r'); + this.buffer = new Uint8Array(bufferSize); + } + async read(u32toReadCount, position = null) { + const byteSize = u32toReadCount * 4; + await this.readCore(byteSize, position); + return new ReadResult(this.buffer.buffer.slice(0, byteSize)); + } + async readMinidumpString(rva) { + if (rva === 0) { + return ''; + } + + // https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_string + await this.readCore(4, rva); + const length = this.buffer[0] | this.buffer[1] << 8 | this.buffer[2] << 16 | this.buffer[3] << 24; + await this.readCore(Math.min(length, this.buffer.byteLength), rva + 4); + return this.utf16Decoder.decode(this.buffer.slice(0, length)); + } + async readCore(byteLength, position = null) { + if (byteLength > this.buffer.byteLength) { + throw new Error(`Requested nuber of bytes ${byteLength} exceeds buffer size ${this.buffer.byteLength}.`); + } + if (this.handle == null) { + throw new Error('Cannot use FileReader once closed.'); + } + const handle = await this.handle; + const readResult = await FileReader.promiseFs.read(handle, this.buffer, 0, byteLength, position); + if (readResult.bytesRead < byteLength) { + throw new Error(`FileReader failed to read enough bytes: 0x${readResult.bytesRead}`); + } + } + async close() { + if (this.handle == null) { + return; + } + const handle = await this.handle; + this.handle = null; + await FileReader.promiseFs.close(handle); + } +} +class ReadResult { + index = 0; + // irl, this should likely take the uint8 and work from there, but this is fine for us. + // Maybe just steal my other impl here https://github.com/jlennox/WebWad/blob/main/wad.ts#L8 + // but we likely don't want to load the entire file at once. But who knows, maybe the system + // call reduction is better and/or it irl doesn't matter either way. + constructor(buffer) { + this.u8 = new Uint8Array(buffer); + this.u16 = new Uint16Array(buffer); + this.u32 = new Uint32Array(buffer); + } + seek(index) { + this.index = index; + } + readuint32() { + const val = this.u32[this.index / 4]; + this.index += 4; + return val; + } + readuint16() { + const val = this.u16[this.index / 2]; + this.index += 2; + return val; + } + readByteArray(count) { + const val = Array.from(this.u8.slice(this.index, this.index + count)); + this.index += count; + return val; + } + readuint64() { + const u32Index = this.index / 4; + const val = BigInt(this.u32[u32Index]) | BigInt(this.u32[u32Index + 1]) << BigInt(32); + this.index += 8; + return val; + } +} +function isMinidumpFilename(filename) { + return /\.dmp$/i.test(filename); +} +var MinidumpStreamType; // https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_header +(function (MinidumpStreamType) { + MinidumpStreamType[MinidumpStreamType["UnusedStream"] = 0] = "UnusedStream"; + MinidumpStreamType[MinidumpStreamType["ReservedStream0"] = 1] = "ReservedStream0"; + MinidumpStreamType[MinidumpStreamType["ReservedStream1"] = 2] = "ReservedStream1"; + MinidumpStreamType[MinidumpStreamType["ThreadListStream"] = 3] = "ThreadListStream"; + MinidumpStreamType[MinidumpStreamType["ModuleListStream"] = 4] = "ModuleListStream"; + MinidumpStreamType[MinidumpStreamType["MemoryListStream"] = 5] = "MemoryListStream"; + MinidumpStreamType[MinidumpStreamType["ExceptionStream"] = 6] = "ExceptionStream"; + MinidumpStreamType[MinidumpStreamType["SystemInfoStream"] = 7] = "SystemInfoStream"; + MinidumpStreamType[MinidumpStreamType["ThreadExListStream"] = 8] = "ThreadExListStream"; + MinidumpStreamType[MinidumpStreamType["Memory64ListStream"] = 9] = "Memory64ListStream"; + MinidumpStreamType[MinidumpStreamType["CommentStreamA"] = 10] = "CommentStreamA"; + MinidumpStreamType[MinidumpStreamType["CommentStreamW"] = 11] = "CommentStreamW"; + MinidumpStreamType[MinidumpStreamType["HandleDataStream"] = 12] = "HandleDataStream"; + MinidumpStreamType[MinidumpStreamType["FunctionTableStream"] = 13] = "FunctionTableStream"; + MinidumpStreamType[MinidumpStreamType["UnloadedModuleListStream"] = 14] = "UnloadedModuleListStream"; + MinidumpStreamType[MinidumpStreamType["MiscInfoStream"] = 15] = "MiscInfoStream"; + MinidumpStreamType[MinidumpStreamType["MemoryInfoListStream"] = 16] = "MemoryInfoListStream"; + MinidumpStreamType[MinidumpStreamType["ThreadInfoListStream"] = 17] = "ThreadInfoListStream"; + MinidumpStreamType[MinidumpStreamType["HandleOperationListStream"] = 18] = "HandleOperationListStream"; + MinidumpStreamType[MinidumpStreamType["TokenStream"] = 19] = "TokenStream"; + MinidumpStreamType[MinidumpStreamType["JavaScriptDataStream"] = 20] = "JavaScriptDataStream"; + MinidumpStreamType[MinidumpStreamType["SystemMemoryInfoStream"] = 21] = "SystemMemoryInfoStream"; + MinidumpStreamType[MinidumpStreamType["ProcessVmCountersStream"] = 22] = "ProcessVmCountersStream"; + MinidumpStreamType[MinidumpStreamType["IptTraceStream"] = 23] = "IptTraceStream"; + MinidumpStreamType[MinidumpStreamType["ThreadNamesStream"] = 24] = "ThreadNamesStream"; + MinidumpStreamType[MinidumpStreamType["ceStreamNull"] = 32768] = "ceStreamNull"; + MinidumpStreamType[MinidumpStreamType["ceStreamSystemInfo"] = 32769] = "ceStreamSystemInfo"; + MinidumpStreamType[MinidumpStreamType["ceStreamException"] = 32770] = "ceStreamException"; + MinidumpStreamType[MinidumpStreamType["ceStreamModuleList"] = 32771] = "ceStreamModuleList"; + MinidumpStreamType[MinidumpStreamType["ceStreamProcessList"] = 32772] = "ceStreamProcessList"; + MinidumpStreamType[MinidumpStreamType["ceStreamThreadList"] = 32773] = "ceStreamThreadList"; + MinidumpStreamType[MinidumpStreamType["ceStreamThreadContextList"] = 32774] = "ceStreamThreadContextList"; + MinidumpStreamType[MinidumpStreamType["ceStreamThreadCallStackList"] = 32775] = "ceStreamThreadCallStackList"; + MinidumpStreamType[MinidumpStreamType["ceStreamMemoryVirtualList"] = 32776] = "ceStreamMemoryVirtualList"; + MinidumpStreamType[MinidumpStreamType["ceStreamMemoryPhysicalList"] = 32777] = "ceStreamMemoryPhysicalList"; + MinidumpStreamType[MinidumpStreamType["ceStreamBucketParameters"] = 32778] = "ceStreamBucketParameters"; + MinidumpStreamType[MinidumpStreamType["ceStreamProcessModuleMap"] = 32779] = "ceStreamProcessModuleMap"; + MinidumpStreamType[MinidumpStreamType["ceStreamDiagnosisList"] = 32780] = "ceStreamDiagnosisList"; + MinidumpStreamType[MinidumpStreamType["LastReservedStream"] = 65535] = "LastReservedStream"; +})(MinidumpStreamType || (MinidumpStreamType = {})); +class MINIDUMP_HEADER { + static U32_SIZE = 4; + constructor(reader) { + this.signature = reader.readuint32(); + this.version = reader.readuint32(); + this.numberOfStreams = reader.readuint32(); + this.streamDirectoryOffset = reader.readuint32(); + } + static async read(reader, position) { + return new MINIDUMP_HEADER(await reader.read(MINIDUMP_HEADER.U32_SIZE, position)); + } +} + +// https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_directory +class MINIDUMP_DIRECTORY { + static U32_SIZE = 3; + constructor(reader) { + this.streamType = reader.readuint32(); + this.dataSize = reader.readuint32(); + this.dataOffset = reader.readuint32(); + } + static async read(reader, position) { + return new MINIDUMP_DIRECTORY(await reader.read(MINIDUMP_DIRECTORY.U32_SIZE, position)); + } +} + +// https://docs.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_exception_stream +class MINIDUMP_EXCEPTION_STREAM { + static U32_SIZE = 8; + constructor(reader) { + this.threadId = reader.readuint32(); + this.alignment = reader.readuint32(); + this.exceptionCode = reader.readuint32(); + this.exceptionFlags = reader.readuint32(); + this.exceptionRecord = reader.readuint64(); + this.exceptionAddress = reader.readuint64(); + } + static async read(reader, position) { + return new MINIDUMP_EXCEPTION_STREAM(await reader.read(MINIDUMP_EXCEPTION_STREAM.U32_SIZE, position)); + } + getExceptionCodeString() { + const exceptionCode = this.exceptionCode.toString(16).toUpperCase().padStart(8, '0'); + const exceptionString = exceptionTypes[exceptionCode] ?? exceptionCode; + return exceptionString; + } +} + +// https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_location_descriptor +class MINIDUMP_LOCATION_DESCRIPTOR { + constructor(reader) { + this.dataSize = reader.readuint32(); + this.rva = reader.readuint32(); + } +} + +// https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_module_list +class MINIDUMP_MODULE_LIST { + static U32_SIZE = 1; + constructor(reader) { + this.numberOfModules = reader.readuint32(); + } + static async read(reader, position) { + return new MINIDUMP_MODULE_LIST(await reader.read(MINIDUMP_MODULE_LIST.U32_SIZE, position)); + } +} + +// https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_module +class MINIDUMP_MODULE { + // sizeof(MINIDUMP_MODULE) 108 + // sizeof(VS_FIXEDFILEINFO) 52 + // sizeof(MINIDUMP_LOCATION_DESCRIPTOR) 8 + // sizeof(RVA) 4 + static U32_SIZE = 108 / 4; + constructor(reader) { + this.baseOfImage = reader.readuint64(); + this.sizeOfImage = reader.readuint32(); + this.checkSum = reader.readuint32(); + this.timeDateStamp = reader.readuint32(); + this.moduleNameRva = reader.readuint32(); + this.versionInfo = new VS_FIXEDFILEINFO(reader); + this.cvRecord = new MINIDUMP_LOCATION_DESCRIPTOR(reader); + this.miscRecord = new MINIDUMP_LOCATION_DESCRIPTOR(reader); + this.reserved0 = reader.readuint64(); + this.reserved1 = reader.readuint64(); + } + static async read(reader, position) { + return new MINIDUMP_MODULE(await reader.read(MINIDUMP_MODULE.U32_SIZE, position)); + } + containsAddress(address) { + const endAddress = this.baseOfImage + BigInt(this.sizeOfImage); + return this.baseOfImage <= address && endAddress > address; + } + async getModuleFileName(reader) { + const moduleName = await reader.readMinidumpString(this.moduleNameRva); + let dirPos = moduleName.lastIndexOf('\\'); + if (dirPos === -1) { + dirPos = moduleName.lastIndexOf('/'); + } + dirPos = dirPos === -1 ? 0 : dirPos + 1; + return moduleName.slice(dirPos); + } + async getCVInfoIdString(reader) { + return (await CV_INFO.read(reader, this.cvRecord.rva)).getIdString(); + } + getCodeIdString() { + return (this.timeDateStamp.toString(16).padStart(8, '0') + this.sizeOfImage.toString(16)).toUpperCase(); + } +} + +// https://learn.microsoft.com/en-us/windows/win32/api/verrsrc/ns-verrsrc-vs_fixedfileinfo +class VS_FIXEDFILEINFO { + constructor(reader) { + this.dwSignature = reader.readuint32(); + this.dwStrucVersion = reader.readuint32(); + this.dwFileVersionMS = reader.readuint32(); + this.dwFileVersionLS = reader.readuint32(); + this.dwProductVersionMS = reader.readuint32(); + this.dwProductVersionLS = reader.readuint32(); + this.dwFileFlagsMask = reader.readuint32(); + this.dwFileFlags = reader.readuint32(); + this.dwFileOS = reader.readuint32(); + this.dwFileType = reader.readuint32(); + this.dwFileSubtype = reader.readuint32(); + this.dwFileDateMS = reader.readuint32(); + this.dwFileDateLS = reader.readuint32(); + } + getVersionString() { + const first = this.dwProductVersionMS >> 16 & 0xffff; + const second = this.dwProductVersionMS & 0xffff; + const third = this.dwProductVersionLS >> 16 & 0xffff; + const fourth = this.dwProductVersionLS & 0xffff; + return `${first}.${second}.${third}.${fourth}`; + } +} + +// This isn't spec'ed on the minidump page (from what I could tell): +// https://github.com/rust-minidump/rust-minidump/blob/main/minidump/src/minidump.rs#L267 +// This returns the ID string that is used by the Mozilla tools for PDB lookup. +class CV_INFO { + static async read(reader, position) { + if (position === 0) { + return new CV_INFO_UNKNOWN(0); + } + + // 6 is the largest. + const readResult = await reader.read(6, position); + const cvSignature = readResult.readuint32(); + switch (cvSignature) { + case CV_INFO_PDB20.SIGNATURE: + return new CV_INFO_PDB20(readResult); + case CV_INFO_PDB70.SIGNATURE: + return new CV_INFO_PDB70(readResult); + case CV_INFO_ELF.SIGNATURE: + return new CV_INFO_ELF(); + default: + return new CV_INFO_UNKNOWN(cvSignature); + } + } +} +class CV_INFO_PDB20 { + static SIGNATURE = 0x3031424e; + constructor(reader) { + this.cvOffset = reader.readuint32(); + this.signature = reader.readuint32(); + this.age = reader.readuint32(); + } + getIdString() { + // TODO: Probably uncommon at this point. + return 'CV_INFO_PDB20'; + } +} +class GUID { + // fixed 8 length. + + constructor(reader) { + this.data1 = reader.readuint32(); + this.data2 = reader.readuint16(); + this.data3 = reader.readuint16(); + this.data4 = reader.readByteArray(8); + } + toString() { + if (this.data4.length !== 8) { + return 'Invalid'; + } + return this.data1.toString(16).padStart(4, '0') + this.data2.toString(16).padStart(2, '0') + this.data3.toString(16).padStart(2, '0') + this.data4.map(b => b.toString(16).padStart(2, '0')).join(''); + } +} +class CV_INFO_PDB70 { + static SIGNATURE = 0x53445352; + constructor(reader) { + this.signature = new GUID(reader); + this.age = reader.readuint32(); + } + getIdString() { + // https://randomascii.wordpress.com/2013/03/09/symbols-the-microsoft-way/ + return (this.signature.toString() + this.age.toString(16)).toUpperCase(); + } +} +class CV_INFO_ELF { + static SIGNATURE = 0x4270454c; + getIdString() { + // TODO: Would be needed for macOS/linux support presumably? + return 'CV_INFO_ELF'; + } +} +class CV_INFO_UNKNOWN { + constructor(cvSignature) { + this.cvSignature = cvSignature; + } + getIdString() { + return 'CV_INFO_UNKNOWN:' + this.cvSignature.toString(16).padStart(4, '0'); + } +} +async function readMinidump(file) { + if (file == null || !isMinidumpFilename(file)) return null; + let reader = null; + const info = {}; + try { + reader = new FileReader(file); + const header = await MINIDUMP_HEADER.read(reader, 0); + if (header.signature !== 0x504d444d) { + console.log(`readMinidump Bad signature: 0x${header.signature.toString(16)}`); + return null; + } + + // Arbitrary number. Just a sanity check. + if (header.numberOfStreams > 0x100) { + console.log(`readMinidump Bad numberOfStreams: 0x${header.numberOfStreams.toString(16)}`); + return null; + } + const streamLookup = {}; + + // First create a lookup because we want to process the entries in a specific order. + for (let i = 0; i < header.numberOfStreams; ++i) { + const streamOffset = header.streamDirectoryOffset + i * 12; + const entry = await MINIDUMP_DIRECTORY.read(reader, streamOffset); + + // We only care about a limited amount of stream types, so lets avoid some of the overhead. + switch (entry.streamType) { + case MinidumpStreamType.ExceptionStream: + case MinidumpStreamType.ModuleListStream: + break; + default: + continue; + } + streamLookup[entry.streamType] = entry; + } + const exceptionStreamEntry = streamLookup[MinidumpStreamType.ExceptionStream]; + if (exceptionStreamEntry == null) { + console.log(`readMinidump: No ExceptionStream found.`); + return null; + } + const exceptionStream = await MINIDUMP_EXCEPTION_STREAM.read(reader, exceptionStreamEntry.dataOffset); + info.exceptionString = exceptionStream.getExceptionCodeString(); + const exceptionAddrString = exceptionStream.exceptionAddress.toString(16); + console.log(`readMinidump exceptionCode: ${info.exceptionString}, exceptionAddress ${exceptionAddrString}`); + const moduleStreamEntry = streamLookup[MinidumpStreamType.ModuleListStream]; + // Skip if `exceptionAddress` is 0 since there will be no crashing module. + if (moduleStreamEntry != null && exceptionStream.exceptionAddress !== BigInt(0)) { + // https://learn.microsoft.com/en-us/windows/win32/api/minidumpapiset/ns-minidumpapiset-minidump_module_list + + // Do not read them all at once. This 1) allows us to exit early, 2) would require a variable sized buffer + // instead of our smaller fixed size buffer. + const moduleList = await MINIDUMP_MODULE_LIST.read(reader, moduleStreamEntry.dataOffset); + // Sanity check, this number is arbitrary. + if (moduleList.numberOfModules > 0x200) { + console.log(`readMinidump ModuleListstream Bad numberOfModules: 0x${moduleList.numberOfModules.toString(16)}`); + return info; + } + let moduleEntryOffset = moduleStreamEntry.dataOffset + 4; + for (let i = 0; i < moduleList.numberOfModules; ++i) { + const module = await MINIDUMP_MODULE.read(reader, moduleEntryOffset); + moduleEntryOffset += MINIDUMP_MODULE.U32_SIZE * 4; + if (module.containsAddress(exceptionStream.exceptionAddress)) { + info.exceptionModuleName = await module.getModuleFileName(reader); + info.exceptionModuleVersion = module.versionInfo.getVersionString(); + info.relativeCrashAddress = (exceptionStream.exceptionAddress - module.baseOfImage).toString(16); + info.exceptionModuleCodeId = module.getCodeIdString(); + break; + } + } + } + } catch (e) { + console.log(`readMinidump exception: ${e} ${e === null || e === void 0 ? void 0 : e.stack}`); + return null; + } finally { + var _reader; + (_reader = reader) === null || _reader === void 0 ? void 0 : _reader.close(); + } + console.log(`readMinidump result ${JSON.stringify(info)}`); + return info; +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/minidumpReader.js b/core/src/app/discord_native/renderer/minidumpReader.js new file mode 100644 index 0000000..ec2437e --- /dev/null +++ b/core/src/app/discord_native/renderer/minidumpReader.js @@ -0,0 +1,23 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getNewestMinidumpInformation = getNewestMinidumpInformation; +var _processUtils = require("../../../common/processUtils"); +var _paths = require("../common/paths"); +var _minidump = require("./minidump"); +/* eslint-disable no-console */ + +// This is unfortunately in its own file because Jest breaks when it sees original-fs. +async function getNewestMinidumpInformation() { + if (!_processUtils.IS_WIN) return null; + try { + const files = await (0, _paths.getCrashFiles)(); + if (files == null || files.length === 0) return null; + return await (0, _minidump.readMinidump)(files[0]); + } catch (e) { + console.log(`getNewestMinidumpInformation exception: ${e}`); + return null; + } +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/nativeModules.js b/core/src/app/discord_native/renderer/nativeModules.js new file mode 100644 index 0000000..cd3a986 --- /dev/null +++ b/core/src/app/discord_native/renderer/nativeModules.js @@ -0,0 +1,50 @@ +"use strict"; + +const electron = require('electron'); +const { + NATIVE_MODULES_GET_PATHS, + NATIVE_MODULES_INSTALL, + NATIVE_MODULES_GET_HAS_NEW_UPDATER +} = require('../common/constants').IPCEvents; +const modulePromises = {}; +function getSanitizedModulePaths() { + let sanitizedModulePaths = []; + const { + mainAppDirname, + browserModulePaths + } = electron.ipcRenderer.sendSync(NATIVE_MODULES_GET_PATHS); + browserModulePaths.forEach(modulePath => { + if (!modulePath.includes('electron.asar')) { + sanitizedModulePaths.push(modulePath); + } + }); + const rendererModulePaths = require('module')._nodeModulePaths(mainAppDirname); + sanitizedModulePaths = sanitizedModulePaths.concat(rendererModulePaths.slice(0, 2)); + return sanitizedModulePaths; +} +function getHasNewUpdater() { + return electron.ipcRenderer.sendSync(NATIVE_MODULES_GET_HAS_NEW_UPDATER); +} +async function ensureModule(name) { + if (modulePromises[name] == null) { + modulePromises[name] = electron.ipcRenderer.invoke(NATIVE_MODULES_INSTALL, name); + } + const moduleInstall = modulePromises[name]; + await moduleInstall.catch(e => { + modulePromises[name] = null; + return Promise.reject(e); + }); + module.paths = getSanitizedModulePaths(); +} +function requireModule(name) { + if (!/^discord_[a-z0-9_-]+$/.test(name) && name !== 'erlpack') { + throw new Error('"' + String(name) + '" is not a whitelisted native module'); + } + return require(name); +} +module.paths = getSanitizedModulePaths(); +module.exports = { + ensureModule, + requireModule, + canBootstrapNewUpdater: !getHasNewUpdater() +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/os.js b/core/src/app/discord_native/renderer/os.js new file mode 100644 index 0000000..8f32fa7 --- /dev/null +++ b/core/src/app/discord_native/renderer/os.js @@ -0,0 +1,12 @@ +"use strict"; + +const os = require('os'); +const process = require('process'); +let arch = os.arch(); +if (process.platform === 'win32' && process.env['PROCESSOR_ARCHITEW6432'] != null) { + arch = 'x64'; +} +module.exports = { + release: os.release(), + arch +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/powerMonitor.js b/core/src/app/discord_native/renderer/powerMonitor.js new file mode 100644 index 0000000..e0776b6 --- /dev/null +++ b/core/src/app/discord_native/renderer/powerMonitor.js @@ -0,0 +1,42 @@ +"use strict"; + +const electron = require('electron'); +const EventEmitter = require('events'); +const { + POWER_MONITOR_RESUME, + POWER_MONITOR_SUSPEND, + POWER_MONITOR_LOCK_SCREEN, + POWER_MONITOR_UNLOCK_SCREEN, + POWER_MONITOR_GET_SYSTEM_IDLE_TIME +} = require('../common/constants').IPCEvents; +const events = new EventEmitter(); +electron.ipcRenderer.on(POWER_MONITOR_RESUME, () => { + events.emit('resume'); +}); +electron.ipcRenderer.on(POWER_MONITOR_SUSPEND, () => { + events.emit('suspend'); +}); +electron.ipcRenderer.on(POWER_MONITOR_LOCK_SCREEN, () => { + events.emit('lock-screen'); +}); +electron.ipcRenderer.on(POWER_MONITOR_UNLOCK_SCREEN, () => { + events.emit('unlock-screen'); +}); +function on() { + events.on.apply(events, arguments); +} +function removeListener() { + events.removeListener.apply(events, arguments); +} +function removeAllListeners() { + events.removeAllListeners.apply(events, arguments); +} +async function getSystemIdleTimeMs() { + return electron.ipcRenderer.invoke(POWER_MONITOR_GET_SYSTEM_IDLE_TIME); +} +module.exports = { + on, + removeListener, + removeAllListeners, + getSystemIdleTimeMs +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/powerSaveBlocker.js b/core/src/app/discord_native/renderer/powerSaveBlocker.js new file mode 100644 index 0000000..4388e27 --- /dev/null +++ b/core/src/app/discord_native/renderer/powerSaveBlocker.js @@ -0,0 +1,22 @@ +"use strict"; + +const electron = require('electron'); +const { + POWER_SAVE_BLOCKER_BLOCK_DISPLAY_SLEEP, + POWER_SAVE_BLOCKER_UNBLOCK_DISPLAY_SLEEP, + POWER_SAVE_BLOCKER_CLEANUP_DISPLAY_SLEEP +} = require('../common/constants').IPCEvents; +async function blockDisplaySleep() { + return electron.ipcRenderer.invoke(POWER_SAVE_BLOCKER_BLOCK_DISPLAY_SLEEP); +} +async function unblockDisplaySleep(id) { + return electron.ipcRenderer.invoke(POWER_SAVE_BLOCKER_UNBLOCK_DISPLAY_SLEEP, id); +} +async function cleanupDisplaySleep() { + return electron.ipcRenderer.invoke(POWER_SAVE_BLOCKER_CLEANUP_DISPLAY_SLEEP); +} +module.exports = { + blockDisplaySleep, + unblockDisplaySleep, + cleanupDisplaySleep +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/process.js b/core/src/app/discord_native/renderer/process.js new file mode 100644 index 0000000..e60b3b5 --- /dev/null +++ b/core/src/app/discord_native/renderer/process.js @@ -0,0 +1,18 @@ +"use strict"; + +const process = require('process'); +const env = process.env; +module.exports = { + platform: process.platform, + arch: process.arch, + env: { + DISCORD_TEST: env['DISCORD_TEST'], + DISCORD_GATEWAY_PLAINTEXT: env['DISCORD_GATEWAY_PLAINTEXT'], + DISCORD_DISALLOW_POPUPS: env['DISCORD_DISALLOW_POPUPS'], + LOCALAPPDATA: env['LOCALAPPDATA'], + 'PROGRAMFILES(X86)': env['PROGRAMFILES(X86)'], + PROGRAMFILES: env['PROGRAMFILES'], + PROGRAMW6432: env['PROGRAMW6432'], + PROGRAMDATA: env['PROGRAMDATA'] + } +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/processUtils.js b/core/src/app/discord_native/renderer/processUtils.js new file mode 100644 index 0000000..c4ec4b6 --- /dev/null +++ b/core/src/app/discord_native/renderer/processUtils.js @@ -0,0 +1,98 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.flushCookies = flushCookies; +exports.flushDNSCache = flushDNSCache; +exports.flushStorageData = flushStorageData; +exports.getCPUCoreCount = getCPUCoreCount; +exports.getCurrentCPUUsagePercent = getCurrentCPUUsagePercent; +exports.getCurrentMemoryUsageKB = getCurrentMemoryUsageKB; +exports.getLastCrash = getLastCrash; +exports.getMainArgvSync = getMainArgvSync; +exports.getSystemInfo = getSystemInfo; +exports.purgeMemory = purgeMemory; +exports.setCrashInformation = setCrashInformation; +var _electron = _interopRequireDefault(require("electron")); +var _os = _interopRequireDefault(require("os")); +var _process = _interopRequireDefault(require("process")); +var _DiscordIPC = require("../common/DiscordIPC"); +var _minidumpReader = require("./minidumpReader"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// Note: CPU interval should be kept insync with Android's DeviceResourceUsageMonitor interval. +const CPU_USAGE_GATHER_INTERVAL = 1000; +const MEMORY_USAGE_GATHER_INTERVAL = 5000; +const mainArgv = _DiscordIPC.DiscordIPC.renderer.sendSync(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_MAIN_ARGV_SYNC); +let totalProcessorUsagePercent = 0; +let totalMemoryUsageKB = 0; +const cpuCoreCount = _os.default.cpus().length; +setInterval(() => { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_CPU_USAGE).then(usage => totalProcessorUsagePercent = usage); +}, CPU_USAGE_GATHER_INTERVAL); +let memoryUsageTimerRunning = false; +function getCurrentMemoryUsageKB() { + // Lazy initialize because this is only needed when the native process_utils are not available/updated. + if (memoryUsageTimerRunning) { + return totalMemoryUsageKB; + } + memoryUsageTimerRunning = true; + function computeMemoryUsage() { + const memoryUsage = _process.default.memoryUsage(); + return (memoryUsage.heapTotal + memoryUsage.external) / 1024; + } + setInterval(() => { + totalMemoryUsageKB = computeMemoryUsage(); + }, MEMORY_USAGE_GATHER_INTERVAL); + totalMemoryUsageKB = computeMemoryUsage(); + return totalMemoryUsageKB; +} +function flushDNSCache() { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_FLUSH_DNS_CACHE); +} +async function getLastCrash() { + const lastCrash = await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_LAST_CRASH); + const minidumpInformation = lastCrash.id != null ? await (0, _minidumpReader.getNewestMinidumpInformation)() : null; + return { + date: lastCrash.date, + id: lastCrash.id, + rendererCrashReason: lastCrash.rendererCrashReason, + rendererCrashExitCode: lastCrash.rendererCrashExitCode, + minidumpInformation, + storedInformation: lastCrash.storedInformation + }; +} +async function flushCookies(callback) { + try { + await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_FLUSH_COOKIES); + callback(); + } catch (err) { + callback(err); + } +} +function getSystemInfo() { + return _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_GET_SYSTEM_INFO); +} +async function flushStorageData(callback) { + try { + await _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_FLUSH_STORAGE_DATA); + callback(); + } catch (err) { + callback(err); + } +} +function purgeMemory() { + _electron.default.webFrame.clearCache(); +} +function getCurrentCPUUsagePercent() { + return totalProcessorUsagePercent; +} +function getCPUCoreCount() { + return cpuCoreCount; +} +function getMainArgvSync() { + return mainArgv; +} +function setCrashInformation(crashInformation, state) { + _DiscordIPC.DiscordIPC.renderer.invoke(_DiscordIPC.IPCEvents.PROCESS_UTILS_SET_CRASH_INFORMATION, crashInformation, state); +} \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/safeStorage.js b/core/src/app/discord_native/renderer/safeStorage.js new file mode 100644 index 0000000..3a81a37 --- /dev/null +++ b/core/src/app/discord_native/renderer/safeStorage.js @@ -0,0 +1,22 @@ +"use strict"; + +const electron = require('electron'); +const { + SAFE_STORAGE_DECRYPT_STRING, + SAFE_STORAGE_ENCRYPT_STRING, + SAFE_STORAGE_IS_ENCRYPTION_AVAILABLE +} = require('../common/constants').IPCEvents; +function isEncryptionAvailable() { + return electron.ipcRenderer.sendSync(SAFE_STORAGE_IS_ENCRYPTION_AVAILABLE); +} +function decryptString(encrypted) { + return electron.ipcRenderer.sendSync(SAFE_STORAGE_DECRYPT_STRING, encrypted); +} +function encryptString(plainText) { + return electron.ipcRenderer.sendSync(SAFE_STORAGE_ENCRYPT_STRING, plainText); +} +module.exports = { + isEncryptionAvailable, + decryptString, + encryptString +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/settings.js b/core/src/app/discord_native/renderer/settings.js new file mode 100644 index 0000000..784c0e4 --- /dev/null +++ b/core/src/app/discord_native/renderer/settings.js @@ -0,0 +1,29 @@ +"use strict"; + +const electron = require('electron'); +const { + SETTINGS_GET, + SETTINGS_SET, + SETTINGS_GET_SYNC +} = require('../common/constants').IPCEvents; + +// Updating app settings directly from the renderer is considered deprecated. +// Voice still sets a few options, so we whitelist those. +const RENDERER_SET_WHITELIST = ['audioSubsystem', 'useLegacyAudioDevice', 'debugLogging']; +async function get(name, defaultValue) { + return electron.ipcRenderer.invoke(SETTINGS_GET, name, defaultValue); +} +async function set(name, value) { + if (!RENDERER_SET_WHITELIST.includes(name)) { + throw new Error('cannot set this setting key'); + } + return electron.ipcRenderer.invoke(SETTINGS_SET, name, value); +} +function getSync(name, defaultValue) { + return electron.ipcRenderer.sendSync(SETTINGS_GET_SYNC, name, defaultValue); +} +module.exports = { + get, + set, + getSync +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/spellCheck.js b/core/src/app/discord_native/renderer/spellCheck.js new file mode 100644 index 0000000..4971506 --- /dev/null +++ b/core/src/app/discord_native/renderer/spellCheck.js @@ -0,0 +1,48 @@ +"use strict"; + +const electron = require('electron'); +const EventEmitter = require('events'); +const { + SPELLCHECK_RESULT, + SPELLCHECK_REPLACE_MISSPELLING, + SPELLCHECK_GET_AVAILABLE_DICTIONARIES, + SPELLCHECK_SET_LOCALE, + SPELLCHECK_SET_LEARNED_WORDS +} = require('../common/constants').IPCEvents; +const events = new EventEmitter(); +electron.ipcRenderer.on(SPELLCHECK_RESULT, handleSpellcheckData); +function handleSpellcheckData(_, misspelledWord, dictionarySuggestions) { + events.emit('spellcheck-result', misspelledWord, dictionarySuggestions); +} +function on() { + events.on.apply(events, arguments); +} +function removeListener() { + events.removeListener.apply(events, arguments); +} +async function getAvailableDictionaries() { + return electron.ipcRenderer.invoke(SPELLCHECK_GET_AVAILABLE_DICTIONARIES); +} +async function setLocale(locale) { + let succeeded = true; + try { + await electron.ipcRenderer.invoke(SPELLCHECK_SET_LOCALE, locale); + } catch (_) { + succeeded = false; + } + return succeeded; +} +async function setLearnedWords(learnedWords) { + return electron.ipcRenderer.invoke(SPELLCHECK_SET_LEARNED_WORDS, learnedWords); +} +async function replaceMisspelling(correction) { + return electron.ipcRenderer.invoke(SPELLCHECK_REPLACE_MISSPELLING, correction); +} +module.exports = { + on, + removeListener, + getAvailableDictionaries, + setLocale, + setLearnedWords, + replaceMisspelling +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/thumbar.js b/core/src/app/discord_native/renderer/thumbar.js new file mode 100644 index 0000000..2bf0db0 --- /dev/null +++ b/core/src/app/discord_native/renderer/thumbar.js @@ -0,0 +1,16 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _constants = require("../common/constants"); +var _ipc = require("./ipc"); +function setThumbarButtons(buttons, isSystemDarkMode) { + return (0, _ipc.send)(_constants.IPCEvents.THUMBAR_BUTTONS_UPDATE, buttons, isSystemDarkMode); +} +var _default = { + setThumbarButtons +}; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/userDataCache.js b/core/src/app/discord_native/renderer/userDataCache.js new file mode 100644 index 0000000..4dd6d19 --- /dev/null +++ b/core/src/app/discord_native/renderer/userDataCache.js @@ -0,0 +1,23 @@ +"use strict"; + +const electron = require('electron'); +const { + USER_DATA_CACHE_SAVE, + USER_DATA_CACHE_GET, + USER_DATA_CACHE_DELETE +} = require('../common/constants').IPCEvents; +async function getCached() { + const cached = await electron.ipcRenderer.invoke(USER_DATA_CACHE_GET); + return cached; +} +function cacheUserData(userData) { + electron.ipcRenderer.send(USER_DATA_CACHE_SAVE, userData); +} +function deleteCache() { + electron.ipcRenderer.send(USER_DATA_CACHE_DELETE); +} +module.exports = { + getCached, + cacheUserData, + deleteCache +}; \ No newline at end of file diff --git a/core/src/app/discord_native/renderer/window.js b/core/src/app/discord_native/renderer/window.js new file mode 100644 index 0000000..88da3be --- /dev/null +++ b/core/src/app/discord_native/renderer/window.js @@ -0,0 +1,95 @@ +"use strict"; + +const electron = require('electron'); +const { + WINDOW_BLUR, + WINDOW_CLOSE, + WINDOW_FOCUS, + WINDOW_MAXIMIZE, + WINDOW_MINIMIZE, + WINDOW_RESTORE, + WINDOW_FLASH_FRAME, + WINDOW_TOGGLE_FULLSCREEN, + WINDOW_SET_BACKGROUND_THROTTLING, + WINDOW_SET_PROGRESS_BAR, + WINDOW_IS_ALWAYS_ON_TOP, + WINDOW_SET_ALWAYS_ON_TOP, + WINDOW_DEVTOOLS_OPENED, + WINDOW_DEVTOOLS_CLOSED +} = require('../common/constants').IPCEvents; +let devtoolsOpenedCallback = () => {}; +let devtoolsClosedCallback = () => {}; +electron.ipcRenderer.on(WINDOW_DEVTOOLS_OPENED, async _ => { + if (devtoolsOpenedCallback != null) { + devtoolsOpenedCallback(); + } +}); +electron.ipcRenderer.on(WINDOW_DEVTOOLS_CLOSED, async _ => { + if (devtoolsClosedCallback != null) { + devtoolsClosedCallback(); + } +}); +async function flashFrame(flag) { + electron.ipcRenderer.invoke(WINDOW_FLASH_FRAME, flag); +} +async function minimize(key) { + electron.ipcRenderer.invoke(WINDOW_MINIMIZE, key); +} +async function restore(key) { + electron.ipcRenderer.invoke(WINDOW_RESTORE, key); +} +async function maximize(key) { + electron.ipcRenderer.invoke(WINDOW_MAXIMIZE, key); +} +async function focus(_hack, key) { + electron.ipcRenderer.invoke(WINDOW_FOCUS, key); +} +async function setAlwaysOnTop(key, enabled) { + return electron.ipcRenderer.invoke(WINDOW_SET_ALWAYS_ON_TOP, key, enabled); +} +async function isAlwaysOnTop(key) { + return electron.ipcRenderer.invoke(WINDOW_IS_ALWAYS_ON_TOP, key); +} +async function blur(key) { + electron.ipcRenderer.invoke(WINDOW_BLUR, key); +} +async function setProgressBar(progress, key) { + electron.ipcRenderer.invoke(WINDOW_SET_PROGRESS_BAR, key, progress); +} +async function fullscreen(key) { + electron.ipcRenderer.invoke(WINDOW_TOGGLE_FULLSCREEN, key); +} +async function close(key) { + electron.ipcRenderer.invoke(WINDOW_CLOSE, key); +} +async function setZoomFactor(factor) { + if (!electron.webFrame.setZoomFactor) return; + electron.webFrame.setZoomFactor(factor / 100); +} +async function setBackgroundThrottling(enabled) { + electron.ipcRenderer.invoke(WINDOW_SET_BACKGROUND_THROTTLING, enabled); +} +async function setDevtoolsCallbacks(onOpened, onClosed) { + devtoolsOpenedCallback = onOpened; + devtoolsClosedCallback = onClosed; +} + +// To synchronize web vs desktop release features +const USE_OSX_NATIVE_TRAFFIC_LIGHTS = true; +module.exports = { + flashFrame, + minimize, + restore, + maximize, + focus, + blur, + fullscreen, + close, + setAlwaysOnTop, + isAlwaysOnTop, + setZoomFactor, + setBackgroundThrottling, + setProgressBar, + setDevtoolsCallbacks, + USE_OSX_NATIVE_TRAFFIC_LIGHTS +}; \ No newline at end of file diff --git a/core/src/app/images/badges/badge-1.ico b/core/src/app/images/badges/badge-1.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e2003fdc4551b838cbdc78673d127716aa3caa8 GIT binary patch literal 15086 zcmeHO&ubJ(6z;)=y?PN3d)Qory@-18EG#VSDF<&e$q+pS{{aPA2uKcsB7%5O5F!YB z@Z?GHkV7ucA&TO`s2CT?Nf1K!*bbAV_WQcKGCkGR-PJucJ<~A_FZH8ez4yIWRj+>Z z#BmzV5$EVp2hWVN_>1G5Wo{-c|BLzus5^Z+DxYwizm7T1A1JcP45$(Ob)0kHQy(Ej z!zMMG-tlJBy#{&(awB3Mb>8tTU9FaT9(>y%kwV+#(aDI~?xwVh%iC3DM3@tLFJJCL zl@PaY`|1XC`wY=Xze`4G$gPwyvfH7RSQE-jTUE?+j#hKqm29#lS& z-pH4otT7plbK|jALO*1Cvp}5KTXD_;Bj=cj9RW`X{cN|Uiw}$&cxN)d_wkj~|CPE_ zA3!(b+P-X)d`bP(v8>V0_*s?yXBz#C;Z^DXpwZ8Dq$>T}Q>cH^{;zWUJ=gf(X#QQi zI2a=~=bvf(dHJ$0K7QO0_wM=P@#7ybBYX_wKgYK={xBxuU2go{+6vDO{r;YC-94#Z z6wt4YzYx?gS%2=|_r;qxebMU;bQ6T3{?zq{`c2p0#YI=#z3Yp&Z^Ls~0sWclFELDV z|3Uqe-hUB8iJ%I}s>pZ3I+E8V~cw(%32^mSSao>KegPG|7V5wgXnPdnoM`|z7A%knYxhmMcf zASd%237%5tm(QP*SS99os>5Yc2V6$y7ur|m{P^(U5Ap5WZXBvMZ-Q0NV|IQdex8+K zFYY6U=VM-Ze%=j!Kd`lxZbzOB-Fspwa(<@`Xfx9N$<3SJ#l}W*OzH6D*A=@zA^y7G zU(tp--yae`sm}MeaT_onYI%PyZQxkKJgepR3u!|*r|bFsNZPqKL7v# literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-10.ico b/core/src/app/images/badges/badge-10.ico new file mode 100644 index 0000000000000000000000000000000000000000..1e02de381e4694340f25fdb90e603e3ae7974252 GIT binary patch literal 15086 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 blJ$cw${!A1#3WDNAjfxuM4~h}-2mhiG z7lRi)i6MuG0bx+lh$s?46cI6?j@>golldv%*WJ~r?o?M-&vX*UO~Fg|biI1-d#|cq z{l+kwj77%c#RjEjqx&br_!Doju7U9GL=zr>d%ViA-Dk4%PFwh~cJlvfGM@G$#& zE0rp#2&Uu5^P&vmowkK^!d^fB{CS%}#^9jM+S*Kq#C-3)mozxOr{D08Umow5F1a!W z2JFChf$y{Q5g~EYDuODzmAnD*ODo z!meH|gv$o%4}Pep{ct~eGJG78I*Dw*Tt+?phs#LvGz`Y-A;g(xqLoBE&g^w!6@3s= z5={SR-qu#@7oxwY?er0i5KR!FO@Z)^Z++kaZ(6=;Z?}J@wzrC8j}c80h5JnSH+YEG zT7|N;;^^$GE^2GDR*+I_yPV($!@NjKjDWJDnGbw&8cr*#(z>dt#t3+lwU^Tzl^F)dhJ}=)-cxTq!|4q z+ge3(X3VY7X9+L*m=r(e8IzM02Lk307cSUr?OKy{bOforU0z<0J0^<{h#SNc*}owd zV|A(I`T^tTnKRP)gA~7@e-gUFKA?QWwYakE^oE+o58q95@y zRzLiW`3H0()#!&|iGIZJSpA#_bGI*Fru_iFXw*HIKOxbNafIi`KH+oBXEBdN`uMTJ zdV6Qg#iHb7>($S(4hf5l@-SRMfggEIXtB#l@dfr)($w zojYfeS3~Qdp7O=J9lF3m&PB&M6xY1{$9Uca7@HF@a9dKJ$h7P4d~atHxhi z!?3MeEq3i%fsK!sSTZy!RNQI5aBFrV`e=%4TT7ch8!n3wq{ z*YEjZ-sayNhubFSe*MAq^C#ki7o!j-hlwy=V9W&J9p6%4e{uak>QmSXn3q@VQ(%j< zlgQtvpuN&?`ceJAU{`P+^u7C|qr>{6r6sqUV$pv@qZD&q67l`?m-vP}@PPMwu!rz0 zBkCu5O<2Qo66J4{@yafnYg;-x>|be4Hc0xVdjd&pab;M8kU86S?A^<-XLp1s%{?Ti zp2!XxvY}%(?C9!ZOUSR0^YA1-kKrAIt~6~xeOvrn^5@iycYuyI8D2mCtz|*@`)V*0{QJXO3A` z&<5;7_xHPd4%l~4k&cfz4=@26#~Jk`o_=0N=ZSObTrOw>_L8t~qEkKz53ohy=HH3u zbrPB2-Log>v}cmxr`fOp*hoQSKc@U;NwIVOefx6Ewr9T{fHBGj%*{ETTAsbVdFSqh zUkUV*c0IJV=6a&=lWnxVP{;hZ{DTK)*9Krz;2({{r;~s9aNgMi4cEi|{o3ask$s== zk4E7qY*_O}mQ9j}ePw>8$L&DO$NiinawNPj75Jt1k|Z*;FyL%7d^ZbcgzMMWl>u z*-QJ8@%<8a7e+>=X3U#qHlYt(zFg4i@1kyCNwR*24OAv}|3uW$-EBE@1>A*x|Gwg^ zi!p!0U7!~)%IwCCf^#oSETjLPZ2tuK8-4!@HZ=17A@GA5dH+_lf%-#3?w@lT(3Ysb zHRSmPx54exjd^~=ZNSsp-)*?_JJANbQ=e$a^V6^$)3)S#$R_3aHTIuiw@k*uH}%|f V!9VHy$Gs1P|A|6cc+RySz5%SKR{Q_} literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-3.ico b/core/src/app/images/badges/badge-3.ico new file mode 100644 index 0000000000000000000000000000000000000000..43ce7cf299065c0ea4a17f8a7bc9a6a25e431796 GIT binary patch literal 15086 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 RNq-N7|A|7HD#zOn{{dh0HCX@v literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-4.ico b/core/src/app/images/badges/badge-4.ico new file mode 100644 index 0000000000000000000000000000000000000000..91bd61f30d192284326203fdcf167a65301b8405 GIT binary patch literal 15086 zcmeHOO=uKJ6z<@{UcHEiJ!~!udkL$TJqrs9d&*&NGf9jdOcZbGDJ(>TsHYJB@F0N* zD|_**A{aCv#J`{rFnS0E5e%&>ds-CW%cE)j2@KW8?@74R>>-Sz) zS5F*gz}e;O-tABubSA%ZoL_M?=%4>XpTlbxFP6o-cMUNY5bDez(E%c^Gt*wJq5-MdVERAv=JW0kM88qIoF%$P^o9sA z1;R1L&VmQLS@~*owER8A-Z0I*MD#C_nltJ-c!<{>hHP3K&0js}HCfbj_IGtE)Bg^LBdmsxDl&3H72>YKA-`BYHca1G71w{F7PiHWZ@8qwJ3sCh2v(&$J1H0objsli0?_HA8Ux>OS9&iOPq zSMvOhYwzDT!f|Cyrp|kp*j4*c!&ScU{M0Ge(*s*?-KvD+mhs1OZ#4Sx9O3KRdf0r zY4z*;9~*zHAN}lX$;*dowJFY@FWJ;Tw*Q{S|FQWe>ql-qed^}}@*g>YmZ1K!{%!f! zuKvjSag4eLeR4~vUt51r6KP&!{Z;iNAFf{Y^MNrW)UU0-G{-=i=g*xx74iCY-J=H& zs_b7=Z+!khf12m-;ll-S{J87U-85f1b*nr`jhnse(2fy zn{oIt+5Ptq*3UiaLr|koC+`yBd4Xpp2*()9{QZmdf2+N;70{DI>{DQibet&Mr=Y!3 zwSBAp-?6K89safZV{FX*C6_DyMYZT}qD87XYec-CzJ@Ve0}pt=273t45Ya5rI$<@f zO|;{X31o-5ZOhnL`A1rlEs%bzJprAK{v7TC=KRujOiv5!*I%uV8i3b+n=pj;s?eU{4Kvrio-2mQ}^31Uv7<~jPZxRgHr7vOsVk0mS@kRIKp?d zqer7S>LPyY_~HAY#u2^)@wJTc8{>y^+d6+4Bl;^>TEE*Mt}vb@eqdDNhR<#5r;MGC zpFD};2zibBk}-Z`{j`04F=n|(+#~+Ep}uB`9~jx+Y9GAohH)$7vN=Zmk=w(ERryrd zzrRE^z1=%8#n8G9RueCt1E!W1Kd{l9+O-3Z6Hnsxvk5!K@f^nUSl2qhpJe@<+4~FD zL%Nm*KlwG$`wQvA_vXyrAMv|jwWYxiOu&|e@UBeu(tc!=H))TL94QFg2boTvE?U(H zV6l0Bhm9nY+5Smd+ao!<{S)Bt_x&r_(9ipaoG1Ofe=FNS`Oug9=WGLFiSns0zhAHo zeopu2_an9eeXzgVci-=18*ofH(U;#(RXZYEic@4$?Dy+@-s3Uuq3Pz{8B4Zq+VPXU RpZwng;eVpgcKUAn;Xm!bMEn2% literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-5.ico b/core/src/app/images/badges/badge-5.ico new file mode 100644 index 0000000000000000000000000000000000000000..1d6bf8f22a5ba34b05ab4da181a1d4445fe0c66e GIT binary patch literal 15086 zcmeHONoW>H6z<@_T)l{gIZQ4CbCJ=@oP~jbIeC~{Hse0-yQnc5jfoLgL=*)_Bkm$7 zA`&7h{BA*9q9TT<(Tjos7rOs_dGo&hyZ`iB-PQR`{GAlM{N2@6?|tvpt5?;pI*L-I zj8n#sSGZIw|NNjRzvHU9cz=fL|K+;Lla2dd6y?teit;PpqDwVXmHt;zrgA%HA)=~s zQcaCEv8G0CWqQP<8iZ@E(dhRO;wRP&Qkj-MbT| z=SJIBQxCp}eVorr_a8pw>GbJT>E3Aj$kHEnES3@<;Z)Y0NvuG{|K7yWcO`a9eE}`bNdk*jN}>SEo&3UOh~u_#HyNi3@#tzyrKw zad5xCxPPyNJX5aow->y^$~W|e>~tAqn^@Ao5XKI$SCHPbXRCy`yLoe**HV=bS3_Wh z9j1uvQ1mr@yj}d}&QDV)p95Eq$R`ay_w=>3 zYvc6pUEUPw`o&uQ;6WzH7R+0l#+_YzE6iEOiaF+~!~FRg_4H&Z7E2TMAx%wj!g{`I zSArfs%$D$+JLlRDIQhlA;sfFa%l4h$_4O)Y{q|bB7c9`|)2E_s9zV{~%$eRg7`hEY zmeU6O3~|kgHT1n{gEwz-v|>e|AGCSMNBj&e&)N3%>zqCYuU_S7>C!;?T^{lg!-eu; z=l1pl?cABr=O4zSxj9akE~RwY_!Em|JjckvyWc}T))Arn6DLxnX$8t;3i>>J`!+{| zgL!=)3)!gOu)(z-^Wym>ihRs*6zoAif6h}nUC`;{$GkoV+S^0P1|Bc@f%ZRgB&o}X z+$~$;v|~p?C+zF7Hx06%<++#r1O0FB-h?h6e>~n_WaM`<3tJ3gY=QG{+qQT~K77%l zkL>1D^2*F_C5X#$U)sybUU6&P0p97!T3<1NpON zsr2GSPDrh-Lj8T$AIKN2zmN~YxQi&jFNNzbFofBEm{=r#1NR@0Kic~*U@+`3D*I1U zzF~(^+kcxliat5=?;oao^B3{Kh*5}>T})Unux5gAjk>bGf0^>X*I!F2U{o%Vr$CCd zk*SoY;9RM*e6RK&)62dO`qu5y(4hTRQxk9ISag!<2FIK}CNrPjhdMk%8?^lv^kF=c znD#IYFjlF(BKjD8Cylf&4Gqbkc~92K@;!3`GP)FbXr18swe@IeA>{0~GnF%kq>mfx zkpyqZ_!@f5m_ZZRuEKq|jNJuoV~|x&9WdY6K5qpwrF=h#4`h{Vju+#K9!JWGF-Qk~ zt`1iRjN?e!-Ki5~NA;!RT$S^8NHYHdx>fdfg}zdxzxU67Y`Vw1R!MVZsAJI9$| zxqObM=SuG1&+2EVJnuXUa;*FIB_rygZD*#oyoTuBi0`3dzeXq*m%hWoVVc;0BuGkZVURUAcD9HWy_Gb0mkLmZw zg~Ml_JQ>P^>y7zOcXvk0mw*Y_xT{bHZnH;h2m72@y*jR+o3C0W_6g)ztp&Nx#zs4@ zAi2O60{=h|pQz8_`_{5)lQ1Xc8Xv|#Ai|IFiHa>uKYZ6=Ek}Tr z*|YZf3qO)w2f&Z<-|)lF&+*RZi9uA4*z)XImJ*2q;micz0-ZmfqT|O?bmdB#aGv8V zPoHL`zC_ zW7cyUsr@rB;C)xNU`>mFKg|AF>iq>6@C}h{xqJ8PyuUCGoHvJle*}JfUnN`Q_nzV2 zAAuk5%Irs+k95yfuR6p_d^;mUOO}M+KLCr&`#W^tKB4j_Uiy^3PA-1}{892(<;Sg$ zf28~sbg1O~A@GALIe%-_f#*X-=Fd$X;7jb^6?uMP>QJ21m3e+->VRJ(zguzVcUB#6 x&2yq6&rh9t4CxYYVx5HN*T_FXZ!aEWb>hACn0?A`pW^pG_@5}0vEPxl!+$S?M1BAO literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-6.ico b/core/src/app/images/badges/badge-6.ico new file mode 100644 index 0000000000000000000000000000000000000000..d0c0cd63df611a0d5a3327c15304a63cf7e198b7 GIT binary patch literal 15086 zcmeHONoW;G7;bT3u3p5$94426xya~c&ceXJoIK1en~D2^D+Yxa31k6L2`-4Z5@lRa z&>URiLWC$LY79|KNFv5jj4Nt<-EV*Ipa1Lb>Q}E{cfanJXJVWbRI011>i@t0@4x=4 z`s+neW+*e2S+f*QCCbVl6yWv_|Dq^=&Q_FPxr!kroM-5N6=ebU zvnL{&QOsOgs?I4b4K;A?H^!M<@)-I!(J;rRUk!)%lN(Ch6kE znAL9fZ4h#B9s04_J38Xj-5s~;ckjmO-o1oXH~aQVBf8 zi4#$)-Rv838-Ma-ls5z3o4<8=6NgrF0d2S3Z>v+yrn8ln#$Qq+@| zANXw8pwjSgl2kQK$BsqhapGChpKf#3_Y*jQxv^2BrlznMBg(Ar2R*o{sURP;#Q&$_f;2SY@s-+s?syd z%hmZztDCc*`De$2G2Ng6T0wE}xW9OOA7?w=p!Gh`^2^_p8@yvh;4QGmfWeO*pf5ji zS5}5-^JbN{ZPN&T-3M0aVZN6h3|rH`w=2C(n^eO36_2Nxl#$ZuH1+i*XvdBme{QGK z?PZguox9o^_6=Bjl1YO%_+kx3!t7Tgq|W2n zvm{kjW#c?|&cKFsxw+Z%JG=)kyAGH){F*E7h6ats#!|YTj~>lk_jm0ITQ+g%P;R@8 zc9R2t_)k~eN;E#30RsNkj!Q#zHMw0rT5buz%FT_0YqQz}v z+%;=3975poX!AFJmq&e^Dm$O5w?Nz*6Gtx3WW^6i*;aNAVEitL}=woU;1$L zKk$jn!`1%^{z4D?_ea?N41WltfNz42lKZ(lJNjRIk9_NoogREJaNs=E+ndmB(B8*Z zcU^zL-_QDMqo>P@wF&1kANKFL{sM#F{f85dJn!=EKfr&o_g}zZ>S0p$pMt-s2kZqW zW&bU37&bZa=MTYOl<*IxkAk0U=Zy6NYZfw|@vi9SFTwwNEu~Pvq&y-{fe>jGXDd#@ zu~K{bUiCjMSN1;iTh~WrrTSZGsaD6n=pW7<>~jV=BhHIFh<9j1AN2heIk#{g zVT^wENLC+=F~`oGXjv*NBR}(=td;q@#svJzW6)4rLGx?NQD0Ap+3nz5%ovjXO<0Zy zXoJVskfXYqX0uLx?Zf@*-lbnBcokCy%s1B0zb^bNn=V#6col1o8-7LiAw|cTN8ZqQ zWx#iwNWI(T0q;U>$(XB!+dE=?h|L^05TV*yEhjE#$LdkQO#I5hx{L%_ zA6VX2zqHYB%^H;=kxblNKn7M3PZ94#dH#IP{cs-tptkbZyx)Lj#hxJ0x_bL|T)@&x z#QpZ{iCA~Zi2uN@5F-@{v3lH5_|+3I0UM9^l!5!S_@#+{h{?*haBqN^p%V?rAgAu` zoI8HUae@}G`M^IS`uiy_UCPGP-k$Tj1q;)P75E82CcS-|vfBLcV*DdK+ExGfK7Q!P zeI7nEVz&ZSO^vrrAjT^vhu@2M$^?vVGGK2mWApR;`gH~m<}2=fyvBX`l9>aLW8FGu zTXUmPR;Jau;b+%k5aN zAVhY#nxkJHLT}q&}|)2a|dodr}EYAY>OphN2 z+w%*WjLX;g1#$&FKMEf966dbt$D;(_FU~kP``Y{YtNS}Y0zb~mEHB3+-REo2HpEj- zor)5E?-O(^umm~3Lk1obIDQfom;e63;wQjA-uRV&YhqYKF@6t(|A|7HE+<+K{{h!NPHzAJ literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-7.ico b/core/src/app/images/badges/badge-7.ico new file mode 100644 index 0000000000000000000000000000000000000000..b50750c267a29ff9a18fe175afd4b0497afa7f29 GIT binary patch literal 15086 zcmeHOO=uKJ6z<@{UcHEiJ!~!udkL$TJqrs9d&*&NGs&2!NbsPjB={Ey1jRoH0S_v= z7%;LZh=__BFiP+cMPtB&A!v+v@DEg`CzHucruKc^U770c>guXaCvn^~ymU|XtM|V5 z>eZ|2*B#4hu+~^>*IINmS{*-F*6+A#bbtR#?f+2Qh7I2DUo7j-b(Zxj{X~~Wq6X)$ zWo;t9;K3McNRu)ddwnL8?dqAjEo_WF1a94N4AwaShhnenv?e7)QbYJ-15e9xbk+1OY) z)b8<)3H{;c5a03RGY*E%PCImu`15i7A@l9q3cGi2F0Q{6Kl-0NTV$nDm34H4Fo^hl z{yTrZ$R;K#4!wL?A()JvJ68;15d7!F+`{<5=K}+?KH9ghAoeF-e=N%4N9I#%3&juj zqbFklhopaG{BjvyEGC*iT!zWnvKU(oAT}nYW$4~+W9Y4TdI(Bc~ zoM*XQY%Fm7IKvMcReo?|%^7d8pYQs_i5X}8Etjk8;>A$z_wh>nH>!$BFV2;**4%Eup&Jt@(T zbwt%CbnncWBGfy_)vL3i`wDqqsZ((LjrF&-=GnVqV>&F<}x>d_ZCr@h4#nAkV z%Re0*c{Vs$WH)Ypkp>Bj{GFiOTgC7>jff8vO(L$YqYNf&Bd-eaSUH*OOx9*Qz&i*ZvDRfgV z8YCK~oHIeh>**6{!#(hT_gk=s@H7$i5lsQ#lIW`Y{pwr%?T)w=9sCiB_L??yQi&%s~5xHTuz z-Ju_s8h zuA;_(cgNy!>Xh-j0I9ve1Z*BdO;m}a6W(7Mi9~L7|>`7-m$Yu)%qwte$^n9To>nh&KNw;>*4Z*xn@$23LMg{(1T{&@l z{r$CfAg}>>Nl|~*wvF%)N8u+-c;?fVrQ$`c_WgVRdWLrzsy>?cCKULk-z90v4Pm=* z!M~n;{+!Bsw(uQP&6^J8vnpz^85}P zsgF_pM90?TJZAM1;9pGrDmhN+cqgh~!G?OSAM$xp&-Gi;2AU6bSwH7CAeJbu>+<~t zx51s$_4)pY+kmrI->tj%ccKlrra4iU?@xnv)NCmnB%74)uTg)3-7*=gZF>8oRX?TY RC--|G{7)2))$?-u;XgJL=)3>` literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-8.ico b/core/src/app/images/badges/badge-8.ico new file mode 100644 index 0000000000000000000000000000000000000000..8d0ca36cfb85fb8b2d9841a47947fe2c453d5116 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/core/src/app/images/badges/badge-9.ico b/core/src/app/images/badges/badge-9.ico new file mode 100644 index 0000000000000000000000000000000000000000..c1537794956ce6a53c42bebe9d413d9aa19652cd GIT binary patch literal 15086 zcmeHONoW>H6mD@~u3p5$9LCGQTx9ezXJKGqP9El#m>3saaVHURArj(_F+tqGksQ=< ziz{N>HKN2_+!u^uRB+e7|G)FEZ{FA4^{2c4>ZSht8sns((tlUKdhdI$U%h%&)zP#8 z+CXj4AdSmVZSoJA_B(zJweJ7r_J6o-_;CCF7ft(fu%`XWx9BpI>j3kwrj2AeZy}-q zrL1LT`jE1+SRL2vTw`{{Z*J3v1j#BdkNwSbpSY4w{RA2r54&$x^sB1!<&pLBura&j z-nfybM~^bJdUZmEg=xEWVVTg^MK^7lPTRJ1Q9Pcb{ri)yXEtq}(1Y(`9~aHksXEow z#c9>51ZA^1TDUOodX7Gh{;+fY`HB?@N~Lo2>Q$EBzRjAyB^Y9U{jXh1)77hKli%pk zF}i<0Lnlt8^89UC&i*d^=-bw2(WC#HH(ApbPK+M>F8i%qY2iP0Dn)nirs?CyEKQo! zt)I=uVL#L7T<>qef;hFbBx(EhE}Ak$_hNUwKiI+RKOU^k{ssOc>}d0F;qdVB^L>R8{2$jvlR#U|#K9^YJ@^e1Qpl z+Q9?7RB>>>zqtQR1$jcQ_j(h&qRO}RhU{bsWD6`wV2EM|*egiy2@_(nm@DK2U15h2 zL3Xfw&3xa!d^T+|D4os`=HcdMgJ#bzh~d6{S+DjWpS1lv(AQd8x>yCP(&({h1qntdMB;+qS<^3qctIAED#>5B&M@;`5dCHL5A?sCJ1zOJwT%C%Q`Q)G{yam~)uHeII79W?KXCjt zHYUuti`ctmi{a7__D3#`a_3GuN*pQ}e_`=w=1e^wYhtk+ZP;MY;>B@VvnFA#1t1%~ zfpt-c?WOStF_HTP#$UX5G0t(t8Y+><5#nzqlcV{N11=217bhs-9?My1U!hrAvPD!1Lt302+Kbr z$`SIM*UklDcToE7a7=<|5$`$hk=1f%l zMqA0(Uqb%(dUb3C^vX}{Q(%j8OF7NYX@U=&dH&_(Z}vP>}%^%S!w*tIaxEy58M-o zqLal#ZwAjVtw(JwVb5*_*HZ2wneU4AFu)r!zJwlQ$I@W7XJ8&4#oiHU+90cxI$*r9 zeV#>-9qRW{ctBRE#<&$%%otJ&|f|I+ihGV&*y>>*vdt)3koQLD)Y~;o(oKuTUA!c6?Wgku^1O7U3?~ z6Tz9}xN$wxgKcT3%nz8G{B0q}($J7_gLmA$ex0QyOG5XqLf)0$%q(4dOR{^`6*+~ZhYM&Sh-V3T1MZTx&#R9-4{n>Sl~%mP1r zDZ*a5pC9@95OQ-BTq?9;pIYdEb0U@gg0{RozChU9du99c`a&LGqO>sC>*H2)owR}aRnjK8bPjjOda$#JgG1~})qcroQt;n}l{ zlC5mp2H{uoA7FA8oPh=9pUCH&<>kw4G5CG`M|J$-yEkXS7!LA3Z;ppE&LDc(v!L_I0JK*BS+NdVPIq)KJiCw{=zql&hp|#us@tX@AiN1d841+?)La1 zKm7JuSLvOK^G)c1^FEw?x#d}7dDbl5JPQ>1f_C0KIjyX}XbW2t^ZV%#v{A0`0cXKG zsIGS7!o7EnID1w-_5&NslKPHlXBwsa8S6%1b{52XoHye;1bmb0js1p^Blunv`#5QU zP2lvqGL7>31>c@Ja~r2F-rx9+VeQ(`v+M%h7+0kA3-l^x{fO^hkPpDG{R;A*>C@Hi zZoPwO>qp?nTAB6b{m8<3G^`EZNNn6_5b}yESJHI!sFg=V{C=pw?vMv8D(iRXzko16W}jq|EgygecyFa`&ZDRFYg}$KWbmzzjf-sw}OYGl$^87;R zV2$a%d442xz}4R0?Q`dMP95-@$3&kzKlSR-txJ3X>lAo?jr}L+E#uMO7Mxr6+o$yQ RvAzew|3snmU%$2;{sW$JQBME> literal 0 HcmV?d00001 diff --git a/core/src/app/images/close.svg b/core/src/app/images/close.svg new file mode 100644 index 0000000..1b00def --- /dev/null +++ b/core/src/app/images/close.svg @@ -0,0 +1,15 @@ + + + + +Slice 1 +Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + diff --git a/core/src/app/images/discord.svg b/core/src/app/images/discord.svg new file mode 100644 index 0000000..e5f71c3 --- /dev/null +++ b/core/src/app/images/discord.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/app/images/systemtray/darwin/tray-connectedTemplate.png b/core/src/app/images/systemtray/darwin/tray-connectedTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..172aaa4849ac1d9e21dafb26050091937e23b8a0 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jsRU0K$B+ufWC@J}Oh;ZhuD_fAa*^^UN0TX`^dM$DCHetXj3#ypAU zy(bKAbl+nOmJ|8XXLD+@^j;&5r;)S5S_S?xGMu}hySC{^H4D%#22WQ%mvv4FO#t0x BGRyz~ literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.25x.png b/core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..c95bc183b3d92ffdfc054ca35a9c3b8c26ea4edb GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^GC(ZC!3HGf#l`*vQZ1e?jv*C{XRkK09d_Vpc$m9E zx@Tr0+cJ&5FipS4EK$|>|E>PcUodO;1UdPJ`B{@r&%DoEU*hpX@Z-U=MkVgtHw_|;APUu}mJi}wEo|JAqt&-`=z pQ2mFu;j{mL+Gg+nkNw8y+|L#s+~<^Elmgwu;OXk;vd$@?2>^VVOP2ru literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.33x.png b/core/src/app/images/systemtray/darwin/tray-connectedTemplate@1.33x.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9c45b47c61b8a687fef2359ee3a0ee53acaeb9 GIT binary patch literal 232 zcmVP)?!NKLu>`dCM@`^9~vCKbe%06E? o&%kZ+g;lmWV3Q@@bA{W&58t4-dYp{#z`|=2MY;sDaOZz57Ad+QNkk+V_fa zha@__uK6lma`>4k-D`d0W-0xr>d}T~)S&e0Fo6R+L+{*T4SguI z8qDAk`lM6zz+My1p>JA16)d&k9tzrZ++;m&piGvLwF4-#L1d{9GPp)H!ks}T;|SFZ z866_jG-ULO+7xI5GVAh>-V#UiDP%U50_{U)11ZotWY&=ajX_3F(aE|VGTK47eeeGl zuN^WtLAKTmD@Z4@RgDwx+!wDQ)6QnrePG%OOesSsq~0&Q%~!0U0fpCzMV#OkFL=Zi f_ArhHlvbrTT!)oKhUff100000NkvXXu0mjf{0Mi- literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-connectedTemplate@2.5x.png b/core/src/app/images/systemtray/darwin/tray-connectedTemplate@2.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb87bc8770c2158d6084ecaedada3a0a8f8ab30a GIT binary patch literal 294 zcmV+>0oneEP)b|NCFZom;F&Dos~?xnOZ7vsz}An8p&eaDXi=VHzbysswH*TNFArFp`BT5CXA&;(6Ab6)x0H+Ar z4iwN1f;5R=D4<_V!h3g61b6V-JQUG9ymb#nbPq4p_=O_+MGfbzK?zuc^DdwST)=sc zPy!y|yk{r@&v4#1lz?yha&}lIeL=BXf!)Ltef+WqXM5#||FUXh1{)BiG1{}Ctc}xc s5fXca6@U47+vD=_78_{BU~Oz!f3960?&v7{v;Y7A07*qoM6N<$f~kjiv;Y7A literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-connectedTemplate@2x.png b/core/src/app/images/systemtray/darwin/tray-connectedTemplate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..33cea0d5ec9edcd45df13646e1a6ac68b8c0487c GIT binary patch literal 229 zcmV^P)#;)*+tI_af(kWKQ5+ZHgc>`Y z7NbXnUQ!*lNrxSJ*^UmcH9;mOywZRRGI3!*^A^a=f~FP7R6(<5$kdExRmfD$wrIRP zM#$WV$6FzDD;{ry%x!qQ12T8u@lMFxiMz`}WNYNdGJl`>pvot94qZ8h=VB&Tb-BFF zb$%Xr^5kbx9)U9!kU^1*4rQ1u41U3LGF%AV>%V34)@WiN5>4oqe%bELgi|X8toT4?y_PKOebVE|<%F%b`Y( z2`dhG++REnteDWFhQkl#3bdGULBDiiMhm`~D>1-Bf6QY*iMPw4!wLPf6CE7hq6Rzk zVmlg`&0&NB8{uH83JVm81r<#6zy?KT!^6V3PbgB)lt-?xL6O@~A*mb|C=m-Bl4*nz zGa`u^C{Ycf&S8fVwZkFWIw)}+qO8OTCGJFt=o%m+21Hc>4;kT6Aevgpm=@7AL&nUA zB8Lky=7K};YRIS>!RsNTdIWERjG7R<6*6i?@D9kR1Hto~j|0}=pW7zTp=T~|bar*P+DYm$M7M#)oo=d&m0yK?8lz2{`KbM&k^+wTNV zYNAs+;lG{uYEJ-rq(abBg6XMoDI$KRN~;XsGiT5<$YD|jqe$Ooy#U|3~;6;2_5mR1TtP|ySvi3&}%-~HdtzUn|&);i~8XJ)>a=L&v_nfZUY@5wpm zoO3RqMuQeT227ao`ZQz0fF3Ox)Ch1ZRN;gR?$8(Aalr`{+&31mM~5f$L!Ric_m}v! z0*)A=m5n(5`vBbzH|RgRVTZruw&R4-D0vfA~{8JLx$r&SDSlywYfj9 eHl5o70B`_I3540@EhS` literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-deafenedTemplate.png b/core/src/app/images/systemtray/darwin/tray-deafenedTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..cc479321a2a550da1bbe6656044921ade185efbd GIT binary patch literal 233 zcmV(RQ7p<94QDS%CGpPTI;8(wdL5QPButSf7s zWD>+0Umf0h{-UOgg0R;6eqQ;-u>v9o%ZqQYRm$bIE>L>$fRD?5?v0*j3qJ(=-*61n zTj-vy=#|nedf~b5k+7cT6l1B!3;t&4G|RaaKiHi&+wtyHsk4p?f-W|^i~qDB`^ZkI mUenrpv!}4!cJl0UUO%ncQhss9pXESbGkCiCxvXl)22lETunJ2?7L0VE4^xP!4VE_I!x>yYGUB7Ya84H%{3g&w zBe=np4`!kK#`!1Qb+zG5Ed1U$jLx)Y&cI0#?lWA`L>(?46NanYYiXi2E;kdNy2QP% zChBszp71{|axeTOIs}gnLbwJVbv}>At%P43#=iS@R5*1O#)hME*j!W&XBajZmBSIvU9U>6G;8~M~1uzwxif;e}}20*m^VoGfQ0000WfBo+B45@(jo&I0Vy%{E0}(I+{vZS9yp}S36lpLf)gq7fC9(j<9?he`1nb+%KDZ>T`7CDuNwr$(C-VLj;JwOlG6SPO^2^v*Ty%>Gjch>*p7vmXERst-ue6*ksV;Dv^ zs*#PjtsL_>gV;F00P+yCWn%;q3`f|;9!@PnYvIcRsKD>0AwP~Wh%y8(2Mt(&{5V4^ zRCj|{JOo8n;s}c@-d3Y zg`l&T4Yf_-PT@=jpT%mZZ5x8yC?j)l3PCs2b__wk!acbM!7$V&KROj2oDB#jeG7Dm zjC%f z1R6#5LT&2?fx)}5iL5{&)K-CAm~zrI=<^je@BI-$M9=bIvbyG~W4KAp5i z=F}8;3!c*?HBi23q)ECc@K&wWgmuvu{m{1Y^UADO?Vd(0Y(tfazkkRA9%^ofpY)fg z5b%4h`H;)}mV;0jsjs8Pvc{nr|16cQW_JT9X>M zd1Jv#kN2XN##-~`#L0mH#mRvIz}?bNo^CAwTWP4s%z0OqA0^PZUd({W(&qj!VG4PlEX9p4-ZXSFDo*WsbfSnS}0N;q@G<2Y~SpWb4 M07*qoM6N<$f=JiaK>z>% literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-deafenedTemplate@2x.png b/core/src/app/images/systemtray/darwin/tray-deafenedTemplate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b1bfbfe62b276434171cb1bb23ffbeb9192907 GIT binary patch literal 385 zcmV-{0e=38P)D8J~>AxEZHE6h@iANh?2)a znSZqh2gpMd4?19cMZDtWTl5-|7)7NULlUAK!}x-D`XjoQ&pLoKM47ZFT5r=3B?wEF zG#u@MDC01`ecT(2o`NX*R{a)&8$;0@$U+c+@ueUL8T_Y%5F}uH1qfUQ526c#0*p@- zhr!#!0a2_C)`+$}I0?r$R~1A%evz~^xQt+#XeqCX0-jm z8qswOE*~96X{!)qV0`&Ko7Z2)`g_3hQIifC%`1j31t!!31Udong06_4%^*fG))2=GX3HT)G3F3Q4zpDd$M*-un1pms zY#@$zzAsS4JyFAKJBVZOz}I8|aqM6=aTz?V;tDl{K1ReL^f6)zp^p(k2!#W*F+|C1 zqM`U@L>@waOjhxR(Equ!iaCTf#xmv*>KHMHP{)WlggQpdA=EKq4xx?_M+pBhwh@Hz z5~G6Iw%QPPjPb$z&szoU4yw+^I{*PkI{g2JH`Q{2o5-Vv*-B`{6b|5Obbu)|p@hh6S22SlxDz_UG_D}? zJC89qA)`2t%q@o=9KZ=XL^pEC#EO`S8EFq|nEPoByKpf~p@=iR3s{A#VjIJ_gF=-n zjk_4eHe3~}xPTxxgg3ZTA;wmf0L!?IT*AZ79jw4ru#3wGY9siJFZfg;@&nJ6!WJ5R zVH1RItn$y?2u?bR3NPXMJl{0++k=Z}S9qP=?s+?{e(o3z3U5Xl;G%*KEF9Sa z3rDuV!jUboTx1J8h=wW#Q@Z18sL^1!fs-qz@JV(FWgswWI$T)bEmn^Vs zXF!E&tu?yI#V_=s&ayYw!^*RR5MC3eLu~etP z!AG{=jAUpQ*&ggYDp@xTeikE+QiifBnhb~X6q7O?rL;_=x;1G-GMHN~HR>lzaVI0}R5X#UTuZ{&Y zVD3o+^QgnYbcQYB2Bt%9FyH5AIm$!W^VH`u~ z`@;~%v5fsTFT1;_pvkm1a0Zi6f;IG^)Z%@!AL~e9GCISXVDax9AEJh|J;Zej4`4qE zjxNiCxM<;Ed5Wlai68MZzOuwCU^BymHjV;ZuZZ!C2hSB=N0ht5Paqny$J>HwVzoo} zm}rJ*G0Eom^Q2Pj5`Gwc#A`hjZxm9?m@Dg2LHlzHIsxPT^SgcpimQILGm}I}}dg9LFm- zj%T03c^S_>h4V6A_9>jxcv}kB*>JwZvrpl?jAx(1c^S_>h4V6=eG2DgJo^;R%Xs!F zoQLr&Q@HNM+f=yrFmK~s!9IoaF5VvOQ#kM9EhCyW+=ufv-U~#tBQL`-R>7B!;vFG} zXg2F@IL2-r#e0OPRz>1*IO8Z@lzWPX$Kez&WpCoZ$8d^gUk)#^j>NNYiWk8u_*n52 zPg6Wi@f7dDH+TXqpntmk7SEss6z_XHhZa!0AMgTNK&$BTsI|Ob0DVD`*ej?^mH+?% M07*qoM6N<$g2nTUj{pDw literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-mutedTemplate.png b/core/src/app/images/systemtray/darwin/tray-mutedTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..8b39a30b69872d33b815d846d0af3bdf89c8db92 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8gw!3HFS-u9~jsrjBRjv*C{cP}+Ab8-}D|5zgY*01kU&2g+`TCaA`-~Fr_O^)^cNMdwpPsK{0~RrAjvS8001!G VFK%d}GW`Gm002ovPDHLkV1nGSa_|5E literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.33x.png b/core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.33x.png new file mode 100644 index 0000000000000000000000000000000000000000..72c7980fd98eaf870391c19f03f08ee7eeb35d23 GIT binary patch literal 284 zcmV+%0ptFOP)h0000DsrU#zOw_l?xXNHhQ{B08Xrt=>BcQr8d!G3eI1ntI|LIgZfIThPM~!25S_ z)_%}`3+%$dtR=!~3=niEkh~FZIKd4AA5D z14=lYCODpCKo0Zn;{$AtAHl0!4?af*Y@mi$`DsLdut0aK?3U>7J(p+EeEQZ>xF>6Nf7!#`vD8|;ElmMz|2dzKR*lb*xi|v z%c}!Z{?C zBYgjnhzV|cD}-#(Yzd;)81Zg|tS~^-Gpg+YqOLF?;=>5JhNyc~+ZLks=nya)Aw4EU zY*1~d*hADEI{fa{cq40csJaV0LDVBgoSUbn;m$Baa!7c=C%!#GRtUI(WNxuBK27sU rrg)+GN7x}dzX&^IL62seGJktNL5)OTqLnkf00000NkvXXu0mjfaE5hj literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.8x.png b/core/src/app/images/systemtray/darwin/tray-mutedTemplate@1.8x.png new file mode 100644 index 0000000000000000000000000000000000000000..9381a397c87ee88f85754d959b839b06afef3ff5 GIT binary patch literal 368 zcmV-$0gwKPP)DsH+Sb|>8?!}ZY810&#fs5xD$a{wpS3TLD546`2j~+7P*1#g9qtj_a}W0C z2QPS>%UxOS|68txE?QVe^lc(<2XGLTVH?pl#TPE&uLFTEi}{lG_`x^kusea|Xd%iP zcrcOnB}ak4J+N{k*KisNOeJy>4oovr1JjMvz*HkOuoPB(MMq$K#YC8Z{ZAgc!M9= z!W0fw6t)dqLzF`oc1=9_k-9nxUmFf$Oi&O1g5qumR}jNth7krh$A^iWBkC#`!$EQ^ z@LpD=4eddU3v^I1pS!$Boft!yl^q!f3`EXS3$&4+*i9|aM)t5=l>GulbYf^8f-Y$Q O0000mGC9jN2%0|jRpSRz0jXCJ8J>;rY2eV_wpAE@BW1B(R+oV|6T zOCP|-umaY|yF=Lf&J(%J=k)zL5|dDkId1&8TV~)oG8&iVtH(f14ijfvuQM6D#Im{ z-a9A`XrwP~g1q>-35YJC_cn?Hvgk_}U?wjwmFQg9_x|2AaYPqIPr+2k>?ylPx;P{O zPEzzdtcJ1SPkDYwhC=~M$vRjBvta=|uo4{un>jkbd#}+%25jV0-n$d96PCj*6VU_* zhacm{gY{^m!5sZyI+&uLV29~o;(0O*g9wZQ07Kz za19=lYxK8&ra&l%%P?}dOt;A#T`-0ttTiDaf)(Rm)*|HK2fSy*=z|f{K9eD0iU3(L z);vP2nG7)k?>%B1dxSVPKx&M2ZV1vyjZxycc@P?d&=`cqAT$P{F$j%e3N^+mFNFLU z#a0YLV~FJ(KCokC0{#V6iFKPB_{fQ2{T$`-#01E;yrmd#DKT2$iuIVM zArE;M61L@%gmL~=S`4E3*Cse^0;Uc|4p(XK?_%6z2iib8(4d)28OT-{HzUmRj7;z! zuA~fQ2Vs%_8EEz>Ns2)pzzNty@qRM~AEm@7f-^8;cuG6eO$zjNGhgXo0&F!EPk zj3U_U`MJh1T!PzD_8B&1up=QrH>`#Kr0zg%_yb#h4EZ7WG31Bf$B-O?5hE5Kf)OJJ myF`az#E9((GD3ueq9~usGZByE`OBRE0000a1M9=XVpbAt8hi zLI@#bAFPKXa8@1B+x7`@vl%wP1;Yk?Y>}Leh})|HL+mXv@?H27j!JcO%&lZYX>ot4 zRU_}yU>^4s71tTLJ|b|v6u^Cr>Ww@S5qLxj;bBDN*@(ciV#3H{{=m?Lk#|K!P7EU_ zhLID)$SxRpbfW}jWH*ewGbnOm7&$SFOcF;Xi6fJmM;=+vz>I7{o<>DBAq()iBk~T7 zTpZR8^lhs={->h3#zD`I5s{A>?>!(H z&}4kcMp?}M6&~}+8TqF9-WhPp_>wbli!7$W6WMWu`kZ9IRyb#T(F@k8Q;x`6;DE7! z+a{UNVFaFrJC{bT(U^Q}m4VeE8F2tE7E}@?uWIDI;n{8F?w&VQY;ee`e(6?1c?*HZtx!?1fJl zd1bc2Q@UUq47_ZhUFXS1;a2&_BO@{~1KTii;=qiYJ}@Jv56sBv12b~!z;@*CV!*)u v$Uoq223~3$j}pdZVC9Y@E&~%n2qC`#Bk$(1Rh5f#00000NkvXXu0mjf`JWJ- literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-mutedTemplate@5x.png b/core/src/app/images/systemtray/darwin/tray-mutedTemplate@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6598a89e52d8ed24d7e6a718a48facf2880e52 GIT binary patch literal 753 zcmV3kmD)LvJeUIfO-mJ%P zvx@wc5%|($yj_psb`{B3yimyd$W+=?%tvto}_UJYqP;3lhc)6vm4U#;b6O z7buJuD2x{?N;PZl?f`5E(3chiU_dEH*wVkO1BE7_}D&l)n@U1+ahzjA_4pahJ zg<4><;DXo`eCIJ{?_Y|*7xVCwfKn9@}xFHz&@EvbK{zsKO zs-PBHX)$J%f*%~><-;@Ky6RLy*@s%-xOlM9JzkS=O-D(dYMrpy>@F9K68ns|9o7+)yzd^*Q2&pu-)fa`<}Kp&Ti!0?1m5tl!BPvCp*AilVs>`rb}Dy9$pKv7*uUkiPT?i+em$1n0tyN1EXQ zF!N3U$;ZBP(sO%&g; zG~&>aV-o6#QpYW=bY&a*PMfVU$R;sId-a*v-*3;UT>wmNy0%sAd&s<7tE yv(ito`=wv9zO+-|mAuoUe0N`q(^sKchIThCC)Eq}{FnlC8H1;*pUXO@geCyawo1ML literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.25x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..2802cc55da52b4e530f0d866c5bd84aed41ced9a GIT binary patch literal 261 zcmV+g0s8)lP)vHS-V5$7eIO#2gS*^!k^jtmb>(STD3^j( zj3B@md{iO|KUNI-aRK?jCTd|W4SSGhE^z>PhmUYLm4p+>y?rzx6J3xGw8N008zL?BEH=!1e>UaIB3DQJA+^p-4F+!{)IN4 zen@Rv)Qd*Jyl5&Q29t)3uXcqZ)6u5X4*TK#O+Lay|9Y}tz#-H%fZ68xla4(D00000 LNkvXXu0mjf-bHDv literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.33x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.33x.png new file mode 100644 index 0000000000000000000000000000000000000000..f622e9dba2618bf565208f0fbf6f67b1cfef2ac6 GIT binary patch literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^vOp}#!3HFE9eA1qq&|4MIEGX(CP{EHT#%772ppwp?qAi(6n=;X-cqRYt;vBU`|tj6fU*&yK5(&MBgCcs!-ZD6qM_S^pV z57{5=$&-0)afH=xVv^Xw*)DxtSsy!CSu#28Cj_=J-qAI`R-4Rk?6FWxy}I&PId^O)D@*8z?*z6+WHlnz>_Jc!%Pc(ts6$MVUBs}_?MG|0?Ld?&Oj z*U2y5pq!2M16T3x0ETh{b9UAZt$wzSwttk|mWwTvGumO*AR{Mm@G8UezUJf?cctuj t?eDm^B=jbUUaxTMWcq%?t>@ue{tXVS){5KzaRU9$;OXk;vd$@?2>`1eXmS7m literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.4x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..58f39527990fd861c2765f4e82b460ed982f0902 GIT binary patch literal 325 zcmV-L0lNN)P)!7w`a*E7*u^XJwPt!ot#C2v!y;6hz0rT!JW0 zMkEiu_OWD=>@@0}2z|tuB1Rt(ex5EIE|3>4aOlE3AyPab_~echq2;5`ASFjEuzhow z%wj|VT&ehk0h$<>4)}^g0Cgs%!Zq5M;RXRdN~(+@_lovtVF&qAt{uzBE4iYB6-0+V zMV4N{97Bj6eTp2sf*v*yJ^Bg$&WZmYN4rgtcGq^owp?^8_^WOpVK%)d2ti002ovPDHLkV1gg@ Bc;f&7 literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.8x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@1.8x.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d161ec70fab4021ba74cba8fcf402bf45e9e86 GIT binary patch literal 387 zcmV-}0et?6P)Nkl4mr{n#??n8WZ4Z^Yb9h+ zD4M}q`EebxWDKlV4)-7fQJ4p36~uOflQJ0TQfEAXQXvehPyy*)Q!K>|yhAYl;t7sm h9HJ-6Fo0kb007F(-o4*gJHh|}002ovPDHLkV1lDtol5`! literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@2.5x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@2.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..918f2c2702cefbb22a70dd263bb3a2a0853773df GIT binary patch literal 461 zcmV;;0W$uHP)xQ>+idC@o?(Dzbea1O+7WYrS7!Q{- z9sK;l))Oxe@T3l5WBmuY373y7tMDZPaFbMUXf+Xl7RND`UAOqXb z2^}#PXYdSJkRZ3kk9f9q|{U;~Q8HXhhMR^Ke&Y4_=!_pZ~;ez7K zTZLPJGnW-^;?8W+eEiZ>f_^#=&ibC}z4GW=r1P?>@3HEbK~Whds}6`1?RPTTQ*hDg zP}ZVb=<1Kt{Y8ks!isD8crVW7<2`J_K!0uQ*AA)z4&R%JCBFy500000NkvXXu0mjf DF$c(G literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@2x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5c078e2ce9bf63d3df49343a2aec769a32005eb4 GIT binary patch literal 337 zcmV-X0j~auP)9LMpuyq%{Ch6Qa3D}rgg%CPhFBq$iyd$QPj^Ko_AAZ$tOORlZ_{61hfE)DN~ zj|%(3r(d}3?tlOONNXh;v=}gb8PK9Zi65^<4=vQA#=$GlLEqG&z(J}oLWxFH_Qhg` zVtBLy+~N^hXmo9l4vIWugEQ?${Tos=?li z@%2AIn7yXjbH49h=g;p2*6i7x?|j!%7D}ZY7HH6-!{DJqiv|lgT&Wx?^pL;Qqk_Yw ztw4@EkYb%kU8I@DbZRof#R_dIh<_7uLC+8;W`d*3Q^D_N+o26NASIXC@K-W) zvOx|Ll^7sl=wAY-wScrJl2(V(GFe(LRH(#q#=_|mB~q!BZodIJ4l(wWS~PJ00000< KMNUMnLSTYz&*l*T literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@4x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..c86c4017366b71cc5318ec4e7bd9e55ccf68496e GIT binary patch literal 695 zcmV;o0!aOdP)#cB0steiiHMB=0B&&r*uw!J(Gn1JEJ-X3 z?id=NR@r~wrD2`SjJ137etYlB2VgPAn|(9yy$e2{&*$^a6`+X_dl+Jj7?Xcuj4{L> zLNpP;_n)e0V}JyT5iYD&Dmgq$JBG(tZbHCyhHgLLY zE4q{GkgBr4n0t(8xQNqT!W}$X;h0>3Og&gZzwr)NFkb^N@dbZiE7pTVEm%Pb9$>zE z_<$+wjI|VIXd_qw-?53b8`#GbR+13{I9mr+z&Bh++76Ck4(PziYKUMte&9CJcJUMD zhzK<}SGV8;?LN{T!yMFwQ&kbea=by>4t~KL6r&1fYQu6wxIFhjJBB%|4QD!l<#>X$ zeVF40aH0T7f$3-kv$imWIW9qf(%XjRc#gF9FcD3ZUI@!D#ZAn*g(*x#h|=rBGJHhZ z3z(2TN^c0u@EU2KVM2x|y)i7qE@lOoz=VuZdNC}+7G`b0#Kb7M{JU}!SMd-gW+HHb zrA-8e2x+mvLr&UQ;BT6=p}<5#+Md8vSz3tFYr@u4Q{Z)_tOS9;3wK!qflo%#+5#Uv zWyPope72X>66EOF#Nt0uBLou5S4Fj?7GR6%Np2w!afpiSCK$&Zp{~D; zYw7$pF251cZ>5#bZwB|r83^PLG%^4H literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/tray-speakingTemplate@5x.png b/core/src/app/images/systemtray/darwin/tray-speakingTemplate@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..34f30312905bae1bc72078fe6f69a0fee14a0c5f GIT binary patch literal 846 zcmV-U1F`&xP)g~1Lz29&DFCPH#y!Zb9_x}I?3D9x#~RHkSW&%Sbd2yJn3<+ruk8m1?wS+a?!E?Nu`DoKxvv5N6d;s#!04|2?MFjXq# zW4vWNMK^+z^c2iggG}ffG8pd`K0zX?1`}mM4nQtqv=rV$6v#kzF|;5P_=*b{Z4EmR zC0d9rb%;>~M7|OvfX|4*Zxdov36ZZ33E&O< z7SV?oRY&A&KmvFIze^Cq8i;(I5FcT45W_l%d_712SK#*$VptE6ZwLwCGR|QMFCm5v zbzV4UsPj?j^mGnRoQ}@vfYZ=90e9*;KY2MNogbN{ z|Li6UP=^mr&;O~9GOJXXWSSW!SYnq7{S-DpjdSWmfe+58am^qdtq@&Wr=vTfOAUI- z8zO#bguE(|xTHe8;N1|3W%3S*#28s6qHUb4DI#%1-UX2;ku_KFW{JcVc@IRQ!4^+H zJp804!7Hb{5fo{0%nL!2yhYv#p4niY9ZuTzD6_^RL5l^xG|B<@Z1Y{4+_KLwf4xt! WL580E*%0~w0000 literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/darwin/trayTemplate.png b/core/src/app/images/systemtray/darwin/trayTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..d8531fd0b489882b4c222489324f3871492220d7 GIT binary patch literal 232 zcmVP)PZP14zV~h z`<4Hu8qj(Wi#~oZ@ZGGtr3nO6lre+APXS{HCeR)s#t0v{!9R*d8uxgI_0=xTi{2dL>L}66nAHjZ00007;Sk9EB|D90HC&v)VQU|PFmK>az=uo0 ziD+Y8M@}<;D)U8&OOA;u@)W&|ngH~XJ>;{tV2Q1gh`}e#{NN__lw4f3QIohw}=A-KHn=O5&a%<#PEo}?!pq5Lw3(eJb-v!}Gc(T; z;=hQf4$Od4@Ccsx^9-o9G%f@u z5plL!Y<}O=^a{3|1mR>b4;De5aF+#O>qioDC)D4ciRK&kjg91yBq||fD%t)bg`uKRg@95ZzRl)=B>Qo9nldI+BeD9bj z1UW2t3J-C42VO1VQUwHwQQ$3%iB}@zBM4AocfyO&E)W)D3QKGP#fqOd3lx$$yFe$o zmISAwz$5W)D=g`f1XbWrJ7{hS3wxKXA}mI`1iZS#ONiPeLCrq_R}li<=a2?|00000 LNkvXXu0mjfFov8a literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/linux/tray-muted.png b/core/src/app/images/systemtray/linux/tray-muted.png new file mode 100644 index 0000000000000000000000000000000000000000..756d8ff4d5941b264f81b7222136b3b3828c28ee GIT binary patch literal 381 zcmV-@0fPRCP)@G?8lEMpOTVpp<4n~KMP5H9x)bpBWXAd&uBk?{{Nhn^%P4I zzJR3Oofr#1u6u!`DIQi-0Dbc8b6(yXG@m#E@jf7a4pK*KFohvm@B@h5;BqA;+#e$% z&SLS21gUW`8!cb00%A)b<_4!OKfi;>mXI6aSwQ>~&7!|R`~egvUn(m8QNt1;AWj0} zi%6DS1LDsAZ{7rc@buh6nI#B|8jvh#z?T`RXaS}rpdz2j79cEv)+a9HTHpXO7>XSj b1`7ZHb@64mUV%9k00000NkvXXu0mjfdDWJj literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/linux/tray-speaking.png b/core/src/app/images/systemtray/linux/tray-speaking.png new file mode 100644 index 0000000000000000000000000000000000000000..47531e56a04e5a21cabf0614a00875b4b3d88ae0 GIT binary patch literal 420 zcmV;V0bBlwP)M_u@g{Bezo2=42a=Zb9h&sXXxb*w)wr^~o{3 z2DpC085%|7U{uqA3Rw zR84ECW&s%QX!Zc}w>OzWgXs~~EPxtV0^<7}>Ewl_C@NdfoC@N5?QM~VioK_b1<>&R z|;J`0W_W1!-n_#?Tg6~S+s4~_U9qVs{vjz({EOAu+lso?+r|BN6u zu&B@mWi+7S-+^V597v38OVH(g_O?g^eR2aN2g-0Tak4Ez5#QeI02IFq3wv1ZrpOYs z`1%ixi(Q~(3X`MA64X@G_|r+2Jo+gz%Jlp zb8|NZxWXQJ_K`SB{re^-hqo=@bc*5zk!uMBJ*Z&$<%{rezTM#zI|<1A^Rd7>Gd?k6Gl>^N?S70WHM$~Ec_`t2Xtknl$(TKT#h{<K&RESQYN>S=9l z0kgr_Sy%5`uC`db`EBet+s6#@8Kr zG?r~qj>%TY*|2>R>|FBOn1jlEkQdp?+cytdQ(g{7j~s?kRs@3*?6S*bGJyAxMpLdN zTwPs-@N`xPkY=P#G#&qK`cYj>7%{@GWnLyU$R?S`t0JHA$mkf{>FZCi#~6~x_VgEU z4|=*U@g3*dl}&u}yM6sIH9aG7GHFw;>pG{{3xxXEf$=C?Gb?oS*6oyv66@@2C4Drfs80~dNV8w$ZTDD>A> gfP{(RKmHUy02wIOhxmh?EdT%j07*qoM6N<$f^t!!-2eap literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/linux/tray.png b/core/src/app/images/systemtray/linux/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..4d418af98904bfbf1d19ebc3adf0d52a29d5742d GIT binary patch literal 718 zcmV;<0x|uGP)MQB1`q7owd>vo4<6WhczF1qKY!k&dGqGm zx^?TeZ^DEL$4879aim9&9{bw2Z@#Kgo&59LAPE0vRz zlgnp@@SD6B0F|y;v*sp^MxzzqDGfvxnd*Rcd-v|WCw`E~B2yhOBP1jw@<#=bMJCx) zxyFqfZ#6V4A zyJV8hfWA16?c{-oh=^$PX2Ui4%=d444h{}psEvZ_lq*+mU1nxxw!BX!*$kNM>+2gL z54gIz`l2_MzayXV-tSHC{{8#5sP%c>n-?7&9WU>bNj3)-rlzK*f9P=I8H@fbKJ)#X zUV3_ZW}`-p_#4ljHEY)C5B+^)lFfjnI0-f41JXiaVPVmHmV5aSezq8#mxd4Rl1VlL z*2qm<0usg7i91OKNL?eF0aF740z%b|tgNi;3l}b!Ku#GM8Cf5L;);^b>($w_XP+k| zBqXVOWRlH*mQ|}(-RR=t;wuBZy}g5q6)U!;W5wzQ~xN#0001QP)t-s0000x ziDEB%TQ7TBE__))fPgQ2S}%N9FMC-sgn&i=&GG001R)QchC<4Of@71b6ZD%(@W1@S|yF<9KtCqjV05qIzjqij-%Qd!xE_ zWJz>k0001$NklwB_hy4CJ&`#TvC(iz6 Y0d7nWJ`wWVTmS$707*qoM6N<$f*`G=-T(jq literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@1.33x.png b/core/src/app/images/systemtray/win32/tray-connected@1.33x.png new file mode 100644 index 0000000000000000000000000000000000000000..0db438c735c18a950ee68b43bdc88fbcaaa20e07 GIT binary patch literal 604 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{3?%2B3|#`GJ_q=OxB_X@h6ID!Nd1~9{hCO< z>PQ11*$`{m0OUsKRY&O6L>e^47`4P3HpS}KMnOaj>!Lx*sw4F4qb;XqId5oi+0tY^ zH{Y-&9;m*dp~1L4(P?9o#pEoI_L_+B-TnO+H!r$%z+!riUTsv*#Z7ykUS4qHK=qlG z#vMsOHO38TtM49LdFNQr&K~s4WpF0(MxG*~AQ>lgt~U4Qrz8mXv|4u8lBghz5Gip&`M%734dh zIX~AK&IEcpuq4PYm_Z_?Z^_hB9i^53zTY}`?d|__&H-N@&&Wz^Ki|c)KV#0%X}N8a zrpC1{pIEc^IoFKoSw%lvFRsbmc)fke+sSon?;YFwv1I8F8JFtM-Oo;Oh`+o4qed(V zX!vnY7srqa#?mueotzy7S|1jtl@*qkXI$tKU;fCBTlO8_#}wUpf1a8*%@Z^{_Gzuv z5x0Eaxl8q9{`7ugGm!hA9@(%yYA#Rk$LE_}+m#n5Gkp5?Q6a--o{WS0k6PtznqLuj}P;#nQxB?QPsb)x?0X=)wal75o=% zWe#0#@n1UUpmDbG`ss^h@)xZ-q>?n`1UI`^}&xm@j75!&uqIA{J9*SfB> b7xBC=HY@otxTjgTe~DWM4fFJ=Xb literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@1.4x.png b/core/src/app/images/systemtray/win32/tray-connected@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bc8d65c0bdebe01948826e4e845cc973ba8325 GIT binary patch literal 663 zcmV;I0%-k-P)fj8q`5;+d*yHwr$(CZQFQXky-ElxHEC`?YsA$ zb4<0h!&C-IhBDfrE8U%zT&Z~P`sou4`}ONr8kepp4nw{w>GCg0SH3zd^@*dGc2B_H zanGU4ANV6rZzXqJ(87b%90IhBk6r!ioytF{&6v__`m`v$zHih2Tame)EZ?xkYegj= z#CtDYmR2e@)RZqthWfU^ls2P)MB9oj?a|TQukJZf**AxwR*hIbD+OA3K{q29Qhw9G zW*rXB>fUDmj4uB7OKs@a%-z4wLBqUdP@1>Ryz9Z#=(0ZURu8S-s!phPORu1 z{JhlaKCPUVc3)JxI|R(2=&An)wYH6Fv-ZyMS<7x5oLp_&u-4JqQeaZ+aewAwD#dIl zC2*5L`MFiQZKlp;{@J~mCz(8jl#@+a|3xp~;U zAf*TtypK&20R1dvwjgT4ky7*j0jzawC6iG3Cdr+zQ`whOAZp}b=q;CKK002ovPDHLkV1j_2NgV(H literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@1.5x.png b/core/src/app/images/systemtray/win32/tray-connected@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..64ac918f791cdbfee4dc584bb49f182f88a3fe51 GIT binary patch literal 423 zcmV;Y0a*TtP)nP+rz%((~{Jjo4sBvwHLUoJ20002CNkl_yO!XfTvIKT-= zh5Z2s90jCRrv*N)^2Z4}?%#bta}r2+fn*8cEqQC=7uzpGk0`uRiQdv8F(<`g5!b}QVK1CXQ0WI>MkX~M8Cf+bKwgn0p-lQ} z1sfFptmU-S`5o8OtghRKCaR;;nv%j6laf{omauoWF+^zh95$V1a~TaIxcdG^0YttRGFGz4`l4O*)AqpTB4iuOFa zyzJ!bJDWE?K09~jjXmS~?i-hGlw8wMF^6ryq}Y%aj-}C?;pD43N1u9qcgv#NhbH&k zJ0Z=VHg{NCk}FX1l~wzm9~V(s0}37j6m3y|JoWnS(X6_SMQ2u&20Guyqht5kHd^kZ z0R{2FLp3dOPA)1&g~0$K+RV)!2T+lcB^qgi(ujj29;rXt%Vvm{1_OxbvSU~hE9N&V z>Y@i|i@{;_kPVbZy*Q{+J;OjlP~^8vsa|`4Lc9SAX>)&h;q3#HH$FTwFBCuolgj6i zNHu5;fI>^%U*7Wg-26E=_Kpu3)FOXi<9p@-3VXs5LA>2xjy^O!TgAh`XS#Vv8f1}i z^^DH;N+(b)#2YW06|H7wOt%SyJVgTvKg2`0g_)p@M@5~onFr~t0fhl$*bsWSg&BZt zR}@jEMxe`M&{9_lVZg`=_GC(x!y~U*TdR<8L&1mR!+hnUy9V!)Qj>Dykvla$rBdda3juYR%M%f{&0FMC-&gUzipj%PsV zw+8?K07i6DPE!CMKUs4(h}Zu%z!9kZ+pCOxZ7ACMxN~Mf@XdGrubOU%oT!FynzFL4 zqJE39mwRVvn01+!Xp3^OZ;E?uov(7JqlbU1l>7Be00048Nklj1WOoO^u(-am-*@eaJb9=-1kpI_wj^@%s`oe3MC z-z4z;3H$IrWnlllWGbD>vUdXV!My(dcWL2Mh0L#4Gru}6L?;@f@!G+G&s%6;dUDF4jrJ0K)5F1Tbl7Qk;^A2}E|m87=+z*(8w}@QeHO?>}_* z)9f&R|B(_9arsf;u~E2uxGo>p r%NM}qE9LSfb@|%6e36P*^V2N==ZREa0>7D`00000NkvXXu0mjfnPOWs literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@2x.png b/core/src/app/images/systemtray/win32/tray-connected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b74c9c6dd40ef9c56ed48c1ad5a457fb64fbb236 GIT binary patch literal 551 zcmV+?0@(eDP)f62L)1KJ9 zhtRQi$)&{T*SqD?$m!dr+rvn=hG4&xtlr4E~_Z<(^E zkb-)yrLmP~aGIrbdylB1kn*d9vA4-p0002`Nklg#qAu@hPAp{z$u004wAE>-HtWJ>@5002ovPDHLkV1h$C2O|Ig literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@3x.png b/core/src/app/images/systemtray/win32/tray-connected@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d4582640ed1e1ef7ec80d50b5c801e474846739d GIT binary patch literal 862 zcmV-k1EKthP)VK`%Ie!vxs0OP!N}>`$LQLw z;L3*3u4=@bOSXn#z?YoYzEir5bI78^=hwF4&SJloV!)Qf=+{cMhcA0rGKXKI*}*rG zYi7Zj$?Dsz-pHNUy;Hl3iO;aF-pQ-o$A{3dx#Q4o#h$?B)iPTR)c^nhQ*=^JQvfY{ zrN7zpkKX?tq5TGk`1Hq~jC^fv_Z7p=jc8^r;M<7(sP&J2iE4wEqNj40u(E2Av9X$g zbZK#pYj~}paB{9_e8-cWbF!L`Y=oSbf}?h+8T>Pz0005ONkl$}gu&=BsdR<`nRF^P zJe$h{6pE#CrCO_$OT_{}J(soP8%=;#yCbU8ZUHnKR{YE?FgGs)=I4Of86)0@g+(ze zE`UEYqA?3g%VJtyg4xEvd7H4bA~9B$pxJ-&Raoeqe{FqZb4%3n0_6JcKM#wdws&^- z_V#vr&jIz`_ejH>yxKoF+&elxIX#mebCB-IhYaX_o^S0PU0e>`E@ToqAb^%cuCDiP zZe>^t0v!-STmHGb-`jW)LmNVUGblv)aJjX&A*N0NUSIDKp5&kBy_*NIJ;7r%z=0R} z>+QRvTZvHuCmP^FS^j#z_d(*6!HouZQ2BR)qoa=!rvhFyz=x{*@oDd~#Hxa?1E|R# zU-rIAtQz=(Tl%*5T_)L*9{R`8zD#mx2TEcyuT>vzv?3&jQ^TaGkuZ`^#V4Ppx6Mp% zEg+i~kX@oSEm5lpsQ4zJZN{c;X8J}peXE?l8BgEtr~XikFYD>0T&Y$o< oDn-hxU4-wQVHLZx9K%om0Hef_niY_6#sB~S07*qoM6N<$f=1t`(f|Me literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@4x.png b/core/src/app/images/systemtray/win32/tray-connected@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca16f81de7971c6250cda180ecd918cceed59ee GIT binary patch literal 1142 zcmV-+1d02JP)m0JuYNFqU@m-FE_+xqhhRUbcrSceFMV1&pK&mOT{4AWL$H8x#-EnexvAX7x#Q5e zf6NV*H^obrrX2G>f6WY+PmY@tlq{*w}zC}x5nt%n%BK*#GFO7 zgHpMSv*62j$)#eymc8ZD!spkB(6M2_m&E7Sx8cq~u6-|iSyQ@=z2(!Z-Ns9{hO6Dj zFMwK@*SlK2lE&%TE_+#M!<)L}(4N@6z~rY|`y1Qsmy>QT0#1IG9K@7EdHo>2xZYh{vLl$<&!_E?;nw&t)@X%ZsH{!G~0- zINsUIl|lfO@)({}Yv$MKdZXEDcRKA>vr$i*4{KFL-t83(`h(#J9E^s8e!-yE4bx9e z7nqsZIq)zyJ5yk$r-JqK3k70vX&HQ3URvb$3-f{c6@I_E27#=t7KoJq3sc7b*OwuL z<#po>zFu?<|2H-vl+6tz4t|mB8G2ALEcATxZ=8P<1Y6rXyL;|47+!elAyVV`3IF#G z4v{z#ao|YSWKEVifA07npPV9b2cpZj+fY%VSludX48S?+G{_y1cu|0@V(#1kfJ8Hmwc z-Fo@%JzgDyLY*Wr%fJV^Ygq4g5U)X_L6Q%afdt((!Q><2Cs1jUBw-my(p?KoJ|muk zN{b{(%K(>A8%)07SI}v5DOm z5GX+uX}tXN7hudZibB#6g%lU1tP)(xQD-yh$Yzr5tRvf54ip_ZP{c^nnG+*T3{?d& zRK-}=5o28}79Fuz(Fly*31-Q_`ax`NOKa0LiE$%D^~Jk^lez07*qo IM6N<$g4d2VGynhq literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-connected@5x.png b/core/src/app/images/systemtray/win32/tray-connected@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..9b8036b3f7a5a9b038597e4ce4c9f5af740a3163 GIT binary patch literal 1371 zcmV-h1*H0kP)f6fd z+rZ}4V84{8-NnY~*-p8LoY%a@=-GhGs)Ww0$m!d$;LAm|gQD8Nn$@~exs0pb#$3FS zFo9jW5plmgnBvmls$ot2%2AWOY?yt;p}HYdfsTlJ#l&iXUiQNLL@_jXX_q_(HqV;jEo|N(UE+^aHL|-+4qf&BbM>8vu});y50W2 ziCQG0cEbKg|7PrdC#R5*sY$zQum9}#CDju}`;8tyR#-oW&pSOcJ2$_er?w6ce>01A zAJ8l4uzfhx!GN4MvcSE zb()pr3+jFBt%=(H!Sa^(&EyLuDxZy|`*4-RBQxpoG$QCT_6}xvLB0^kgOe4}JH3NQ z`tyZ?fMB5<-VJQy9?AO;5Qj;#!a%>7KI($Y!$&0NA0w77(_B}(@TSS6455NZ@YWWF#Xo(F8DRM_87@%G+mhC z2xiJbH5}fMe2b*Kllz&DV3r)z;F9+r$WtVyM($@hg4w~`dPeTV_*tb`wj-D$2X(mM z<372KCKRr$Q zr>DaqJ=HcGbbM*j$CnORP0D~3Zm9~;#8kkoxRUbYFDZYG`tjFjNYQs9IsT&mONES;m{C9zo#T&8oWR-AwCuUoa%GO#caB4w(vYb5VIv dcgTTJ005xS3`F_60&oBT002ovPDHLkV1k>g$2I@} literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened.png b/core/src/app/images/systemtray/win32/tray-deafened.png new file mode 100644 index 0000000000000000000000000000000000000000..bd965e2f70fc06e5af77036bc8e3d804624f4d11 GIT binary patch literal 301 zcmV+|0n+}7P)K%k3nCc>c_#dVO1oQ!M=(q0fesn`X;!xZN zQiy2)8bEdl%!@EN0tO%yAR7V{k^&h*k^xu@kpvln%YfhL2H-Jd6E*|7K#2sG6Mw8) zbp*)}CNi=Z!X=+QJwwROsh_>Pg1`Cu%fk2o%o=J?kD|ma00000NkvXXu0mjfN+5LO literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened@1.25x.png b/core/src/app/images/systemtray/win32/tray-deafened@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..cd85e4767b392e62b851f6d9f153deaba33b39b9 GIT binary patch literal 376 zcmV-;0f+vHP)9}(RtI+U*R-BG^te5QtcZY-*G~urAo-^ySE_2Sad+(k3p3ml= z%j5U=Hx>v)tgRAH&+7d;tbPH8BV-DYposSlOK*G~5fq z)uSxOp(p^%gDDWitUefwlXM;U7ziH(Ax0_Gl6qKhEF&cCV+)=d8dB~>@kS-JKUP_jN__v7( z3ERKcmr`5B6Qwk!mlx{A*Vfjk{z~z=L%YUuAr&$$MSW_EkP1ypZ4jE5^1^OYLNn3| zPM8aR%$?20%uE|KzqT~cSYKsOKlT#YOii{@%JiuX!EFDosAwOP{CAl2Nf45?zx@G) W`7iv zx_#r|;cV`0(cy!8&i!`pZ};{5OBrK&Ap=>MfWdBLqi_f>kgj*QgsiJ@86uIq!4(|A zIW%Pb8%ofpN}_yzvg!K|AGuscu6qMtum=OmkFLV2$WK*i)AJS}LEI4W2+UZ-^C;pC z{j{F9longYG%GiHhJI~eD5=-)e<41DR?Tb8IWV8K+J%dlEsG-ERsV5m?zlw3{Iu*l z)|%_m+;Yj7`6<~~=_I{|VvD$14K*>n6(|Y^Hqvw@+KE{Ym05eK7KOayyRM`bVt1*f zSe34|lUj&xVPBJuL()+y6_?9_A|8{r`c<7kMF`u>ZO1`SQs1$A=~2LwDHMkPR2=#K bW_s-hvAvrepX~OS00000NkvXXu0mjflaHub literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened@1.4x.png b/core/src/app/images/systemtray/win32/tray-deafened@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..f6f250442c3624ef277cb54bb9ff66c6c3edda14 GIT binary patch literal 407 zcmV;I0cie-P)e(=8k_uJmPukGJUDb){#K}RcObKnfTgJyk#8?Xj?Y=ym`tjQYS z7F>fT?fenU#EYa%d5*JR&t!&3d_aS5U>S5res}^@Df0mYEB4aqMW7(R59J7Ufo(8i zxK%q?CwUEwv%#9_}0AZ{N=!7gw$ zW@EB$L(0SGwj?X&S-_nt6gpcf_k`H23$db~eFKY2*kv&MvvL3c002ovPDHLkV1ha2 Bun7PF literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened@1.5x.png b/core/src/app/images/systemtray/win32/tray-deafened@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..73d95b838cf34d4b45d03a2a1e24714a926b7781 GIT binary patch literal 365 zcmV-z0h0cSP)(eJb-v!}Gc(T; z;=hQf4$Od4@Ccsx^9-o9G%f@u z5plL!Y<}O=^a{3|1mR>b4;De5aF+#O>qioDC)D4ciRK&kjg91yBq||fD%t)bg`uKRg@95ZzRl)=B>Qo9nldI+BeD9bj z1UW2t3J-C42VO1VQUwHwQQ$3%iB}@zBM4AocfyO&E)W)D3QKGP#fqOd3lx$$yFe$o zmISAwz$5W)D=g`f1XbWrJ7{hS3wxKXA}mI`1iZS#ONiPeLCrq_R}li<=a2?|00000 LNkvXXu0mjfFov8a literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened@1.8x.png b/core/src/app/images/systemtray/win32/tray-deafened@1.8x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b0986785ae646f34ec0fc6d6fba41a737b0a88 GIT binary patch literal 468 zcmV;_0W1EAP)sG&LFXaCHW&weU`8cmTMoF+Phe(tdCADg zgb_XkvrK2Lz!KazG_WVY2aGV;KJbVZIyzpOH!!H4*Vo@$FfZD0IUamMrq^b-lRz%7} z94o(6xLCSWr1&c(b>%PRC5{2x;3g&gLP@FL>Ch*^igozBB*9>fr9k-Bw_39BO)>RNHi8hmtGPZ5|hLrDqR>@B@8ATF%bU%AwdXXuv(Bv`~xDS zZL|i2-k;xalhZbr)7R~B41JPkYTuiu=bn3Wd#fr`_yGXbG(zKak#2e}(rMaDt8Ij} z(=~bzJ@?*s+x{XfOjqd#6Gs8_Telr%=dQ6$u_$M!db7kMpl0 z0o2n6C@!T3=y*vaE(}LbqmUNK@GNyrMgnLky8X;Zh7T!WWITRuF!C6R1Igem6w9Xe zB!DF-t|Ws=C=!ATC&)g0k_@^~jGDT-!DB<=3I+=pF?9<9kBvM62I?bi1+LJMVzcAp z`}#-~@{KD20=2lMt|T;=3Ph==8$jAhpx`N}ho-Fr3L?8{+Crc_(n6p-(n6p(GG!r9 z6xl^n#skY3nUn;sJ_nh;* zmWdGJFJK0EBiiS`#vb|;$OQU^KEQSL5SzswAMF3lS*f6pR7lYIJl|g@kqm0DCAf!YNq6#gi(|3A#~`1ba#H8oJC11g=^b3@BWjV)qOsLGmAg@*8Asv zfT_9RnpFd!y-Ge_0l2qW7f*;@xxB?D?L*O#~>=!5lenZ{IwwcNJy?f_}?%z)z zdGh3{9|4c@pIC5dTbLoac;!D8Y>DxwPcIDLzh6Cc@1DZvPF;fbK%rVm4Y+AykKOMF?b@FL=ngWCoMQEPl618=S0M1!;c?df<#-G5_>E>w{{1RxNVPw4WT`u zA5OW9Dp83WK+g-d1P0wMAfaEK(zr!u=bM`wh95lWa8iOUvHD}jaZb@YpdisGAfeyv z-f>F2KuJi@9eZ`Wk(X!>YBPz6ADlX|>9J#V(m5sdTFEu1u1@sqv^v$Ck}<91uv3>< zdH`IV(a1}*IDMZ`S}ZT%OUMiGCFBM865;{@L-&cm68wH=1Spa23D*fkayU_cv8x0a zFGa_632_0YM3L(R_!2G>V7y}&$qU#gAt1n)D0H0wUqVR028ljd0lq{5)#q>o`YaXD zB>2!1w9= tMqvr;fofyTj^8FLk#4NnEskNh0{}(opL^i^sjvV5002ovPDHLkV1kZq49oxk literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened@4x.png b/core/src/app/images/systemtray/win32/tray-deafened@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..4e91fd81daba44242d4c70671073a532f2d42e48 GIT binary patch literal 827 zcmV-B1H}A^P)XO6k^-9QC4gfVzUt2wr$(y8LPZF>1DS2wtKSkulkj1uKS(u)^g^| znKNfGn9t{X0Xb0@-7pAa?i!44sEeF<{zoUwNJ6Ab#6(oZ8+N?-ZD}!wG)@&MWmaImvvwM z6Kq4coxuR)!wX@)QxwENoI$v4!)I1jEU8$rUvCsDv@EGek@tce_9dJ^sBJ)QJQYRU zr;s085Na3jy`^%=g$w_lP`L1A0{E~yM1<1Fgt!x^9Qfi#4x~9n2bPMWwCgO@G`a|&`QKhgn!_LxV?BLULuS`pcSxG z&2#bM(1cQ@4wx8$i++s^h#RQ#3(h5PLc&#pBTRz0)2bf+H*U|=2pp{%0_`6a4{r%( zZUm0?CR`BLPQ}9~_=I_{U0Y$=7ep4!jDc{ls|dOd0}cji5h( z<_P)&=!>8~Krd7X#eMW>orDr4_Q^&NpBqB2SOy3>@yBM_j|88@^aKzl`{`i&0J2{b zc!bN|0p$PMTpljl2hbJ4r~r}?%E4vJ06HTW89*{ZS-5N!KxYJ_11N})Y5M?@5y~Lb z_y9U17!g2c1oH!^i%>d1geyh_&=_HziU1zj02(9oRuSO1bO4D6(fk{ZH(Ls+_)002ovPDHLk FV1lakcBlXV literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-deafened@5x.png b/core/src/app/images/systemtray/win32/tray-deafened@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..5172318a79ab882c98683bf7c743859658f00bcd GIT binary patch literal 991 zcmV<510ei~P)5FWGXm-Nyohr5}!r4^8)oVKDjMJe3nv^}jt{-~m@>7}N}`;hKI;n+>z zH!*&SmsHI+$kRpN;g+yhb^gPCs=hnH+)FUOP9(o4TJKfXOLB@*Qa6A2tlCMSADROh`h@FqjQrRNCj{pZo|d~U@3^cLB8>2#6-D;N(- zzY)j6nSS)DJe)?ZphJoI$6PA$jo2OTtdbqRef#~Hci&xLazp?((F(Y8 zujKIWP+eUafr!oEP7}$&(OvrcO0g|v#o^oRiBbUWO+PGaZ_P(&nRJGk?< z#K8Y493#H;(qz*j0!YD~za$0@g&RwjTxr@Z4uFf{&R~gw%i+v6Q|}W2?1VEbB!=yP zGxJTo*#>AZNL!Di8f%E5dlmnx_|;}aV8X1K!J$o&Dq_?F%14ZTK>3Jc%nzt<#Jxrb)F9%VXa$syI2tF? zRU%-yd_Zj?J}VJ$g?0fINTtqJD`mroxRS;t0yfbyph7J-4kO|NF$n-%OEcOAG-1s) zfX8XMt^rMncn4jqV?dK4#_98P2+imcFwBS+b#?Z4i(@0&h&G~)Xd^PQerJqa4{!NcRgM-PvcFhjr^5#TXF1HSwEDt>Txe+V-K zsA%rS3mmtzCbcW3M%&w zp8;#2imE|T_wVV`haUq1-hd5x|6U#_wjYSs<1;`Fh`$5zA0W;IVy2%B4SFBEyq&IT2{$2c*dlr5J`k_^_vq1yk6~e7VTKSB792nvfRqdpf6tw3gB&}=1u7I^M6tX3 lQZfuc81l)}Gk|KD5CGzmA2jK=%+de=002ovPDHLkV1l*Obx8mK literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-muted@1.25x.png b/core/src/app/images/systemtray/win32/tray-muted@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..2581b65f604a187eda8db6335016ebfe85768ce3 GIT binary patch literal 334 zcmV-U0kQsxP)6!UIG?Wd^u)F^e;4aaIe)jUR`{?fe4~RFz3%6p(YSR5e8Dz&<3)T%-5o#CM;o^M@rIB zLkg>SP>lXuwdy*Wp-ey=g``doZ(0Q6Pf&$RVCnGJh7B*!46T5w`3l6Ggk0GTRs0W# zgJC)4`=m)L(G0Z*;%s8P%>~5Qp@#kd;&xc>_#7OZjch0>VJQH_n~=ikFA(1Z;#t+qR9{Yf|fXmxg=Er|!47d-bx$ z^ZY-c!Cv&6FBrz1r|FLx!5}yV>7F24aPTTB%KC(&PERRnNHvVe6sYbAYz2oAEIbJh z=jCC%`86zo<``m(5VnP7jVMRR2o5iiqvFFhup}ZXE-X5VHzYtZ_`=((($WzfVK1Wl?Fq#=#wk(QF9fE}f7x=LM3 z9AuNsxtiotv%sxR7;1^LzHfmC4$h6UHcyc$TLBL|PY-T5J?;lP@Oyt);N4Q`)Q0ZBQW2xi`Kl;A6+dl^!@G?8lEMpOTVpp<4n~KMP5H9x)bpBWXAd&uBk?{{Nhn^%P4I zzJR3Oofr#1u6u!`DIQi-0Dbc8b6(yXG@m#E@jf7a4pK*KFohvm@B@h5;BqA;+#e$% z&SLS21gUW`8!cb00%A)b<_4!OKfi;>mXI6aSwQ>~&7!|R`~egvUn(m8QNt1;AWj0} zi%6DS1LDsAZ{7rc@buh6nI#B|8jvh#z?T`RXaS}rpdz2j79cEv)+a9HTHpXO7>XSj b1`7ZHb@64mUV%9k00000NkvXXu0mjfdDWJj literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-muted@1.8x.png b/core/src/app/images/systemtray/win32/tray-muted@1.8x.png new file mode 100644 index 0000000000000000000000000000000000000000..24d7030dcbf2f42af0734680b4bd621bfd5d7a72 GIT binary patch literal 454 zcmV;%0XhDOP)8aS|t%86ChDirKo_A+_%k*XevM=14xY^i~t1%1`q=R1O$w+*v15iKt#># z%iLPKc0IW9%DrXVeMCL{#G=2uYj>yp?^n&X?Jih?EtvA|4@V;XOwbQ$pi6?Uqo5Sx zTreP;I1Pvy7uXVDD5UXFqSHj=A$aZnu?jx=sFXghG#Esb(@eNdSKGZWFDjtRkyJ7a|{y1 zVk^;Opc{v7s94!-Nd^LM%nf7%=vG>Zt^wVV^Z7p5Rz6>o!C=khh%cbIIt;fG^}!=F zR|3EDyB#Q4xm*?DcN)g$18@LOaMjLr-37V=jA&$LEVj)YaUYDf`wx`_x-uMs@7u4F z2M_GH%hRO@H*f~0^;GIs8pekgVHyv>9k9bSHf1PO_bN=|^Kc1tC$J2?V!Z07*qoM6N<$g7Xf@RR910 literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-muted@2.5x.png b/core/src/app/images/systemtray/win32/tray-muted@2.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..2666bc219293da923cf76cb48f87b44236ac38b7 GIT binary patch literal 561 zcmV-10?z%3P)(k+IeDVAm-uXKCzyrby`tZK*y}qY(>C&YQ7=|$eQ!rOE1!vs-(Qvr` zbAEoPiMS}NLP`ZjU5nF&NW#a0s*W%-hY(vTuFT|z5Jw-XYW&$K(p*ZOl;eSUA?6VF z!$q3=jVGr736W;tIb>0Qgh(^cOCp&-d65||Putzr8r-xC$(db6piFLAe*Ct?*Z1M@t)8m+lSOG6_?X>N4a6}?n z;FKbC%jE;+@0dyQAWneKBq9X2z>&Y4qDdkq!8?%B0(Zb7xD2j_mCBV=L=J4281$P> zBNBljv-o!0gOn%m5ZvgLN_Bw<5<`ePw&erlBlrL|!f`Id1DJ@nz;zd70~o?WA+It9 Z@C7S8&9W$+FE{`I002ovPDHLkV1k}2vCsej literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-muted@3x.png b/core/src/app/images/systemtray/win32/tray-muted@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..33bfa2d757acd062c7e43ad01c12fccbcfc57c4f GIT binary patch literal 611 zcmV-p0-XJcP)DYE+}%0#|6ZK_Yxmin4=>Mi z4U>?Nknn#2pbCxXd7Am=`EQR^(LVS#^a%VMp>0ek@)IVsdo^avvDAbKon=$rKloTg zl^}ypjUHX`YV>F@;@;mP07Q@znQ~*NydAt%5&_^mXk`s4lkNKKuZk{`vQJKWqYWxzqWSsFi~`4KT=MoxGXI|pv|l`>#8+??~BQrd|0 z?AdPxi_=cHSyRe@F7PwTeNz7|V(#1ze~JJwoSww*yrZp4y&~_1n>)0T@3IP4?6i## z%!$GD5VdS6$Cju+{RB5>XanORyJ}Tm>52_t0PR_>&FLoixkx({zOxGefa>%F{AB2I zT1S4^5k8`kW2KApgs!K9XbtlVnJDU+nmF<4zmBLww?oD|dXL_skAG~P=Fdmi2zSVI z`Va-6DWW!ANUuOnh8}u<_3ApoiXAkjIh_hW^Js5cP1TAWM}8tNk5C;Tk5C*SkI)n# xk2t0*KptUlve=s~x&q`8$Kr!m6_AjifX|gkA}+ewv8(_9002ovPDHLkV1nCH9A5wc literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-muted@4x.png b/core/src/app/images/systemtray/win32/tray-muted@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fb430f14b435d87bda27ac39164e342579f5e0 GIT binary patch literal 746 zcmVwiPw1qB5v$+i`6LwcW<+-LN)>#mv_)$r^WN|83vCxp^l!WBq6R zu5z#n2L}fS2L}fLP3bloOpsInv8!GmkdhsRBX&rRD! z_%UeE+;4*hd0c}B_Ynlxjoh=_Uc(O@2ntOE-FrSD2oRu6Z8f|k0)TChvrXkU9Cl;! z;Gzfsq9G?**#Qo`SsDR=3vyhFM05lINmPs?5gh?Q9eIT000u;;EsdavNf8p|0nCU{ zD>;HZfFThQtO;O11Vv1ZP&1qeikKcDULL@V2sLyOlpdoZ#K{8~96{+ZE<$x0D-U2` z1QqFc7B7A%j1Xf)01)rGb+Lj7)o6?z2XaAAx$G|Q-M;;;BtoX+WuV7vMSuk8X_?a| zG2fm&Kk~SFtr7IRvLe78=oy*m^4pOP-~Ro-q!9r0gPvzr1ULje`!ij>84YBJaPVMI z5&^&}=-F#UfYH$Njg|?Ln0^l@4voAS9 zNL*8<920&pcA(3Y)c~kRT?owqTIheTK;;VnCL%l@)B2`H*n#ly&_%SoQ4s(Xqz4c_ zF1nR=q=ig+C9Fm6`9d$y9dsd`N!Qb(^l9=h#)yhAfquY0gb@&F5h~FmG-!SVeTas1 z4|OAN{GvDA^XK1=xCqH1%F)quD}8~`MAMUWKJ7(Isbszn8ni_a!Cpw0!UPcv2q27L zPyl%Zg96AS7!*Jr!SDe32;T<|ylip+eS|@SZesZGk_HCQN6-v!cz|R${B+Im1_y9( caBvXt7ZR||ZJc2)-v9sr07*qoM6N<$f>Pu*9smFU literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-muted@5x.png b/core/src/app/images/systemtray/win32/tray-muted@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..3213ed77271b54edb9bab481d707caef16580dd9 GIT binary patch literal 932 zcmV;V16%xwP)exew$1C>HsYjq$<(;BcTTf+v-3~>&-^_c>{)<+vE8wous5(N)Eo4&?%01->c@DUv9}?1Zeu&E z*k`!Euyep>=zaeB!;MJ|21_LQ{r!vp{sfPU=uSMJ?J`fl!{*v+MBQ`+R@} z2_g*`w?UrU*neGzCq<+Y)l|ACJRo8n{0t{Yq-lw%Y)W{*lu)P=4jj)+A=2E=RBq6R z^$sFUkWD3pKCE{T0pJxFjB5b7i1>I^48UrH=siHgh%Y?}Xb`a~Avy@Chy>_u#46Yq z1^^XN2B?UYvCjl3{VlvW1pA> zR73*w5@I0mLWo$75IqJ+vF_b_niLAXGJyEllYoG+9y~}(ibUQD5zAs9yA>e?cq#m| z_q85Aw30e?N|qx2;AI7YmvkoqZvrnhes)=t5Fxp1*L1sxjLA1AkDUZO47_yw^@Vjp z?A|@g6e0k$1zs*X3AhD#85{d(2O;+8kz)c80EPiCJDdcZ0=%5%9WEloUcD?SA^_|L zUdA~ISOfT}%01pjh|zcv0U#eX9e8Q(^ho>wcv;9lU`dF*dqX^k01yIRUSR)r8gM!A zl7X$jKH@7!3}8>dud_4}=7P1bQQ+ky_AlNcb2%b?+}7BG@Z;1@lnM0?;Agze+Z^6o zckWzE?%6X}IN5H3-4CC$FOgOxm9Q4@Vqpi{J|R1NcumoYg#rL|v3s!%5^Y(x0r;`7 zL!8*fN!ZZZ^9Jw}#m>b3V}3u;y@=JYX<#qsu$2_?GvWZSpA775Y$-*=0Kh1$1@@DL zU5~AU{nP7+JqRS;yrk*O5Nr!<1#Dqjrj@7Nmch9fFK&uC#qs+`x)rg#>BHpqS1j&F zEQ;N#h;qn|*oTTJzazaj_B8ySWar+zc{-_M$0R7znIXz&H_; z{r*+7m8O7P#29!A$U%$;PXQ_E;c#gIo&q`&jYgxv@=hOLjf%>^hg8YIR zc%54B-h27w`;REwmp6f;iJmTwAr*1C=e_w38*ngOOv+)J{H6Z?Zn3QqU0VC+rZfK7 zq;gAn*D0Q}bDms#wKs5Ez94ho?e3IGj|M$(ZF%x!0dVvx_C>e37!+ odF|H8C;vA*ed$?p<++%hfF|pXk5^B20xe_kboFyt=akR{02@(j82|tP literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@1.25x.png b/core/src/app/images/systemtray/win32/tray-speaking@1.25x.png new file mode 100644 index 0000000000000000000000000000000000000000..d58e9f5d3a53eb6576a868b09d247832d1d6a6eb GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQa2?0JKu0XnB|9-zCou1n!1?=y4 z-qzx_y~%Z3v&*(7m+g(tTN{B4An6Ptw>Bmom^$nFZuf1?VSD<*_x45X?T_5s@4B_A z?BwF|lS`Vtku{3Stt!3-?Cd;;MS<PZ!6Kin!VfH-(xNc-jJ8Z?=5M{=WD9|7oTTOMTq;pEfpVF_GrXTw@ya zCt$TKtHOlKZPda^!7LAcStz>~xd}HM z{$k2vyqL8>K5&!d{oP!bzX}J$hqq`=%3PwQKJB4*-1?f&^@`G~A6p&u4qFuYp83*s WK6gnUA#R|v7(8A5T-G@yGywn})Q=bd literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@1.33x.png b/core/src/app/images/systemtray/win32/tray-speaking@1.33x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0be0ab8e2078bf62dbcef1d9466c56239a669c6 GIT binary patch literal 479 zcmV<50U-W~P)cYDa8fQOIgE25QI@Up+WlK6*Yaof@`1PP~-j0EN&Ir;0>-jhr2s;NCg!g z4KBkx?A#M3c_%AhetW-8np8&mRh_n|My)({wldmdn7U9MB_M+eqaWh?Rb})^(aF1j zKSSa-R~R{sF%rcsU@X(pWt}`I?E7VhV)PZ?s!r+*oclQiB05Ef2zOI&Dl@b>Oc@c{ z1E$PY^OEfzt{n|Kh#F<0nYK{W&`!!lTV1^OVwKawA)de1<^)P^Qw}qvq14$Lq-=`NP05U0 znb)%)bNG9+bf*V3bRTFc!JP>Tr|708RfsMZthIXzMZ>O5P+>h2)Jrjfv0C|q!pmO6 zOnMQ}GK)Edmtj5cBc(41tTxhe_-8cL2Oy%Xw`)}_2YA^tD1A{FIm}+}3a|^sw!w0M zyC8QW1Tb}>GQ{QjgWcd|SPxFI?lPM4o3bfFHx8Bq;IJN?g25KB8;lLQY--9soli#2 V)+u8?6mb9m002ovPDHLkV1lQs(tH2_ literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@1.4x.png b/core/src/app/images/systemtray/win32/tray-speaking@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3bf2a4eb359738549d54039365b7ee6330272be GIT binary patch literal 502 zcmVn6)=X>u9{=n7x21Su zZd)d4G7~i4kbDKRX*N5~yAMCNy+LM}QmU?L&l$i3e`*M>H2Ax|{$iB(Z+K=1`Upck z&n;<_3fleB{Fa?0oh|_d|ABMlF8MdTzcy`dBtqFSdcJMoy!=nsI%XI`s6a+VbGEns|A0WLmU=ivchS<FKp@oL!}@nnEkwP z?cDfKy?{zVP@JAlyOS0nzAskcpi&T&G-*NjI0M>MuBsmib&og%r8=ge)feTQI^kzn sASjr9j437x&5u4sOQHHsq5k3W3)8bAwAQ<9pa1{>07*qoM6N<$f~xfK&;S4c literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@1.5x.png b/core/src/app/images/systemtray/win32/tray-speaking@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..9bebc2890f1d6cf73b19baf2f2680c723871f57a GIT binary patch literal 353 zcmV-n0iOPeP)k&#rXHqNLlxQ@f0J$)sG|Q<(q& z01k9gPE!CXS#t;7|2O0QRQdejq&icmj3TL7Xl|g^8T&;tR3~`8m zZMM7p;m8BT3z+)e#5 literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@1.8x.png b/core/src/app/images/systemtray/win32/tray-speaking@1.8x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb1506993171a560ce063361ab6a74fcc132b82e GIT binary patch literal 612 zcmV-q0-ODbP)v$Yx3w!5>hw(SNr!`hh6d0fmsO}F^}Z*o89?YTPV zOsW6knRw(#x%P)9)erBR+%&vzW-ZQnX-|M6QQ9KF=wuN$gF5*U&`KH;28@Zca?$OlvO$4$O2TT z1c(sTu5w75Nog#xOw151Ro-MqFIzy{u;~q476(hz@r6yhyAj0)%9(A5A< z5@`dSSxa^hJREajy*j99uZSlWP}mdP!hX2R{u#=xHPP^#L~qF{9PlbaI-TzTg&%qe z8fKc`0SW`gu;sd|L>FxCL(ozxg)m@GT5Hh$u7VH8hXKo!NkNHDX1zy6qLW&|fMab@ z2YlS|;N;r5-Hi;bBMev-5TaAS4UjxYkvr$5iMKRXVIdD39|jCRG`~1CbMw!!pbxP$ yzvV6r1BM^Mp5PV`Z_o?U2BiVLs$SS_G~D0000 z!-q<}ghsiBN4SJWxq?Nuf=9T4MYn`QwSq;qgG9E0M7DuMwt_^pfkd@}M7DxMwt_>o zfwSSvo7cQVwSh&pg0bMsi_x)-(z1!ruvop1Mz({U*u7}OnsUdWbI74}$)k74qQVUaI#u0PqL&B^hVLbk0G<^NTq42V%pGOINLx@NPYL!>L> zuIj<)tH0fB0Be|qT{U11#vDWN&7!A{Df_|;J9u8Np5HJ06?yvt2ltQGevUuz)GpL; zZdP{vwm?9;^8mqqW5*pL4TTB>8@pX1rYJNZw{{DTq5A^zuo{eq8zII(-1-M@oK3O&)vsL7E@UNB0YQ7e&iByh54)00003F$ZF1Sx2xI_Bpg5504CaER8eO+GB_5dCaCTMah4u4q?q7WS;O2*Ca*xi-TZ@(X5AG_((C+;{xO%{QMu|N1wza^riT)Dce?$B>G+wUe*&9ai9Roz2MT z_2|tz+yDQ$wJ)l$&Fq*y$NY5ou6e6nJ0+(_d7n$lw-Pl_44TwuRB%Gce7=Upfkg~c zEq=;y>|EL*QW5Z?>EH3YPa8{pzV`pSAAJ9+^qS;1sc+u@%hKK;c(|r*!!Hxn9e>o1 z9oSHBzQiw$MTY13HWj8kmP;(#_c1k@Fy%JwV(!|;a-BKg+O(s^+{I!tX%BBKlW%MO zB>Z^AUXJug4n6McZ&kVFd|o_pa+kLHec*9RT)t;r?FkiY>wDLy1O3C`>FVdQ&MBb@ E01m^#kN^Mx literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@3x.png b/core/src/app/images/systemtray/win32/tray-speaking@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a0d86f35f5e77fb83062f1e9c9c3fea13e1928 GIT binary patch literal 609 zcmV-n0-pVeP)S~5e$1(V%&CLUtA)?4iO{e}w}gw)v5nHQkJGe})3lM)wMMpso7cRY z*uA3K!Be}7rQ5?(yNp!3j8?pjSG|t1;LBRRkgtDSPXGV_7IachQve1P9xX0=e29sU zp{2jW+1}vu_xSw)f(gt300BKoL_t(|Ue(pta>6hWhEXtbiEAPL*YuX!doS<*Sh;Zo z3$`{hzT#Z-&7k5{XD=uxjFLQ0qR>%tp!^gYQs3P4f&v_hpw}35y+hRKd)@lLiqRmp z>H<4Mqs*@PeGY?sr?4^@Wfl**F$6JR`2o1=(bdxwjK}t$@8`$uoQURN`kUtwV8iO- zo67s+uSamfI#31HUSDW&Ho&ez>A=U@(TpZT)be$ZLVKUlc!_$cJ~L=1QyQa@T?H<* zOPVav$gP4<2cNVUqFGo4kq++Y90pMpBzgs9Ie#1VsHFA2TAa#UT6NsBAZk v<#FHcL6M)VR*$0m?22sn?_qcC&OZ1B?m~F*cs1Oa00000NkvXXu0mjfH{vh# literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@4x.png b/core/src/app/images/systemtray/win32/tray-speaking@4x.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb48ddad5dc282b4f4491c029744ffd88138652 GIT binary patch literal 813 zcmV+|1JeA7P)pfkU=|L$!iLwt+;pf<(50M74pl;mkv|flaxGi_x*0*Sw65gPh)a?d++W2UuMr6}-C$Z! zD5gQzIJ_6<)X3wW+1SG+Yb-;9nG91lNQW)qoe^7%I!*EYIa|&9_3>K^8dz-A#&6Te zc1?!h!#eg{ioLF^UdBZs+4;0QmWoQJph0gRHavIGNfYt0e`)@ z{gWD@jPEJ+|Krgs00-|b9#U&5PgYEczrF(4d(V2YIR81N`zOHRDVyZg`yrt8>^ZQr zX0xD@U`FBlU10Z!EvA({Eaduq12$|`cx8eCg~!0o5!?A?f{0ajUgL0015ue^!m15$ zN)wYZLBfigz&?#6WrBW?T?V{CH2L@Kn?!?#v0wWGXSgJ%{_!@`00000NkvXXu0mjfK;^2S literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-speaking@5x.png b/core/src/app/images/systemtray/win32/tray-speaking@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..9836b2a9da3ea07e3e2872cbf899430f436d1c00 GIT binary patch literal 947 zcmV;k15EshP)QM!ta(y~jqhL6*pV_~m+Q6dP!E3~vM74oWxruPbpRnM{O1Fiw;LCf*g=X; zkr8J#VW4T5=9T*}(k~muZPa0`zLB1nZ-b$oPs`i%!QyYG(kF z(AHO`j-}MK>kmuPtVgR4y~*yu(fA#b^^^BZ3p)FIuPJl}jaK4$0F7r)F6f^N=p>vJ z*^Xv(_kU7oIzBqsg-$1anpKeK{Ta>tezmucg(_-Z#z%s0k8WrBXM!}odWM&f;Pkc@ zH`_2!QUaZ%YJ3hWy8|PRa=#4_^Xm%{jW1zlFn<@?h<;tR!|OD0p)-VH6YedE-5iv zy+(xwIrX9!a$-*rp;G*@B;se{&pDBb=E2FKJ~&lH2ozHu?Oe^2Zv|K1TKUIE{xw_u z=TZK>UHu1K-Xd6i6GPr+kvD=2SuGf7S!-yfiQ0Ygh9qCkcH%8l$Ih*{sk?r6{sQr& V_K$Kph93X`002ovPDHLkV1k>!)!_gD literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray-unread.png b/core/src/app/images/systemtray/win32/tray-unread.png new file mode 100644 index 0000000000000000000000000000000000000000..2edf1b6c5d95d6e9e3188d5f21ee973a868cd66c GIT binary patch literal 512 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 S29K%$0000RT;X|wg5^F{a0{C8$&XCwR9 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 e(Go3@L({*zJ7Rj1@dbVW0000|ULRv%E4nxBX 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 literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray.png b/core/src/app/images/systemtray/win32/tray.png new file mode 100644 index 0000000000000000000000000000000000000000..7a8c676428aab8e43edc43b245bd65c0bfedc962 GIT binary patch literal 359 zcmV-t0hs=YP)Px$AxT6*R4C75V4x0QWDsCbVNhg{heCBA6ab3CrM3K5_rGpe+T~k`}ZFXuKj!dujC%kERcR?uUkk`2=MS9XCTN7f#9A0ae%19 z48jZy>b)O8oZtWE{yg&+#5(qO!7qq)Q$I6kF)&yj0}HSJ!;q@E{Qv*I|752zr0)ic zo&U>V!@%J12(0?nKgEUV4?(P$8*0lQgT-F{V{m3*ar+JAeEbK}3$q)Px$#Ysd#R2UhZ!9hq-B;#k zN<)R-wc*m(dU9iUy}xLGo7+6M%p_+pQFsD$&a8f@J#euYvU8WU?yy-OF5Un=Unk*^@ShlZK*p^W)xz# z7R0xxS!3?(ig-FIEUEcrM|^`7($Jd8itoKv1zujti6>Fzo$)&7h|hMIhV~bEse9yJ z-zsVGPx$6KDn2;ecq=M)W zUTPryxkQH`+{HvNlZF~Xct}Vnk)Tdx*~A6?!4PJ1tC*YH^ZkB3>>(K;bm;Se|H;6M zA3r`!OiWCC_z7U*VFNGKL};a*R+?$%IL)-sK?hN4@L}Nc66WHT!OqzSnfS+p)6rDh z+==Le^FhD z?^UUWLP^wdK12FcSzUK$X@Kr?MRkQH>Epw=sOD`(Ns?I*UGqH0Q5d*hR@dpzOl|u* zFRCK7?|8ZUhb6jZu1FgU^;+s$k%!iM(KT5awlbowC5ssJj+E7rl?hSNKg`IasH3z> zE1cc=YT8yuTCS|b3(qV|RBS28SmmlUBI;PSV~?nZyEohmS%$N*`L-8(YwPY@%F4+DpRNi|{W2x4OJ ti-#SAsV9UV4;vVGF!-H;2LpqD_Y?D@q9If6phW-x002ovPDHLkV1jyK{dE8U literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray@1.4x.png b/core/src/app/images/systemtray/win32/tray@1.4x.png new file mode 100644 index 0000000000000000000000000000000000000000..b965ddcbcfc3eece29949140ed61426a46f4db77 GIT binary patch literal 586 zcmV-Q0=4~#P)Px%1W80eR2Uh(!CgpG0T_Vc_tc@`WE2R(NSMM%k`)DlbQ4CgM7r5c6kdimN;f7I z83e%+gt7(Fq73>I%3*|w1!YkLf>|g=mW50DkyaGw+~&^tzK&xC8YFbl^T7XL;>Lp; z69X_X@vsgz2FsWfQ9+OpHB=HHK!9z8*hi3ZJQ)1u!cU#=+=-z}?{+_>+Y>A5S$%VT zUv%<9e8&S?3E{&e$HZUI9G-ZcIW&7RHE5+o7swm?MmCZenD3w4^oRp^F>rX;+x9*! zPsA4e!*}^0A8mIpLEK>AFFc#D^{*Pf(LxEh2sVuB3Z7fsq6&&=?4QvUZ5*Qxe6IGS zXpTr{_H;TaniI3asf1`=^G{k}bM1Z2i)I<3r!k?9dp09<*G_3(Y@QC-esDzdn$p~* zZP$c4B3T~NS~{$G!!}*8Cp@WnW8$4E7`c;C$FyviUiBiH)VxnZFN8Y3=mJrPB`MKG zk`#5=q7F-pKG+$3tB$O6$)M;mGjd*DiaHW@;Z-Oz4`2SOIWc?x%#k0DGvn5{^~xH^ z9GyLt`7G*~w6_jZ4=w^U1)mMf&5LSiln7zk=^(5)wp#$;l52hejF}JsNvY! zi&fWXppp`N`0!Ci^_Fny6*_35nqo|H4BU7rryMUX78!W(QGuUgTo^22U|_J6fx*A| Y1?q{*l3oGKjsO4v07*qoM6N<$g62H~d;kCd literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray@1.5x.png b/core/src/app/images/systemtray/win32/tray@1.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..54db6ee3f30c6d7cc3e26bf9d81a0ffd3a321e9e GIT binary patch literal 632 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 LNkvXXu0mjf@WCr? literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray@3x.png b/core/src/app/images/systemtray/win32/tray@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4695e57542b3b2fa845c50e5826e4aeaabbbbfa1 GIT binary patch literal 1406 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 literal 0 HcmV?d00001 diff --git a/core/src/app/images/systemtray/win32/tray@5x.png b/core/src/app/images/systemtray/win32/tray@5x.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea9d6150cd30855828865e387c5ecd16024b5a9 GIT binary patch literal 2907 zcmV-h3#9akP)@PvJ8aA$i&PSbCXz7W(NMw&x6}4SFdPlBq>x1}1?;APJhDkAk!T_a z#uqQ-PDDEOTrg^4NhO;CiYa~R%Pq}i9p`)dMhwPlw`JL+vqdnKbTZg#V+QG@if3tL zKKJpDx{-tO6G%l5Q`(L^~H~<2>ix+Lm8@y?dSR z-CKX%`}cQ~@BI1Cn{KYZ`sU?Toxjt@1={K2%93mE^fgRcB&&c)Y8Za2g9ggjMHouFCTxj5x9>p?=-PW206(PUyq?_}Ru@w>xVGcRu)5f5U8&tPU_Gb(#)N?VNaL zblDI?3@b-I)sM}zJ~_Ujiw3l8CxLMMU6d$->q{63%|9Rj|2yx_bFs^67WEGI4 zLc?#y8TX#}$e?pB%^~heg_bu>FB-KL$u4rlyyXUU6p%<5N<5tTP=%TxYlTX7w``8zIeHPQnEf%gzKm#bABJXAt!)n@@U*WWPQdsJi&1aiJNa6%J3$X6tvHu8?roW zfs(YQn+h_Bzz26n1;&q!rfcS8bZ`jVp$Ac^~SOhqqBigZr6nNIa3HHnm zvYW`@M2g*7`pwpbgrw}Cj8sA&%Vbfa!%3%d!!_#yBeS1cwxL0Z`=cY!myK-a@V^c% zw7~BtIYz-_GRxpm4FBVFbX$KM-%e>i{Qw#8}bF#Xem=%M)Gf14b%xK^&0 zw6c#xv96gGC`wE++UMJhlJhz9lkufjY2!3!xVY>_h2C-7Dd``_=n-vOxb)KPMwe!& zwK^(EpDr~IM_>lku9TR+8KsjWlv6}8l^mn{(+NjyHTStlBV`n^k7}Cfsdgbk+Xks8 z`_WP8juH(yeDjIZ5%`0VZVt1D3=(b3q?jYW(dp*Q{Bk{=)KN$}2_&(N5{`S_yl-(~ z;nl=0qVdNA08s-sQ^2v4dS{(O`Z+-{ThO4gaUrWYh$UJ$5GL zod0L1b@sl6(-aXuT?^e%5JWshoN=}ayl0_@I<~Wk06g&$+k-qBUzlTPTrks34OwXL z7j1)yWj9T4{9<*AS1(aY3M!E%_7q8>^riOsyNN&jiR$S^r5GBKY@?Q*;aSO5Z=ii< zUUe61O;N~}-Eb~&;|;1FrimNggpp3wpImp=@rs#l4v>i&B_1~Vq9L0)boyBWj~cl| z1?hx~myzR76uC6Mc+0uKe-OnQH9p8dCYA|V)TTLIM^8x}*J&i57=lsSs3IO)*jD$> zZrf|2hkAApO%OgP2_=!eoQNE7F7Q7_Xk>?2GPpmSMH-4moOewc;Vflj5kmxOV#%h8 zww>d1wcRktX|!YzE!xJjgM)PZm)`0WM<+QplgDCoM3GO^(McD!+ZNB8H1h?yY_&0; z3Qqao5dofs%Vu{SO=#Ic2ALF4P3!srt7LVG>n2X{8L?uzvlp4&G_3it8^OmM_rZs)^U~B7k?Sqj~$?77W`;ihcA1gpkps0c^qZX^n=r;ei;cLSU zS9(Yn%wHJ}8}Ev?u3|+yT9QzqK$PhO_R(sQtiKwp>Y$WlQL63pNb$0>)?X2VyU^MN ziV(-K=haq6-$rXC^HcI|t<>$nazrQl9*#kOqS^K4DTnii6fPZ-tWQ|vCFzf)Jq~TY zdyzt72}FUIup-HN;gD|1@fXpRmLN-w^rS}V8R>n?QcICTYXhd=|5hwX{E&k?-h_}u zQ9$dU!$Q+9tv6$O#h7pI{eOuxNncw2$b{*)=I2J~(d>n1+?KYd8=mv)*~>Y2jum*&BFjxM5f)R03ofp{XD{;sbgmRxGy z=)7jKIz*qe)#&knA^PcE^Go)~NrQ{&Bb_#VF#g;yV~j@`&(8C5BbK+WQpYY52*qdm z>w*lqSZ&0UOZAE$ni&&rO8cmr&x!pm#xf4lC~JPb&A;Qd z&edJ3yZpLVb-miTvcs!=#l;ope)l9tY2YwNmY*9k&A(gRKm0-q)#Q;#IDRM|o;yuT zR1(5wwo=UD*E*Xf92@)FE0mK<8p+~-HkU$**e?zhr&)@Y5{fA#pIq`O=1|Jjd3M@{ zh#rohC7W2n@U_dE<9ss+4JqVPPSg6HugB*qELZey^&$)!aYn3W6EVb-L^3HeOeTp$ z;)x;J#yB$AOT*lS?1cWkn{Lfivzs)cP@%L3cg_=HFZ>B3h71a+6^udn+f(S-sV~C9^JA(-#0Dl7Pd%DtpdEAFmr{VMA(90a>0DH+IjtF5> z9C6Qg(y1f}HF0dEfKuxCVMSZQ?azm5M*nC0@?^jMw^ihbMZY&5$i#+7j>1OIM=74j zk=ySrgb>U2;M#$ypC*17uNf;E`m3K`Zl{@g$|xj@1T^-;ZFeEhg=+x8sEJ_<+3aRN zRUD$8S}G}G8*yTs$dNtP^HDwmdkTgVPd3F=Q7bG}p{0-U{JnX1) zfQoR`Xow_&Py+Fpm1V9-6fZ37XiyW5ia>nvM&a0V&dds#GgotzDD9VXJeqq^ZpU6T#TdfI&|BSw7g84v$q_s}*x z;CaOW3$hzsphJJa;){wtUwrxt4mp2Cdql_302V&35Iuu7KzkY&7-*4U(S5W>J8gP% z+C>wq`Kc1U!&D2I5@i`caIu=dD$#39F`uzqO-*u$h$ecIG_^UpCSyndi@vp_cDyKC zqFX>h$X{kj?J>l{;w)(eR1xJh!~n~RNM{3yVZj&1Tvlm4a_!>`+!-0|2_%Ld9o0cS zQcjIiLvX}L@W5y3)v;nMM5FTuIdUO{^-jrIUSgZq16D@D9Ek83Sl&aZe> zuYYdj3DpK_d!oZm|A~gtX zK9co~9jq4IN1trQee1ryAvWlaDp2~+0IYuCuVM$GK|kiu04$$-Cm#Ns1=p^$jQUF^&;a}`EnWP5VXSXkEP96J%Wu=xd@hFou;^s|1VIo4K@fzd`~Zv6Gz;jEt=Iqn N002ovPDHLkV1h)OBRv2B literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/darwin/deafen.png b/core/src/app/images/thumbar/darwin/deafen.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3718edfb176e57b254c736bc1b39d0c58e2522 GIT binary patch literal 894 zcmV-^1A+XBP)qMNOH)wJK-~?$;K-pETRMHDX?E#>^0Eq)@Y~GWf zQ)h6RdGli&X+G&`x#a`2>&M)rJR*x7fXtRrx6Ud$}BDQ8X#DqC6kJxVjpH04KuKs+gQ?I8D## z1;#DL9Y%s8DgTac4t38Mif8;C#sap>K3+P@UhQ39-+?Ap!d&4mTv?R_iWWaF1vSc} zq*ML-CuO7P!`|iP83?cyCfWB&HdXdBR(b@MxRxcJgCX3FRoMjNO|?53m+wKAFlu3x z9b%$ZB!QO85@KPVAHP8{(3B*w1G2<3kTZgHS)y@S8sOAfNI6cL9*rxqH=Le;0MRo{@42wvorfrV4i;F*#+<#tI=lo;v|BhYRy}bgE47s+ z3B#9=z=CT!U-7QK(_AM+EbJED4p{Vx%weLP!b%;QeEiU zSv3o*qt$pOZ(2sUlC`A~;kL*U#>+z;d@lq{@Ycd@lqI|fw^f#~+3}!}GFJy{m$E!D z)XfIQTT?bI{2i3J*@JAkP?$q84VCc+3^8qCoqglgDGS*dxY_4kVba20Wf|(Sv`Oex zwk%i+e$#3~w(d=8>rZ^VX*DA28%YbtP09LfVY7W{&n?@QE?tzogWb4_Y@2q+WeJgR znx;L$?qVwu3Db92l&gM#-Xt4?JzAewrHG$llpC@1Q~SoE&G8Lrf8>ULcQM_g{$mM$ z>xnUDoBkn17cOfbW1es4r|tDjD@hyT6IU0n+`t=*tS07sE`~rL5C{YUfj|rR3svbl Ux4yW5pa1{>07*qoM6N<$f+pjSZvX%Q literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/darwin/disconnect.png b/core/src/app/images/thumbar/darwin/disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e42ed9003a52407e9bcbc68130491012dbfbc7 GIT binary patch literal 683 zcmV;c0#yBpP)O` z!!QtrFNk+wgTMs91ceC@10Y}lMgSI|odClIumFe!DzO0V1QZtFILnR{g)}}pPUDpO zq+fZ6ljf@v+h+hl5ClOG1YwOqM4f%g9kYE#8S86cXjs_;$^s4dj`mts*|wj9ldi~O zlXOKE2Pth|%{uNY?doI;#xNAD$U~E~Lsr4ia7e4Qk}YsZ_a{p~bVZptq9{3d;vu~< z*%9)YKmZKsR{9rVb2-q7p<9gCADk`ZRg76eNtA?%QS zw5ignr&-VsoFgCB;DU@r1u_;VLlPcyu6IbYsw{6h60R#A)RMM!(%lsg9SK*Zm7{%G zy4y<0Ls&oj$m71n1^}z-vCS}mhq|wpp*$&TD~=$8-ZU%l|JaMiB;;o?1i3k@bAi~%F((>-#CP4lwFQAnng#( z2*e^}N%L^*?Iz9|#B&m8)K(aYtYuI(Y_=TYzieM1j1 zWj?Gbi@Y8RqC8XH!MyVNli-TzPh$`I22DZngWVIQhg<^*m_@mRlG=Z$|~ql%w=u z6KPPJ!cd@xJ+bmrD<6_;h(N1(I0Q7y(qf|^=UhV3pUN8uf*=TjAP7P_`~piBrQJr) RJvRUV002ovPDHLkV1ihrD9!)? literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/darwin/mute-off.png b/core/src/app/images/thumbar/darwin/mute-off.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9288c7b7e447fbb1f9828864ea8c44692f6f64 GIT binary patch literal 566 zcmV-60?GY}P)jHu{trR;p_w<8r>F45h*rSzo$Cv126$T%8fc zj$5Zy8B@a;Y8bJoQ`{JHLJiVr<81`OsRQBEfpF?TICUVLIuNdly6p^TkI22l#+}#x zf_7vdBmC|C?grk!QguRQFTCHsv?Kc#z6!j5qiV=C@>%_7RGS}kY$QwJO}V*F({P@= z%XmAVs-8qom3gFNV>@xJIyKUFe$JD4lCxTr$+Ak~*=J*8=#`PWm(&J$HT61oBNHko z`K_tzyu_IE)UBQs#pq^UyN#!RDiauG$zz>yt?bT!Tjc7_S~C8=I<77hhijXolyuQJ`Q(NKX=A@Z8@tza&L#FSLSNDN}wau(`xRHM1 z@*R2ZrtFN%k1MJB!ZCe`a3i|uC@K^Ev2jna!s|y-NV4>ZiWbh-_iaG9&j(zmjely< zh@t;%Kdl_J54aDf4un$&!l`pgho}CX5dZ)H002b5ABo(vQXu#=e*gdg07*qoM6N<$ Eg8i2J{{R30 literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/darwin/mute.png b/core/src/app/images/thumbar/darwin/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..40753a62b29f7cf43d81c4fc4ccd601e97a330fd GIT binary patch literal 767 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 Sd69Ym0000KioEPWn({ zZMAMgBU=vsqr{}m?v5K3!jx(6N{cUS&Pa>WnQR`{9dldJ0Y6Dl-?w-orN$QN7P~xSJ zPP3`Ez*zkFdYXw;2CjPUaa`6_pn)X1Ab^i0@Nb91Rd09qcUIeNx3acAssV|rD#`E4 zYn6aO67lz5rQ9@ir$h$0%RCuTTZyYj{#02+fhWW7a6T5CD5f$ME*~o%aew3T^2`(` zk%8{@O`8aJLJtmnpm)v2%NAH5i+E-Q9)Pwm_$Q^F|<^ z>QT)vURLsmXJQR>T(>HGa+Tof->8pEJR@TNxbs_@ctug-c@T+H0o2NZkSO-V;Z zh-WQjpFYKzFd7K5uSEuLdwc$)&15$&|CGl0$J~X4c&=Y#3oMXT{2vVmrkD`}ys8ZK z{lWGt=Nxj9_Jv(j^`gF9sdRe1dbnJ)1$a5ES8xG2$uinFYH{aFct3d$eNhXSix?1U zO|Lx!(1#r48Y+?c`Zd=n&=zl4(v!PspE zHYTZZxNgG|K4L(vIJH9I4~-<)5YIT#x*s->7hB?!V%5OB#WU6n6d|6mVxTDTOl|{3 zif3{eC|W%8@F!*W!GcN&dla{5>E(J67B@RsR$;b@54UKR= zNh@#}l6YviUp$?TTg4SRMZ*bDaCD_wiH+LYn_aTxU*Z=NTs%9<8p{s=0000)(QQ35Kh$4)kLA-(K z7*Ei0R>&D6t#((Az1B?pHMX=Doqwf0mjzZ_LENX_GuQPT@Ox3lo$bh}jnsqyXfa$P54Vm$qI#5IX%WkpyM z@bIyB$QZ5s{}hVI8b3jZxV72*_5CdTB(7_)M7@E4ej-Ve!`INC-V;T}r$qH}GFJkF zMRbO-F&^MLpz9L^el)pZRe(SzBK?)NWsMhD7a-7xkRdf*kQ3nU9_(}Q4#Wo2O$ycy zx-Va021z=Zi#8I(`y#{fqc>SpiX*&h+5+ln8B*%8C%izo$8-`&>rA zi1FNtYDq;L>5RYVpNbG;vc?N?xzNt8$5j*dy8coUz#?RCKwYDjD8_A2TEKauRIape zWCB9f0Qw%As1W&dn&YQ(0LKn0L{2~)W1t+t(4u{?^fY=xPC(;NB0#wh;x!ziB1m20 z&J(XMR$4i5j13b%zG$R@%p^eZYj}qWAU&BIehs5L_nI!fg&TzBq2$sQ{yTAXA7`3gd#Nsv=5NWQm9v!e#0=wk1lJlu2=3!xs6)5EWpinpo7Sy;FaS zQV!u}BP@}*)VFEW-WPu{A0qNX8zvp+TA(L&LLIHRh89hHA0i;JB!HEvAH-?LQE=+} dSg~S-mcLP{a8TOEr}_W@002ovPDHLkV1oW|ok0Kq literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/disconnect.png b/core/src/app/images/thumbar/win32/disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..6ba782c98a4a0933ac680ae24992629486cadd04 GIT binary patch literal 918 zcmV;H18Mw;P)eHnTIc06ShG-ClUr4#Se^cplsBhF7v{4p^qs4{s2$=|mWs znBXxy76mqgAiP<=F2Euz9%A%i@$2KbAl#bkj%DK$@qkcDzH>nMp650eOIYH2(7!H# zxJ_NiFd-A4fDzVDPb*FSZ0#>3rp_IS8K*9gz~#S_N<6QDNNXkQf<@YG5>_B#LLzMb zB>1CBd>ql!sx6+DRRfI9#O&Qr{KJ$jpfn*PLp+l*(CLL20l>#t})Dz%4tD3+?803hQ z0TgNjP@I+^N2FsQ#*u1*h@3;n5$PuY@Jl(NAihA3NXLMKL)8Q_SZ;;k^UCNAk}~kN zP#Ee0dGBw04LL!&CH@EoAzdh|CdNf^kaZws6KNtth_ngHnPLlafYd>`(#$;! zg8nURnar%(>Gi03bhLNbp%VdEne$ z+AtJ_uSiQfq&x5u(iPN9!)5$kD#;Jkf z$H0?YEa=kHREfkI{rNnM;D`8zAvwgT7i+Ry@;t-b<@{1gXBO0P_*pVtIe9j7CbO1uHR7Z#!#*FvRLq zVsII-z@E!Ee{hl^vAmgueHdaKg&1=C1sg=p#M3mCfAJm40*>Edr>Q)Z#lNJUSN76U z;_K}!%ssK#r?i2J)5fQ1GuinrMIM?uZ()hm6iO*0K0b1Mg->FOA&K{Q9{$gtE>HsN z5ik`WPmwP5vIK|79(0FZ0(0>PBXwQbU}eBc{NDV|U_~##o=?LuDqw8DnRp75@sHvf zwxMjJJIWlXb6TXIv0Ci3~JXbn6C z@r>3$a-{7kMMo!|(HcmOw4>zqD8(~c11y$B)8+D5#WT5KG!bo_+CB!4^9M&uON%r9 Y0U(YRLxT7TKL7v#07*qoM6N<$f_-mgI{*Lx literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/mute-off-light.png b/core/src/app/images/thumbar/win32/mute-off-light.png new file mode 100644 index 0000000000000000000000000000000000000000..4b197bf4e0557cb2e14eaf23b154c002f15411a4 GIT binary patch literal 711 zcmV;&0yzDNP)`i64?dV{t%NKb(Jnslay9w6Zar8meC{7N!ovGQO> zcAOxaWi$->o{UDU_m8x)_6Gui*9}3KG|i66L!6UF!qJmzP~%1uO|NDbzaWgLfb>fi z>k5Ov)9HI{ItV{R*E0Y}^gXiGrHeV!Azh9g9zw#Mw3+(W|= zX90}_`R>2f7OpXcwMu(f<*nx4^wM^Zzr4gu-s zEYVT*GTguHhBlQ=;#_o%c)ShuTP*B$lxyKQpDXzqFyz10QfvHt7~mJ11UQixJ?To` z#O{;4q4$R@+TeTRlrSRL>-ls#IdhG{+a}@v`PVQ4IOf${^|o6EIdeN5INrZ(A*yJt zuiLdzS&r{;MkUe?S7NYZH`rRd_dur{VAn5SJbXI{=E#lFok32wm<+9>CwrsSi9`4X zH&@Q4;Ftf%XKIQkAZG4v9i6+_bEFPI-d;Cf)eRT+0sh$I<^p)I!BWzhHi!$Tv2U*i t*V|=ZLPO)5Aiy_4fNx&BfI#52a|e;0)#EFWO^E;i002ovPDHLkV1j3%K;r-a literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/mute-off.png b/core/src/app/images/thumbar/win32/mute-off.png new file mode 100644 index 0000000000000000000000000000000000000000..93259984b3d3c655e04ace43f90b1dce95506497 GIT binary patch literal 749 zcmVF~UQA6DN337tc6OF1Ju<+tG0Dt#RrDb>IcmjTcZiUO?S=0d?aA)XlvY(6H@zKDgk;bIyDm zN9{fwqQh|&(SBIGA9VJuk}dlcP}$V-xg_pa>V~i$s-*Agm=joHEr9u-fS@FvS2^${ zY{w$%7u(DnfpiXSiM;^BKsDQ8F)e)35Iq2sTl5Dkso=!<(0FMU z(?TibB+p2$6`{V(`VJ8PMQY5{ByZ4OS%qQlkUGT-|JseAUcu{M zqSx)pmHl0;WN810I{OlLAs`tHS^`08G>xtrB)d{tJDrK%hC5T%<1N!s;^|%#Mecn- z6L&g8CO$QqLT!MaMO38BcxFDWV!WpEMfNxl@34AGgnA2{e@%~U$4CZgYbWFHFbe^U z(P7lCTyEK@GM6N3-v(;-X!SnO`&S>4d4S8JZ|E6+n&C)I^Q-@=5_9K{)Pn-!~wl6u7<^rCpq~2VW-{07C0;J z7LU%`Sa+mug7fnF%s(DwAy}N5?K%KNb~B9QcnpU)7qGyLUNyGSWmSAaQ#W2f-FN|Y fbMFOsJP(~e3nu?-jF??100000NkvXXu0mjftLRjV literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/mute.png b/core/src/app/images/thumbar/win32/mute.png new file mode 100644 index 0000000000000000000000000000000000000000..c2516629bbb13735484154c0a6f2e302b7108560 GIT binary patch literal 830 zcmV-E1Ht@>P)81K0-MGaYFw13339+2?|H(4Z;apP7vN2$WVtHa0K6g%s@Jw5_{1W zCsB;$NVe>TsednVWX1YEYo)HX05vra8wQq{_1L>m$QG>aj>jq#64i?E2Pl$Wehh_=(@MAD=7X7|YpIQB^8MyrN^=+p3 zHKNb)ZS*dy3yEeZUWN!k`phz6%>ZZYRJSkV?1k!{B;JXe==-^MD4wuu07beSvSC%?33~?qig!J4 zo9mY?o_M6&@$>8o*Vhr^$m?}3G!o1??EX|}dLKtnw+K0g+j^>+7 znvKLH7g?~45MJ#L#VVfA%f%T{c?E}*b+}+ z$X7Vo`K=fO3@B6=Dk}bXb@$uNSsD>P40@f+ibay#1`37E%x`ffDh=}1DN>Mrul*bh zF$$qIdBoEje-gqQ@tR*#*%45>Da2C>0y!|A0bTKTA@Vyq7d25wjM7w>8`-DppD>cw zl?g@$jKnA6J7wTS1b8;+cE(TuZ3DK%i^!SNAH|zre4O{K%V@0ulbC;eBf{k9o=_TyOWKaqba3JcrGdDl z9mHP`QaqtFKw?QW(6)D=;)%>{G#0I$+TI8E^AC=ini^~T0XU&Rx@w2)BLDyZ07*qo IM6N<$f;&-i4*&oF literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/video-light.png b/core/src/app/images/thumbar/win32/video-light.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a5715b8fba1c0ba75221f3cf29ca21e11085af GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?2=RS;(M3{v?36l5$8 za(7}_cTVOdki(Mh=G|6GBhqC6ap# z-TG%|>G+*yt~%OvU+z)kn!yHcko+5g3g4o9s%f%dW#5uLQjPAdAJg0mXcS*O*x=&|c<=s#}$spe< zEdI`Jd8prl=zYs%A5=uf^>WE~-I~OGpf!Bbzv%rPx(#OB3(hiSY-Run#y`s5x5fVL z{1}G&SEimW_~JX^WAUuu6Zfybb(!#B#s2?FR#)chcsDI74Yv0DU%#`1d7Fn!!v_{s zmk4JKt_NiWY;yxSZhF^$6YXRwv1VBR&$Ya}l11)o`~5#tjgJBSyUjdWA|PykzUvQQ PxH5RU`njxgN@xNAc2lis literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/video-off-light.png b/core/src/app/images/thumbar/win32/video-off-light.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac51c9a6cce29c0ddd5479edcd322851d464c72 GIT binary patch literal 617 zcmV-v0+#)WP)U_og|too zBs1olVWv%!^8L~zv<1LmFc?(AKr=qO-4^3~!WkP}%w~RCeXRmS@^jp5;m5}iR$7QN z(1e&g5nhS3c3K2DB2Um27^JmTK7<7FmiBX?s63G=fZcaGJb)o^Xo4I*Tf>9rxvOnK z8S+GG0Q=S%aey(%Fk?&_bS&380NU zkvD)=@8W{3=IXaexL_(DNLYco%$$?Vhq!&-F}P%dp|Fc%8ad zcn*A^3IZ6T!(yC6CXmC_jXPV9zhSmr16j^PpY4psKeARgstj z(JSrNUXix)L?S@+O52ZiwU#GDb0G8IJO+co@PGLM^Ya;wYz#u>q8UVen({$2-efCrx$8 zN2ku}@b)fdAaM?5K?vlQS>v%4Bu#b66R81QAxyr(FDOgH@1Fn)oKn>uCT^o_LZPL7 zb7|4G>k1PLoO1^Ew2z2Sj(zo@^w&pT4Uj-V4C8lT+xANBpX*_+>jAr4!YY}ASeM!6 z6sZBakPpxOQl$UMG0=&8SpSYv|5+RjP(>~v002ovPDHLk FV1jjr21)<` literal 0 HcmV?d00001 diff --git a/core/src/app/images/thumbar/win32/video.png b/core/src/app/images/thumbar/win32/video.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7da4d3e795ed37cfd31e228c242e6bcf3fd3aa GIT binary patch literal 443 zcmV;s0Yv_ZP)UqK~#7F?byLh z!!Q&E;Qxhk2d# { + return getPopoutWindowByKey(key) || BrowserWindow.fromId(mainScreen.getMainWindowId()); + }); +} +function handleOpenUrl(url) { + mainScreen.handleOpenUrl(url); +} +function setMainWindowVisible(visible) { + mainScreen.setMainWindowVisible(visible); +} \ No newline at end of file diff --git a/core/src/app/ipcMain.js b/core/src/app/ipcMain.js new file mode 100644 index 0000000..4abdf94 --- /dev/null +++ b/core/src/app/ipcMain.js @@ -0,0 +1,16 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _electron = require("electron"); +var _constants = require("./discord_native/common/constants"); +var _default = { + on: (event, callback) => _electron.ipcMain.on((0, _constants.getDiscordIPCEvent)(event), callback), + removeListener: (event, callback) => _electron.ipcMain.removeListener((0, _constants.getDiscordIPCEvent)(event), callback), + reply: (event, channel, ...args) => event.sender.send((0, _constants.getDiscordIPCEvent)(channel), ...args), + handle: (event, callback) => _electron.ipcMain.handle((0, _constants.getDiscordIPCEvent)(event), callback) +}; +exports.default = _default; +module.exports = exports.default; \ No newline at end of file diff --git a/core/src/app/jest.config.js b/core/src/app/jest.config.js new file mode 100644 index 0000000..b239df3 --- /dev/null +++ b/core/src/app/jest.config.js @@ -0,0 +1,14 @@ +"use strict"; + +const baseConfig = require('@discordapp/jest-config/jest.config.base'); +module.exports = Object.assign({}, baseConfig, { + testEnvironment: 'jsdom', + displayName: 'desktop app', + testPathIgnorePatterns: ['/node_modules/'], + setupFiles: [...baseConfig.setupFiles], + maxConcurrency: 1, + maxWorkers: 1, + moduleNameMapper: { + ...baseConfig.moduleNameMapper + } +}); \ No newline at end of file diff --git a/core/src/app/mainScreen.js b/core/src/app/mainScreen.js new file mode 100644 index 0000000..612a918 --- /dev/null +++ b/core/src/app/mainScreen.js @@ -0,0 +1,999 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.WEBAPP_ENDPOINT = void 0; +exports.getMainWindowId = getMainWindowId; +exports.handleOpenUrl = handleOpenUrl; +exports.init = init; +exports.setMainWindowVisible = setMainWindowVisible; +exports.webContentsSend = webContentsSend; +var _electron = _interopRequireWildcard(require("electron")); +var _fs = _interopRequireDefault(require("fs")); +var _path = _interopRequireDefault(require("path")); +var _url = _interopRequireDefault(require("url")); +var _Backoff = _interopRequireDefault(require("../common/Backoff")); +var _securityUtils = require("../common/securityUtils"); +var appBadge = _interopRequireWildcard(require("./appBadge")); +var appConfig = _interopRequireWildcard(require("./appConfig")); +var _appSettings = require("./bootstrapModules/appSettings"); +var _buildInfo = require("./bootstrapModules/buildInfo"); +var _processUtils = require("./discord_native/browser/processUtils"); +var _ipcMain = _interopRequireDefault(require("./ipcMain")); +var _moduleUpdater = require("./bootstrapModules/moduleUpdater"); +var mouse = _interopRequireWildcard(require("./mouse")); +var notificationScreen = _interopRequireWildcard(require("./notificationScreen")); +var _paths = require("./bootstrapModules/paths"); +var popoutWindows = _interopRequireWildcard(require("./popoutWindows")); +var _splashScreen = require("./bootstrapModules/splashScreen"); +var systemTray = _interopRequireWildcard(require("./systemTray")); +var thumbarButtons = _interopRequireWildcard(require("./thumbarButtons")); +var _updater = require("./bootstrapModules/updater"); +var _Constants = require("./Constants"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +/* eslint-disable no-console */ + +const settings = _appSettings.appSettings.getSettings(); +const connectionBackoff = new _Backoff.default(1000, 20000); +const DISCORD_NAMESPACE = 'DISCORD_'; +const envVariables = { + disableRestart: process.env.DISCORD_DISABLE_RESTART, + webappEndpoint: process.env.DISCORD_WEBAPP_ENDPOINT, + test: process.env.DISCORD_TEST +}; +function checkCanMigrate() { + return _fs.default.existsSync(_path.default.join(_paths.paths.getUserData(), 'userDataCache.json')); +} +function checkAlreadyMigrated() { + return _fs.default.existsSync(_path.default.join(_paths.paths.getUserData(), 'domainMigrated')); +} +const getWebappEndpoint = () => { + if (envVariables.webappEndpoint) { + console.log(`Using DISCORD_WEBAPP_ENDPOINT override: ${envVariables.webappEndpoint}`); + return envVariables.webappEndpoint; + } + let endpoint = settings.get('WEBAPP_ENDPOINT'); + if (!endpoint) { + if (_buildInfo.buildInfo.releaseChannel === 'stable') { + const canMigrate = checkCanMigrate(); + const alreadyMigrated = checkAlreadyMigrated(); + if (canMigrate || alreadyMigrated) { + endpoint = 'https://discord.com'; + } else { + endpoint = 'https://discordapp.com'; + } + } else if (_buildInfo.buildInfo.releaseChannel === 'development') { + endpoint = 'https://canary.discord.com'; + } else { + endpoint = `https://${_buildInfo.buildInfo.releaseChannel}.discord.com`; + } + } + return endpoint; +}; +const WEBAPP_ENDPOINT = getWebappEndpoint(); +exports.WEBAPP_ENDPOINT = WEBAPP_ENDPOINT; +function getSanitizedPath(path) { + // using the whatwg URL api, get a sanitized pathname from given path + // this is because url.parse's `path` may not always have a slash + // in front of it + return new _url.default.URL(path, WEBAPP_ENDPOINT).pathname; +} +function getSanitizedProtocolPath(url_) { + try { + const parsedURL = _url.default.parse(url_); + if (parsedURL.protocol === 'discord:') { + return getSanitizedPath(parsedURL.path); + } + } catch (_) {} // protect against URIError: URI malformed + return null; +} + +// TODO: These should probably be thrown in constants. +const WEBAPP_PATH = settings.get('WEBAPP_PATH', `/app?_=${Date.now()}`); +const URL_TO_LOAD = `${WEBAPP_ENDPOINT}${WEBAPP_PATH}`; +const MIN_WIDTH = settings.get('MIN_WIDTH', 940); +const MIN_HEIGHT = settings.get('MIN_HEIGHT', 500); +const DEFAULT_WIDTH = 1280; +const DEFAULT_HEIGHT = 720; +// TODO: document this var's purpose +const MIN_VISIBLE_ON_SCREEN = 32; +const ENABLE_DEVTOOLS = _buildInfo.buildInfo.releaseChannel === 'stable' ? settings.get('DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOURE_DOING', false) : true; +let mainWindow = null; +let mainWindowId = _Constants.DEFAULT_MAIN_WINDOW_ID; +let mainWindowInitialPath = null; +let mainWindowDidFinishLoad = false; +let mainWindowIsVisible = false; + +// whether we are in an intermediate auth process outside of our normal login screen (for e.g. internal builds) +let insideAuthFlow = false; + +// last time the main app renderer has crashed ('crashed' event) +let lastCrashed = 0; + +// whether we failed to load a page outside of the intermediate auth flow +// used to reload the page after a delay +let lastPageLoadFailed = false; + +// if an update fails, keep track of what modules we want to retry without delta +// updates. +/* eslint-disable camelcase */ +const retryUpdateOptions = { + skip_host_delta: false, + skip_module_delta: {} +}; +/* eslint-enable camelcase */ + +function getMainWindowId() { + return mainWindowId; +} +function webContentsSend(...args) { + if (mainWindow != null && mainWindow.webContents != null) { + const [event, ...options] = args; + mainWindow.webContents.send(`${DISCORD_NAMESPACE}${event}`, ...options); + } +} +function saveWindowConfig(browserWindow) { + try { + if (!browserWindow || browserWindow.isDestroyed()) { + return; + } + settings.set('IS_MAXIMIZED', browserWindow.isMaximized()); + settings.set('IS_MINIMIZED', browserWindow.isMinimized()); + if (!settings.get('IS_MAXIMIZED') && !settings.get('IS_MINIMIZED')) { + settings.set('WINDOW_BOUNDS', browserWindow.getBounds()); + } + settings.save(); + } catch (e) { + console.error(e); + } +} +function setWindowVisible(isVisible, andUnminimize) { + if (mainWindow == null) { + return; + } + if (isVisible) { + if (andUnminimize || !mainWindow.isMinimized()) { + mainWindow.show(); + webContentsSend('MAIN_WINDOW_FOCUS'); + } + } else { + webContentsSend('MAIN_WINDOW_BLUR'); + mainWindow.hide(); + if (systemTray.hasInit) { + systemTray.displayHowToCloseHint(); + } + } + mainWindow.setSkipTaskbar(!isVisible); + mainWindowIsVisible = isVisible; +} +function doAABBsOverlap(a, b) { + const ax1 = a.x + a.width; + const bx1 = b.x + b.width; + const ay1 = a.y + a.height; + const by1 = b.y + b.height; + // clamp a to b, see if it is non-empty + const cx0 = a.x < b.x ? b.x : a.x; + const cx1 = ax1 < bx1 ? ax1 : bx1; + if (cx1 - cx0 > 0) { + const cy0 = a.y < b.y ? b.y : a.y; + const cy1 = ay1 < by1 ? ay1 : by1; + if (cy1 - cy0 > 0) { + return true; + } + } + return false; +} +function getDisplayForBounds(displays, bounds) { + return displays.find(display => { + const displayBound = display.workArea; + displayBound.x += MIN_VISIBLE_ON_SCREEN; + displayBound.y += MIN_VISIBLE_ON_SCREEN; + displayBound.width -= 2 * MIN_VISIBLE_ON_SCREEN; + displayBound.height -= 2 * MIN_VISIBLE_ON_SCREEN; + return doAABBsOverlap(bounds, displayBound); + }); +} +function getSavedWindowBounds() { + if (!settings.get('WINDOW_BOUNDS')) { + return null; + } + const bounds = settings.get('WINDOW_BOUNDS'); + bounds.width = Math.max(MIN_WIDTH, bounds.width); + bounds.height = Math.max(MIN_HEIGHT, bounds.height); + const displays = _electron.screen.getAllDisplays(); + const display = getDisplayForBounds(displays, bounds); + return display != null ? bounds : null; +} +function applyWindowBoundsToConfig(mainWindowOptions) { + const bounds = getSavedWindowBounds(); + if (bounds == null) { + mainWindowOptions.center = true; + return; + } + mainWindowOptions.width = bounds.width; + mainWindowOptions.height = bounds.height; + mainWindowOptions.x = bounds.x; + mainWindowOptions.y = bounds.y; +} +function restoreMainWindowBounds(mainWindow) { + const savedWindowBounds = getSavedWindowBounds(); + const currentBounds = mainWindow.getBounds(); + if (savedWindowBounds != null && (currentBounds.height !== savedWindowBounds.height || currentBounds.width !== savedWindowBounds.width)) { + mainWindow.setBounds(savedWindowBounds); + } +} +function adjustWindowBounds(window) { + const bounds = window.getBounds(); + const displays = _electron.screen.getAllDisplays(); + const display = getDisplayForBounds(displays, bounds); + if (!display && displays.length > 0) { + // window bounds did not sufficiently overlap any of the displays + // force position to top-left of first display + const displayBounds = displays[0].bounds; + bounds.x = displayBounds.x; + bounds.y = displayBounds.y; + bounds.width = Math.min(bounds.width, displayBounds.width); + bounds.height = Math.min(bounds.height, displayBounds.height); + window.setBounds(bounds); + } +} + +// this can be called multiple times (due to recreating the main app window), +// so we only want to update existing if we already initialized it +function setupNotificationScreen(mainWindow) { + if (!notificationScreen.hasInit) { + notificationScreen.init({ + mainWindow, + title: 'Discord Notifications', + maxVisible: 5, + screenPosition: 'bottom' + }); + notificationScreen.events.on(notificationScreen.NOTIFICATION_CLICK, () => { + setWindowVisible(true, true); + }); + } else { + notificationScreen.setMainWindow(mainWindow); + } +} + +// this can be called multiple times (due to recreating the main app window), +// so we only want to update existing if we already initialized it +function setupSystemTray() { + if (!systemTray.hasInit) { + systemTray.init({ + onCheckForUpdates: () => { + const updater = _updater.updater === null || _updater.updater === void 0 ? void 0 : _updater.updater.getUpdater(); + if (updater != null) { + checkForUpdatesWithUpdater(updater); + } else { + _moduleUpdater.moduleUpdater.checkForUpdates(); + } + }, + onTrayClicked: () => setWindowVisible(true, true), + onOpenVoiceSettings: openVoiceSettings, + onToggleMute: toggleMute, + onToggleDeafen: toggleDeafen, + onLaunchApplication: launchApplication + }); + } +} + +// this can be called multiple times (due to recreating the main app window), +// so we only want to update existing if we already initialized it +function setupAppBadge() { + if (!appBadge.hasInit) { + appBadge.init(); + } +} + +// this can be called multiple times (due to recreating the main app window), +// so we only want to update existing if we already initialized it +function setupAppConfig() { + if (!appConfig.hasInit) { + appConfig.init(); + } +} + +// this can be called multiple times (due to recreating the main app window), +// so we only want to update existing if we already initialized it +function setupPopouts() { + if (!popoutWindows.hasInit) { + popoutWindows.init(); + } +} +function openVoiceSettings() { + setWindowVisible(true, true); + webContentsSend('SYSTEM_TRAY_OPEN_VOICE_SETTINGS'); +} +function toggleMute() { + webContentsSend('SYSTEM_TRAY_TOGGLE_MUTE'); +} +function toggleDeafen() { + webContentsSend('SYSTEM_TRAY_TOGGLE_DEAFEN'); +} +function launchApplication(applicationId) { + webContentsSend('LAUNCH_APPLICATION', applicationId); +} +const loadMainPage = () => { + lastPageLoadFailed = false; + mainWindow.loadURL(URL_TO_LOAD); +}; +const DEFAULT_BACKGROUND_COLOR = '#2f3136'; +const BACKGROUND_COLOR_KEY = 'BACKGROUND_COLOR'; +function getBackgroundColor() { + return settings.get(BACKGROUND_COLOR_KEY, DEFAULT_BACKGROUND_COLOR); +} +function setBackgroundColor(color) { + settings.set(BACKGROUND_COLOR_KEY, color); + mainWindow.setBackgroundColor(color); + settings.save(); +} + +// launch main app window; could be called multiple times for various reasons +function launchMainAppWindow(isVisible) { + if (mainWindow) { + // TODO: message here? + mainWindow.destroy(); + } + const mainWindowOptions = { + title: 'Discord', + backgroundColor: getBackgroundColor(), + width: DEFAULT_WIDTH, + height: DEFAULT_HEIGHT, + minWidth: MIN_WIDTH, + minHeight: MIN_HEIGHT, + transparent: false, + frame: false, + resizable: true, + show: isVisible, + webPreferences: { + blinkFeatures: 'EnumerateDevices,AudioOutputDevices', + nodeIntegration: false, + sandbox: false, + preload: _path.default.join(__dirname, 'mainScreenPreload.js'), + nativeWindowOpen: true, + enableRemoteModule: false, + spellcheck: true, + contextIsolation: true, + // NB: this is required in order to give popouts (or any child window opened via window.open w/ nativeWindowOpen) + // a chance at a node environment (i.e. they run the preload, have an isolated context, etc.) when + // `app.allowRendererProcessReuse === false` (default in Electron 7). + additionalArguments: ['--enable-node-leakage-in-renderers'], + devTools: ENABLE_DEVTOOLS + } + }; + if (process.platform === 'linux') { + mainWindowOptions.icon = _path.default.join(_path.default.dirname(_electron.app.getPath('exe')), 'discord.png'); + mainWindowOptions.frame = true; + } + if (process.platform === 'darwin') { + // Use native titlebar buttons on osx + mainWindowOptions.titleBarStyle = 'hidden'; + mainWindowOptions.trafficLightPosition = { + x: 10, + y: 10 + }; + } + applyWindowBoundsToConfig(mainWindowOptions); + mainWindow = new _electron.BrowserWindow(mainWindowOptions); + mainWindowId = mainWindow.id; + global.mainWindowId = mainWindowId; + includeOptionalModule('./ElectronTestRpc', module => module.initialize(mainWindow)); + + // Electron has a bug where it clamps the window size to the primary display's size + // causing the window to be too small on a larger secondary display + restoreMainWindowBounds(mainWindow); + + // Deny all permissions except for the ones used by Discord. + // This handler handles permissions that can be granted or denied + // asynchronously. + mainWindow.webContents.session.setPermissionRequestHandler((webContents, permission, callback, details) => { + switch (permission) { + // TODO: determine whether the 'accessibility-events' permission is + // actually needed, or if it can be removed without affecting a11y. + case 'accessibility-events': + callback(true); + return; + case 'notifications': + case 'pointerLock': + callback((0, _securityUtils.checkUrlOriginMatches)(details.requestingUrl, WEBAPP_ENDPOINT)); + return; + case 'fullscreen': + let result = false; + if (details.isMainFrame) { + result = (0, _securityUtils.checkUrlOriginMatches)(details.requestingUrl, WEBAPP_ENDPOINT); + } else { + // If we're in a subframe then just allow since the details.requestingUrl is the subframe's URL and + // there's nothing to match here. + result = true; + } + callback(result); + return; + } + callback(false); + }); + // This handler handles permissions that must be granted or denied + // synchronously. + mainWindow.webContents.session.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => { + switch (permission) { + case 'notifications': + case 'fullscreen': + case 'pointerLock': + if (details.isMainFrame || details.embeddingOrigin == null) { + return (0, _securityUtils.checkUrlOriginMatches)(requestingOrigin, WEBAPP_ENDPOINT); + } else { + return (0, _securityUtils.checkUrlOriginMatches)(details.embeddingOrigin, WEBAPP_ENDPOINT); + } + } + return false; + }); + mainWindow.setMenuBarVisibility(false); + if (settings.get('IS_MAXIMIZED')) { + mainWindow.maximize(); + } + if (settings.get('IS_MINIMIZED')) { + mainWindow.minimize(); + } + mainWindow.webContents.setWindowOpenHandler(({ + url, + frameName, + features + }) => { + if (frameName.startsWith(DISCORD_NAMESPACE) && (0, _securityUtils.checkUrlOriginMatches)(url, WEBAPP_ENDPOINT) && getSanitizedPath(url) === '/popout') { + return popoutWindows.openOrFocusWindow(url, frameName, features); + } else if ((0, _securityUtils.shouldOpenExternalUrl)(url)) { + (0, _securityUtils.saferShellOpenExternal)(url); + // Even if this opens the url, we still want to deny since we want to open in the user's browser, + // not the electron app + } + + return { + action: 'deny' + }; + }); + mainWindow.webContents.on('did-fail-load', (e, errCode, errDesc, validatedUrl) => { + if (insideAuthFlow) { + return; + } + if (validatedUrl !== URL_TO_LOAD) { + return; + } + + // -3 (ABORTED) means we are reloading the page before it has finished loading + // 0 (???) seems to also mean the same thing + if (errCode === -3 || errCode === 0) return; + lastPageLoadFailed = true; + console.error('[WebContents] did-fail-load', errCode, errDesc, `retry in ${connectionBackoff.current} ms`); + connectionBackoff.fail(() => { + console.log('[WebContents] retrying load', URL_TO_LOAD); + loadMainPage(); + }); + }); + mainWindow.webContents.on('did-create-window', (childWindow, { + options, + frameName + }) => { + popoutWindows.setupPopout(childWindow, frameName, options, WEBAPP_ENDPOINT); + adjustWindowBounds(childWindow); + }); + mainWindow.webContents.on('did-finish-load', () => { + if (insideAuthFlow && mainWindow.webContents && (0, _securityUtils.checkUrlOriginMatches)(mainWindow.webContents.getURL(), WEBAPP_ENDPOINT)) { + insideAuthFlow = false; + } + mainWindowDidFinishLoad = true; + + // if this is a first open and there's an initial path, direct user to that path + if (mainWindowInitialPath != null) { + webContentsSend('MAIN_WINDOW_PATH', mainWindowInitialPath); + mainWindowInitialPath = null; + } + webContentsSend(mainWindow != null && mainWindow.isFocused() ? 'MAIN_WINDOW_FOCUS' : 'MAIN_WINDOW_BLUR'); + if (!lastPageLoadFailed) { + connectionBackoff.succeed(); + _splashScreen.splashScreen.pageReady(); + } + }); + mainWindow.webContents.on('render-process-gone', (e, details) => { + const reason = (details === null || details === void 0 ? void 0 : details.reason) || 'Unknown'; + const killed = reason === 'killed'; + _processUtils.processUtilsSettings.rendererCrashReason = reason; + _processUtils.processUtilsSettings.rendererCrashExitCode = (details === null || details === void 0 ? void 0 : details.exitCode) ?? null; + _processUtils.processUtilsSettings.lastRunsStoredInformation = _processUtils.processUtilsSettings.currentStoredInformation; + _processUtils.processUtilsSettings.currentStoredInformation = {}; + if (killed) { + _electron.app.quit(); + return; + } + + // if we just crashed under 5 seconds ago, we are probably in a loop, so just die. + const crashTime = Date.now(); + if (crashTime - lastCrashed < 5 * 1000) { + console.error(`[WebContents] double crashed (reason: ${reason}, exitCode: ${details === null || details === void 0 ? void 0 : details.exitCode})... RIP =(`); + _electron.app.quit(); + return; + } + lastCrashed = crashTime; + console.error(`[WebContents] crashed (reason: ${reason}, exitCode: ${details === null || details === void 0 ? void 0 : details.exitCode})... reloading`); + + // Optionally avoid automatic restarts which can make debugging crashes more difficult. + if (envVariables.disableRestart) { + _electron.app.quit(); + return; + } + launchMainAppWindow(true); + }); + + // Prevent navigation when links or files are dropping into the app, turning it into a browser. + // https://github.com/discord/discord/pull/278 + mainWindow.webContents.on('will-navigate', (evt, url) => { + if (!insideAuthFlow && !(0, _securityUtils.checkUrlOriginMatches)(url, WEBAPP_ENDPOINT)) { + evt.preventDefault(); + } + }); + + // track intermediate auth flow + mainWindow.webContents.on('did-get-redirect-request', (event, oldUrl, newUrl) => { + if ((0, _securityUtils.checkUrlOriginMatches)(oldUrl, WEBAPP_ENDPOINT) && (0, _securityUtils.checkUrlOriginMatches)(newUrl, 'https://accounts.google.com/')) { + insideAuthFlow = true; + } + }); + mainWindow.webContents.on('context-menu', (_, params) => { + webContentsSend('SPELLCHECK_RESULT', params.misspelledWord, params.dictionarySuggestions); + }); + mainWindow.webContents.on('devtools-opened', () => { + webContentsSend('WINDOW_DEVTOOLS_OPENED'); + }); + mainWindow.webContents.on('devtools-closed', () => { + webContentsSend('WINDOW_DEVTOOLS_CLOSED'); + }); + mainWindow.on('focus', () => { + webContentsSend('MAIN_WINDOW_FOCUS'); + }); + mainWindow.on('blur', () => { + webContentsSend('MAIN_WINDOW_BLUR'); + }); + mainWindow.on('page-title-updated', (e, title) => { + if (mainWindow == null) { + return; + } + e.preventDefault(); + setMainWindowTitle(title); + }); + mainWindow.on('leave-html-full-screen', () => { + if (mainWindow == null) { + return; + } + + // fixes a bug wherein embedded videos returning from full screen cause our menu to be visible. + mainWindow.setMenuBarVisibility(false); + }); + mainWindow.webContents.on('did-navigate-in-page', (_, eventUrl) => { + if (mainWindow == null) { + return; + } + let parsedUrl; + try { + parsedUrl = _url.default.parse(eventUrl); + } catch (_) { + return; + } + + // Prevent back navigation from revisting the login page after logging in, + // or being able to navigate back after signing out. + if (parsedUrl && parsedUrl.pathname === '/login') { + mainWindow.webContents.clearHistory(); + } + + // Hackfix for https://github.com/electron/electron/issues/21584 + // When this event fires, because of a mouse button nav, `page-title-update` does not + // get called. So we re-check and update the main window's title here. + setMainWindowTitle(mainWindow.webContents.getTitle()); + }); + + // 'swipe' only works if the classic 3 finger swipe style is enabled in + // 'System Preferences > Trackpad > More Gestures.' The more modern 2 finger + // gesture should be added when Electron adds support. + mainWindow.on('swipe', (_, direction) => { + switch (direction) { + case 'left': + webContentsSend('NAVIGATE_BACK', 'SWIPE'); + break; + case 'right': + webContentsSend('NAVIGATE_FORWARD', 'SWIPE'); + break; + } + }); + + // Windows media keys and 4th/5th mouse buttons. + // (Linux binds these automatically; if we handle it here we get double back/forward.) + if (process.platform === 'win32') { + mainWindow.on('app-command', (_, cmd) => { + switch (cmd) { + case 'browser-backward': + webContentsSend('NAVIGATE_BACK', 'BROWSER'); + break; + case 'browser-forward': + webContentsSend('NAVIGATE_FORWARD', 'BROWSER'); + break; + } + }); + } + if (process.platform === 'darwin') { + mainWindow.on('close', e => { + // If null, discord quit in another event handler + if (mainWindow != null) { + // can't hide fullscreen windows, but that is a separate bug with discord + if (mainWindow.isFullScreen()) { + mainWindow.setFullScreen(false); + } else { + webContentsSend('MAIN_WINDOW_HIDDEN'); + _electron.default.Menu.sendActionToFirstResponder('hide:'); + } + e.preventDefault(); + return false; + } + }); + } + if (process.platform === 'win32') { + setupNotificationScreen(mainWindow); + } + setupSystemTray(); + setupAppBadge(); + setupAppConfig(); + setupPopouts(); + thumbarButtons.init(); + mouse.init(); + if (process.platform === 'linux' || process.platform === 'win32') { + systemTray.show(); + mainWindow.on('close', e => { + if (mainWindow == null) { + // this means we're quitting + popoutWindows.closePopouts(); + return; + } + webContentsSend('MAIN_WINDOW_BLUR'); + + // Save our app settings + saveWindowConfig(mainWindow); + + // Quit app if that's the setting + if (!settings.get('MINIMIZE_TO_TRAY', true)) { + _electron.app.quit(); + return; + } + webContentsSend('MAIN_WINDOW_HIDDEN'); + // Else, minimize to tray + setWindowVisible(false); + e.preventDefault(); + }); + } + loadMainPage(); +} +let updaterState = _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE; +function includeOptionalModule(path, cb) { + try { + const module = require(path); + if (cb) { + cb(module); + } + console.log(`Module ${path} was included.`); + return module; + } catch (e) { + if (e && e.code === 'MODULE_NOT_FOUND') { + console.log(`Optional module ${path} was not included.`); + } else { + console.error(`Failed to initialize ${path}`, e); + console.error(`e.toString() ${e.toString()}`); + } + } + return undefined; +} +function handleModuleUpdateCheckFinished(succeeded, updateCount, manualRequired) { + if (!succeeded) { + updaterState = _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE; + webContentsSend(_Constants.UpdaterEvents.UPDATE_ERROR); + return; + } + if (updateCount === 0) { + updaterState = _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE; + } else if (manualRequired) { + updaterState = _Constants.UpdaterEvents.UPDATE_MANUALLY; + } else { + updaterState = _Constants.UpdaterEvents.UPDATE_AVAILABLE; + } + webContentsSend(updaterState); +} +function handleModuleUpdateDownloadProgress(name, progress) { + if (mainWindow) { + mainWindow.setProgressBar(progress); + } + webContentsSend(_Constants.UpdaterEvents.MODULE_INSTALL_PROGRESS, name, progress); +} +function handleModuleUpdateDownloadsFinished(succeeded, failed) { + if (mainWindow) { + mainWindow.setProgressBar(-1); + } + if (updaterState === _Constants.UpdaterEvents.UPDATE_AVAILABLE) { + if (failed > 0) { + updaterState = _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE; + webContentsSend(_Constants.UpdaterEvents.UPDATE_ERROR); + } else { + updaterState = _Constants.UpdaterEvents.UPDATE_DOWNLOADED; + webContentsSend(updaterState); + } + } +} +function handleModuleUpdateInstalledModule(name, current, total, succeeded) { + if (mainWindow) { + mainWindow.setProgressBar(-1); + } + webContentsSend(_Constants.UpdaterEvents.MODULE_INSTALLED, name, succeeded); +} +function setUpdaterState(newUpdaterState) { + updaterState = newUpdaterState; + webContentsSend(updaterState); +} +function setMainWindowTitle(title) { + if (!title.endsWith('Discord')) { + title += ' - Discord'; + } + if (mainWindow) { + mainWindow.setTitle(title); + } +} + +/* eslint-disable camelcase */ +async function checkForUpdatesWithUpdater(updater) { + if (updaterState === _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE) { + setUpdaterState(_Constants.UpdaterEvents.CHECKING_FOR_UPDATES); + try { + let installedAnything = false; + const progressCallback = progress => { + const task = progress.task.HostInstall || progress.task.ModuleInstall; + if (task != null && progress.state === 'Complete') { + if (!installedAnything) { + installedAnything = true; + setUpdaterState(_Constants.UpdaterEvents.UPDATE_AVAILABLE); + } + } + if (task != null && progress.state.Failed != null) { + if (progress.task.HostInstall != null) { + retryUpdateOptions.skip_host_delta = true; + } else if (progress.task.ModuleInstall != null) { + retryUpdateOptions.skip_module_delta[task.version.module.name] = true; + } + } + }; + if (updater.updateToLatestWithOptions) { + await updater.updateToLatestWithOptions(retryUpdateOptions, progressCallback); + } else { + await updater.updateToLatest(progressCallback); + } + setUpdaterState(installedAnything ? _Constants.UpdaterEvents.UPDATE_DOWNLOADED : _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE); + } catch (e) { + console.error('Update to latest failed: ', e); + updaterState = _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE; + webContentsSend(_Constants.UpdaterEvents.UPDATE_ERROR); + } + } else { + webContentsSend(updaterState); + } +} +/* eslint-enable camelcase */ + +// Setup handling of events related to updates using the new updater. +function setupUpdaterEventsWithUpdater(updater) { + _electron.app.on(_Constants.MenuEvents.CHECK_FOR_UPDATES, () => checkForUpdatesWithUpdater()); + _ipcMain.default.on(_Constants.UpdaterEvents.CHECK_FOR_UPDATES, () => { + return checkForUpdatesWithUpdater(updater); + }); + _ipcMain.default.on(_Constants.UpdaterEvents.QUIT_AND_INSTALL, () => { + saveWindowConfig(mainWindow); + mainWindow = null; + + // TODO(eiz): This is a workaround for old Linux host versions whose host + // updater did not have a quitAndInstall() method, which causes the module + // updater to crash if a host update is available and we try to restart to + // install modules. Remove when all hosts are updated. + try { + _moduleUpdater.moduleUpdater.quitAndInstallUpdates(); + } catch (e) { + _electron.app.relaunch(); + _electron.app.quit(); + } + }); + _ipcMain.default.on(_Constants.UpdaterEvents.UPDATER_HISTORY_QUERY_AND_TRUNCATE, () => { + if (updater.queryAndTruncateHistory != null) { + webContentsSend(_Constants.UpdaterEvents.UPDATER_HISTORY_RESPONSE, updater.queryAndTruncateHistory()); + } else { + webContentsSend(_Constants.UpdaterEvents.UPDATER_HISTORY_RESPONSE, []); + } + }); +} + +// Setup events related to updates using the old module updater. +// +// sets up event listeners between the browser window and the app to send +// and listen to update-related events +function setupLegacyUpdaterEvents() { + _electron.app.on(_Constants.MenuEvents.CHECK_FOR_UPDATES, () => _moduleUpdater.moduleUpdater.checkForUpdates()); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.CHECKING_FOR_UPDATES, () => { + updaterState = _Constants.UpdaterEvents.CHECKING_FOR_UPDATES; + webContentsSend(updaterState); + }); + + // TODO(eiz): We currently still need to handle the old style non-object-based + // updater events to allow discord_desktop_core to be newer than the host asar, + // which contains the updater itself. + // + // Once all clients have updated to a sufficiently new host, we can delete this. + if (_moduleUpdater.moduleUpdater.supportsEventObjects) { + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.UPDATE_CHECK_FINISHED, ({ + succeeded, + updateCount, + manualRequired + }) => { + handleModuleUpdateCheckFinished(succeeded, updateCount, manualRequired); + }); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.DOWNLOADING_MODULE_PROGRESS, ({ + name, + progress + }) => { + handleModuleUpdateDownloadProgress(name, progress); + }); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.DOWNLOADING_MODULES_FINISHED, ({ + succeeded, + failed + }) => { + handleModuleUpdateDownloadsFinished(succeeded, failed); + }); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.INSTALLED_MODULE, ({ + name, + current, + total, + succeeded + }) => { + handleModuleUpdateInstalledModule(name, current, total, succeeded); + }); + } else { + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.UPDATE_CHECK_FINISHED, (succeeded, updateCount, manualRequired) => { + handleModuleUpdateCheckFinished(succeeded, updateCount, manualRequired); + }); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.DOWNLOADING_MODULE_PROGRESS, (name, progress) => { + handleModuleUpdateDownloadProgress(name, progress); + }); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.DOWNLOADING_MODULES_FINISHED, (succeeded, failed) => { + handleModuleUpdateDownloadsFinished(succeeded, failed); + }); + _moduleUpdater.moduleUpdater.events.on(_moduleUpdater.moduleUpdater.INSTALLED_MODULE, (name, current, total, succeeded) => { + handleModuleUpdateInstalledModule(name, current, total, succeeded); + }); + } + _ipcMain.default.on(_Constants.UpdaterEvents.CHECK_FOR_UPDATES, () => { + if (updaterState === _Constants.UpdaterEvents.UPDATE_NOT_AVAILABLE) { + _moduleUpdater.moduleUpdater.checkForUpdates(); + } else { + webContentsSend(updaterState); + } + }); + _ipcMain.default.on(_Constants.UpdaterEvents.QUIT_AND_INSTALL, () => { + saveWindowConfig(mainWindow); + mainWindow = null; + + // TODO(eiz): This is a workaround for old Linux host versions whose host + // updater did not have a quitAndInstall() method, which causes the module + // updater to crash if a host update is available and we try to restart to + // install modules. Remove when all hosts are updated. + try { + _moduleUpdater.moduleUpdater.quitAndInstallUpdates(); + } catch (e) { + _electron.app.relaunch(); + _electron.app.quit(); + } + }); + _ipcMain.default.on(_Constants.UpdaterEvents.MODULE_INSTALL, (_event, name) => { + // NOTE: do NOT allow options to be passed in, as this enables a client to downgrade its modules to potentially + // insecure versions. + _moduleUpdater.moduleUpdater.install(name, false); + }); + _ipcMain.default.on(_Constants.UpdaterEvents.MODULE_QUERY, (_event, name) => { + webContentsSend(_Constants.UpdaterEvents.MODULE_INSTALLED, name, _moduleUpdater.moduleUpdater.isInstalled(name)); + }); + _ipcMain.default.on(_Constants.UpdaterEvents.UPDATER_HISTORY_QUERY_AND_TRUNCATE, () => { + webContentsSend(_Constants.UpdaterEvents.UPDATER_HISTORY_RESPONSE, _moduleUpdater.moduleUpdater.events.history); + _moduleUpdater.moduleUpdater.events.history = []; + }); +} +function handleDisplayChange() { + if (mainWindow == null) { + return; + } + + // TODO[adill]: if there are display changes while a maximized window is hidden electron will end up showing a + // phantom non-interactive version of that window. i believe the root cause to be exactly this upstream issue: + // https://github.com/electron/electron/issues/27429 + // we can probably remove these once the upstream issue is fixed. + if (process.platform === 'win32' && !mainWindowIsVisible) { + setWindowVisible(mainWindowIsVisible, false); + } +} +function init() { + _electron.screen.on('display-added', handleDisplayChange); + _electron.screen.on('display-removed', handleDisplayChange); + _electron.screen.on('display-metrics-changed', handleDisplayChange); + + // electron default behavior is to app.quit here, so long as there are no other listeners. we handle quitting + // or minimizing to system tray ourselves via mainWindow.on('closed') so this is simply to disable the electron + // default behavior. + _electron.app.on('window-all-closed', () => { + if (envVariables.test) { + _electron.app.quit(); + } + }); + _electron.app.on('before-quit', () => { + saveWindowConfig(mainWindow); + mainWindow = null; + notificationScreen.close(); + }); + + // TODO: move this to main startup + _electron.app.on('gpu-process-crashed', (e, killed) => { + if (killed) { + _electron.app.quit(); + } + }); + _electron.app.on('accessibility-support-changed', (_event, accessibilitySupportEnabled) => webContentsSend('ACCESSIBILITY_SUPPORT_CHANGED', accessibilitySupportEnabled)); + _electron.app.on(_Constants.MenuEvents.OPEN_HELP, () => webContentsSend('HELP_OPEN')); + _electron.app.on(_Constants.MenuEvents.OPEN_SETTINGS, () => webContentsSend('USER_SETTINGS_OPEN')); + + // TODO: this hotpatches an issue with focusing the app from background. + // delete this after next stable electron release. + _electron.app.on('second-instance', (_event, args) => { + // if the second instance is the uninstaller, the bootstrap listener will quit the running app + if (args != null && args.indexOf('--squirrel-uninstall') > -1) { + return; + } + + // if the current instance is multi instance, we want to leave the window alone + if (process.argv != null && process.argv.slice(1).includes('--multi-instance')) { + return; + } + if (mainWindow == null) { + return; + } + setWindowVisible(true, false); + mainWindow.focus(); + }); + _ipcMain.default.on('SETTINGS_UPDATE_BACKGROUND_COLOR', (_event, backgroundColor) => { + if (getBackgroundColor() !== backgroundColor) { + setBackgroundColor(backgroundColor); + } + }); + const updater = _updater.updater === null || _updater.updater === void 0 ? void 0 : _updater.updater.getUpdater(); + if (updater != null) { + setupUpdaterEventsWithUpdater(updater); + } else { + setupLegacyUpdaterEvents(); + } + launchMainAppWindow(false); +} +function handleOpenUrl(url) { + const path = getSanitizedProtocolPath(url); + if (path != null) { + if (!mainWindowDidFinishLoad) { + mainWindowInitialPath = path; + } + webContentsSend('MAIN_WINDOW_PATH', path); + } + if (mainWindow == null) { + return; + } + setWindowVisible(true, false); + mainWindow.focus(); +} +function setMainWindowVisible(visible) { + setWindowVisible(visible, false); +} \ No newline at end of file diff --git a/core/src/app/mainScreenPreload.js b/core/src/app/mainScreenPreload.js new file mode 100644 index 0000000..0834c6b --- /dev/null +++ b/core/src/app/mainScreenPreload.js @@ -0,0 +1,74 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +if (!process.isMainFrame) { + throw new Error('Preload scripts should not be running in a subframe'); +} +let uncaughtExceptionHandler; +function setUncaughtExceptionHandler(handler) { + uncaughtExceptionHandler = handler; +} +if (window.opener === null) { + // App preload script, used to provide a replacement native API now that + // we turned off node integration. + const { + contextBridge, + discord + } = require('electron'); + discord === null || discord === void 0 ? void 0 : discord.install('createDiscordStream'); + const app = require('./discord_native/renderer/app'); + const powerMonitor = require('./discord_native/renderer/powerMonitor'); + const DiscordNative = { + isRenderer: process.type === 'renderer', + setUncaughtExceptionHandler, + nativeModules: require('./discord_native/renderer/nativeModules'), + process: require('./discord_native/renderer/process'), + os: require('./discord_native/renderer/os'), + app, + clipboard: require('./discord_native/renderer/clipboard'), + ipc: require('./discord_native/renderer/ipc'), + gpuSettings: require('./discord_native/renderer/gpuSettings'), + window: require('./discord_native/renderer/window'), + powerMonitor, + spellCheck: require('./discord_native/renderer/spellCheck'), + crashReporter: require('./discord_native/renderer/crashReporter'), + desktopCapture: require('./discord_native/renderer/desktopCapture'), + fileManager: require('./discord_native/renderer/fileManager'), + clips: require('./discord_native/renderer/clips'), + processUtils: require('./discord_native/renderer/processUtils'), + powerSaveBlocker: require('./discord_native/renderer/powerSaveBlocker'), + http: require('./discord_native/renderer/http'), + accessibility: require('./discord_native/renderer/accessibility'), + features: require('./discord_native/renderer/features'), + settings: require('./discord_native/renderer/settings'), + userDataCache: require('./discord_native/renderer/userDataCache'), + thumbar: require('./discord_native/renderer/thumbar'), + safeStorage: require('./discord_native/renderer/safeStorage'), + globalOverlay: require('./discord_native/renderer/globalOverlay'), + // TODO: remove these once web no longer uses them + remoteApp: app, + // TODO: Fix. This is a hack to get typing done. + remotePowerMonitor: powerMonitor + }; + contextBridge.exposeInMainWorld('DiscordNative', DiscordNative); + process.once('loaded', () => { + // ensures native module `require` context has access to DiscordNative + global.DiscordNative = DiscordNative; + DiscordNative.fileManager.cleanupTempFiles(); // No need to await. + }); + + process.on('uncaughtException', (err, origin) => { + var _uncaughtExceptionHan; + (_uncaughtExceptionHan = uncaughtExceptionHandler) === null || _uncaughtExceptionHan === void 0 ? void 0 : _uncaughtExceptionHan(err, origin); + }); + window.popouts = new Map(); +} else { + window.addEventListener('load', _ => { + window.opener.popouts.set(window.name, window); + }); + window.addEventListener('beforeunload', _ => { + window.opener.popouts.delete(window.name); + }); +} \ No newline at end of file diff --git a/core/src/app/mouse.js b/core/src/app/mouse.js new file mode 100644 index 0000000..59be80c --- /dev/null +++ b/core/src/app/mouse.js @@ -0,0 +1,18 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.init = init; +var _electron = require("electron"); +var _constants = require("./discord_native/common/constants"); +var _ipcMain = _interopRequireDefault(require("./ipcMain")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +let hasInit = false; +function init() { + if (hasInit) { + return; + } + _ipcMain.default.handle(_constants.IPCEvents.GET_MOUSE_COORDINATES, () => _electron.screen.getCursorScreenPoint()); + hasInit = true; +} \ No newline at end of file diff --git a/core/src/app/notificationScreen.js b/core/src/app/notificationScreen.js new file mode 100644 index 0000000..4307a9b --- /dev/null +++ b/core/src/app/notificationScreen.js @@ -0,0 +1,192 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.NOTIFICATION_CLICK = void 0; +exports.close = close; +exports.hasInit = exports.events = void 0; +exports.init = init; +exports.setMainWindow = setMainWindow; +var _electron = require("electron"); +var _fs = _interopRequireDefault(require("fs")); +var _path = _interopRequireDefault(require("path")); +var _events = require("events"); +var _url = _interopRequireDefault(require("url")); +var _ipcMain = _interopRequireDefault(require("./ipcMain")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +// TODO: transparency detection? +// TODO: SHQueryUserNotificationState + +// ipcMain events +const IPC_NOTIFICATIONS_CLEAR = 'NOTIFICATIONS_CLEAR'; +const IPC_NOTIFICATION_SHOW = 'NOTIFICATION_SHOW'; +const IPC_NOTIFICATION_CLICK = 'NOTIFICATION_CLICK'; +const IPC_NOTIFICATION_CLOSE = 'NOTIFICATION_CLOSE'; + +// events +const events = new _events.EventEmitter(); +exports.events = events; +const NOTIFICATION_CLICK = 'notification-click'; +exports.NOTIFICATION_CLICK = NOTIFICATION_CLICK; +let hasInit = false; +exports.hasInit = hasInit; +const variablesFilePath = _path.default.join(__dirname, 'notifications', 'variables.json'); +let mainWindow; +let title; +let maxVisible; +let screenPosition; +let notifications; +let hideTimeout; +let notificationWindow; +let VARIABLES; +function webContentsSend(win, event, ...args) { + if (win != null && win.webContents != null) { + win.webContents.send(`DISCORD_${event}`, ...args); + } +} +function init({ + mainWindow: _mainWindow, + title: _title, + maxVisible: _maxVisible, + screenPosition: _screenPosition +}) { + if (hasInit) { + console.warn('notificationScreen: Has already init! Cancelling init.'); + return; + } + exports.hasInit = hasInit = true; + VARIABLES = JSON.parse(_fs.default.readFileSync(variablesFilePath)); + mainWindow = _mainWindow; + title = _title; + maxVisible = _maxVisible; + screenPosition = _screenPosition; + notifications = []; + hideTimeout = null; + _ipcMain.default.on(IPC_NOTIFICATIONS_CLEAR, handleNotificationsClear); + _ipcMain.default.on(IPC_NOTIFICATION_SHOW, handleNotificationShow); + _ipcMain.default.on(IPC_NOTIFICATION_CLICK, handleNotificationClick); + _ipcMain.default.on(IPC_NOTIFICATION_CLOSE, handleNotificationClose); +} +function destroyWindow() { + if (notificationWindow == null) return; + notificationWindow.hide(); + notificationWindow.close(); + notificationWindow = null; +} +function close() { + mainWindow = null; + destroyWindow(); + _ipcMain.default.removeListener(IPC_NOTIFICATIONS_CLEAR, handleNotificationsClear); + _ipcMain.default.removeListener(IPC_NOTIFICATION_SHOW, handleNotificationShow); + _ipcMain.default.removeListener(IPC_NOTIFICATION_CLICK, handleNotificationClick); + _ipcMain.default.removeListener(IPC_NOTIFICATION_CLOSE, handleNotificationClose); +} +function setMainWindow(_mainWindow) { + mainWindow = _mainWindow; +} +function handleNotificationsClear() { + notifications = []; + updateNotifications(); +} +function handleNotificationShow(e, notification) { + notifications.push(notification); + updateNotifications(); +} +function handleNotificationClick(e, notificationId) { + webContentsSend(mainWindow, IPC_NOTIFICATION_CLICK, notificationId); + events.emit(NOTIFICATION_CLICK); +} +function handleNotificationClose(e, notificationId) { + if (notificationWindow) { + webContentsSend(notificationWindow, 'FADE_OUT', notificationId); + } + setTimeout(() => { + notifications = notifications.filter(notification => notification.id !== notificationId); + updateNotifications(); + }, VARIABLES.outDuration); +} +function updateNotifications() { + if (notifications.length > 0) { + clearTimeout(hideTimeout); + hideTimeout = null; + if (notificationWindow != null) { + const { + width, + height, + x, + y + } = calculateBoundingBox(); + // [adill] this order is important. if you setPosition before you setSize electron + // incorrectly computes the window size. i haven't investigated the root cause + // further than this observation. + notificationWindow.setSize(width, height); + notificationWindow.setPosition(x, y); + notificationWindow.showInactive(); + } else { + createWindow(); + return; + } + } else if (hideTimeout == null) { + hideTimeout = setTimeout(() => destroyWindow(), VARIABLES.outDuration * 1.1); + } + if (notificationWindow != null) { + webContentsSend(notificationWindow, 'UPDATE', notifications.slice(0, maxVisible)); + } +} +function calculateBoundingBox() { + const [positionX, positionY] = mainWindow.getPosition(); + const [windowWidth, windowHeight] = mainWindow.getSize(); + const centerPoint = { + x: Math.round(positionX + windowWidth / 2), + y: Math.round(positionY + windowHeight / 2) + }; + const activeDisplay = _electron.screen.getDisplayNearestPoint(centerPoint) || _electron.screen.getPrimaryDisplay(); + const workArea = activeDisplay.workArea; + const width = VARIABLES.width; + const height = maxVisible * VARIABLES.height; + const x = workArea.x + workArea.width - width; + let y; + switch (screenPosition) { + case 'top': + y = workArea.y; + break; + case 'bottom': + y = workArea.y + workArea.height - height; + break; + } + return { + x, + y, + width, + height + }; +} +function createWindow() { + if (notificationWindow != null) { + return; + } + notificationWindow = new _electron.BrowserWindow({ + title: title, + frame: false, + resizable: false, + show: false, + acceptFirstMouse: true, + alwaysOnTop: true, + skipTaskbar: true, + transparent: true, + webPreferences: { + nodeIntegration: false, + preload: _path.default.join(__dirname, 'notificationScreenPreload.js'), + enableRemoteModule: false, + contextIsolation: true + } + }); + const notificationUrl = _url.default.format({ + protocol: 'file', + slashes: true, + pathname: _path.default.join(__dirname, 'notifications', 'index.html') + }); + notificationWindow.loadURL(notificationUrl); + notificationWindow.webContents.on('did-finish-load', () => updateNotifications()); +} \ No newline at end of file diff --git a/core/src/app/notificationScreenPreload.js b/core/src/app/notificationScreenPreload.js new file mode 100644 index 0000000..e29b29e --- /dev/null +++ b/core/src/app/notificationScreenPreload.js @@ -0,0 +1,17 @@ +"use strict"; + +const { + contextBridge, + ipcRenderer +} = require('electron'); +contextBridge.exposeInMainWorld('ipcRenderer', { + send: (event, ...args) => { + ipcRenderer.send(`DISCORD_${event}`, ...args); + }, + on: (event, callback) => { + ipcRenderer.on(`DISCORD_${event}`, callback); + }, + removeListener: (event, callback) => { + ipcRenderer.removeListener(`DISCORD_${event}`, callback); + } +}); \ No newline at end of file diff --git a/core/src/app/notifications/14f734d6803726c94b970c3ed80c0864.svg b/core/src/app/notifications/14f734d6803726c94b970c3ed80c0864.svg new file mode 100644 index 0000000..1b00def --- /dev/null +++ b/core/src/app/notifications/14f734d6803726c94b970c3ed80c0864.svg @@ -0,0 +1,15 @@ + + + + +Slice 1 +Created with Sketch (http://www.bohemiancoding.com/sketch) + + + + diff --git a/core/src/app/notifications/33ca047f7152c1abc7d3cb1c4bc64aab.woff2 b/core/src/app/notifications/33ca047f7152c1abc7d3cb1c4bc64aab.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..938dd38979bdebffa4c5409f9dbd63220d918373 GIT binary patch literal 30460 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 DR|?^| literal 0 HcmV?d00001 diff --git a/core/src/app/notifications/587be4501122cedab165d89ee2ee446d.svg b/core/src/app/notifications/587be4501122cedab165d89ee2ee446d.svg new file mode 100644 index 0000000..e5f71c3 --- /dev/null +++ b/core/src/app/notifications/587be4501122cedab165d89ee2ee446d.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/src/app/notifications/ac3f027697c11abd84295888e843f3d2.woff2 b/core/src/app/notifications/ac3f027697c11abd84295888e843f3d2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..20c0fde36de14081c47d57c34f1caede44976adc GIT binary patch literal 29668 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�a^D6Ms(9 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 literal 0 HcmV?d00001 diff --git a/core/src/app/notifications/index.html b/core/src/app/notifications/index.html new file mode 100644 index 0000000..a41f496 --- /dev/null +++ b/core/src/app/notifications/index.html @@ -0,0 +1,10 @@ + + + + + + +
+ + + diff --git a/core/src/app/notifications/index.js b/core/src/app/notifications/index.js new file mode 100644 index 0000000..7ca0b1e --- /dev/null +++ b/core/src/app/notifications/index.js @@ -0,0 +1,33 @@ +!function(e){var n={};function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var a in e)t.d(r,a,function(n){return e[n]}.bind(null,a));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=22)}([function(e,n,t){"use strict";e.exports=t(14)},function(e,n,t){"use strict";var r=t(0),a=t(18);if(void 0===r)throw Error("create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class.");var l=(new r.Component).updater;e.exports=a(r.Component,r.isValidElement,l)},function(e,n,t){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=t(15)},function(e,n,t){var r=t(4);"string"==typeof r&&(r=[[e.i,r,""]]);var a={hmr:!0,transform:void 0};t(12)(r,a);r.locals&&(e.exports=r.locals)},function(e,n,t){var r=t(5);(e.exports=t(6)(!1)).push([e.i,"@font-face {\n font-family: gg sans;\n font-weight: 400;\n src: url("+r(t(7))+") format('woff2');\n}\n@font-face {\n font-family: gg sans;\n font-weight: 500;\n src: url("+r(t(8))+") format('woff2');\n}\n@font-face {\n font-family: gg sans;\n font-weight: 700;\n src: url("+r(t(9))+') format(\'woff2\');\n}\n@-webkit-keyframes flipIn {\n 0% {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n transition-timing-function: ease-in;\n opacity: 0;\n }\n 40% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n transition-timing-function: ease-in;\n }\n 60% {\n transform: perspective(400px) rotate3d(1, 0, 0, 10deg);\n opacity: 1;\n }\n 80% {\n transform: perspective(400px) rotate3d(1, 0, 0, -5deg);\n }\n 100% {\n transform: perspective(400px);\n }\n}\n@-webkit-keyframes flipOut {\n 0% {\n transform: perspective(400px);\n }\n 30% {\n transform: perspective(400px) rotate3d(1, 0, 0, -20deg);\n opacity: 1;\n }\n 100% {\n transform: perspective(400px) rotate3d(1, 0, 0, 90deg);\n opacity: 0;\n }\n}\n* {\n box-sizing: border-box;\n -webkit-user-select: none;\n cursor: default;\n}\nbody {\n margin: 0;\n overflow: hidden;\n}\n#notifications {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 400;\n height: 530;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n}\n.notification {\n height: 96px;\n width: 390px;\n font-family: "gg sans", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n line-height: 18px;\n font-size: 12px;\n background-color: #fff;\n background-clip: padding-box;\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n transition: 0.2s background-color;\n -webkit-animation-fill-mode: both;\n margin-bottom: 10px;\n margin-right: 10px;\n position: relative;\n}\n.notification.in {\n backface-visibility: visible !important;\n -webkit-animation-name: flipIn;\n -webkit-animation-duration: 700ms;\n}\n.notification.out {\n backface-visibility: visible !important;\n -webkit-animation-name: flipOut;\n -webkit-animation-duration: 333ms;\n}\n.notification:hover .notification-dismiss {\n opacity: 0.5;\n}\n.notification .notification-dismiss {\n position: absolute;\n opacity: 0;\n width: 10px;\n height: 10px;\n right: 6px;\n top: 6px;\n background: url('+r(t(10))+") no-repeat;\n background-size: 10px;\n transition: 0.2s opacity;\n z-index: 1;\n cursor: pointer;\n padding: 0;\n margin: 0;\n border: none;\n outline: none;\n}\n.notification .notification-dismiss:hover {\n opacity: 1;\n}\n.notification .notification-logo {\n position: absolute;\n bottom: 10px;\n right: 12px;\n width: 22px;\n height: 24px;\n background: url("+r(t(11))+") center center no-repeat;\n background-size: 22px 24px;\n}\n.notification .notification-contents {\n height: 96px;\n width: 390px;\n display: flex;\n flex-direction: row;\n}\n.notification .notification-contents .notification-icon {\n height: 96px;\n width: 96px;\n background: #1e2124;\n background-size: 96px 96px;\n}\n.notification .notification-contents .notification-body {\n flex: 1;\n padding: 10px;\n}\n.notification .notification-contents .notification-body header {\n margin: 0;\n font-size: 16px;\n line-height: 1.8em;\n font-weight: 600;\n color: #5865f2;\n letter-spacing: 0.02em;\n}\n.notification .notification-contents .notification-body p {\n margin: 0;\n color: #737f8d;\n font-size: 12px;\n line-height: 1.25em;\n overflow: hidden;\n width: 90%;\n flex: 1;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n.notification .notification-contents .notification-body p + p {\n margin-top: 5px;\n}\n",""])},function(e,n){e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,n){e.exports=function(e){var n=[];return n.toString=function(){return this.map((function(n){var t=function(e,n){var t=e[1]||"",r=e[3];if(!r)return t;if(n&&"function"==typeof btoa){var a=(o=r,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */"),l=r.sources.map((function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"}));return[t].concat(l).concat([a]).join("\n")}var o;return[t].join("\n")}(n,e);return n[2]?"@media "+n[2]+"{"+t+"}":t})).join("")},n.i=function(e,t){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},a=0;a=0&&c.splice(n,1)}function g(e){var n=document.createElement("style");return e.attrs.type="text/css",v(n,e.attrs),m(e,n),n}function v(e,n){Object.keys(n).forEach((function(t){e.setAttribute(t,n[t])}))}function y(e,n){var t,r,a,l;if(n.transform&&e.css){if(!(l=n.transform(e.css)))return function(){};e.css=l}if(n.singleton){var o=s++;t=u||(u=g(n)),r=k.bind(null,t,o,!1),a=k.bind(null,t,o,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(t=function(e){var n=document.createElement("link");return e.attrs.type="text/css",e.attrs.rel="stylesheet",v(n,e.attrs),m(e,n),n}(n),r=E.bind(null,t,n),a=function(){h(t),t.href&&URL.revokeObjectURL(t.href)}):(t=g(n),r=S.bind(null,t),a=function(){h(t)});return r(e),function(n){if(n){if(n.css===e.css&&n.media===e.media&&n.sourceMap===e.sourceMap)return;r(e=n)}else a()}}e.exports=function(e,n){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(n=n||{}).attrs="object"==typeof n.attrs?n.attrs:{},n.singleton||(n.singleton=o()),n.insertInto||(n.insertInto="head"),n.insertAt||(n.insertAt="bottom");var t=p(e,n);return d(t,n),function(e){for(var r=[],a=0;a