From edf899df9105c3ec4318fa774e888df2c3c2248e Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Wed, 4 Dec 2024 16:42:26 -0300 Subject: [PATCH 01/66] AI Chat browsing menu (#3635) Task/Issue URL: https://app.asana.com/0/1204167627774280/1208794395441049/f **Description**: Add AI Chat entry point in the browsing menu --- Core/FeatureFlag.swift | 1 + Core/PixelEvent.swift | 19 +- DuckDuckGo.xcodeproj/project.pbxproj | 49 +++++ DuckDuckGo/AIChat/AIChatPixelHandler.swift | 32 +++ DuckDuckGo/AIChat/AIChatSettings.swift | 108 +++++++++ .../24px/AIChat-24.imageset/AIChat-24.pdf | Bin 0 -> 1590 bytes .../24px/AIChat-24.imageset/Contents.json | 16 ++ .../MenuAIChat.imageset/AIChat.pdf | Bin 0 -> 2549 bytes .../MenuAIChat.imageset/Contents.json | 12 + .../BrowsingMenuViewController.swift | 5 +- DuckDuckGo/MainViewController+Segues.swift | 6 +- DuckDuckGo/MainViewController.swift | 25 ++- .../SettingsAIChat.imageset/Contents.json | 12 + .../SettingsAIChat.pdf | Bin 0 -> 2766 bytes .../SettingsAIChatHero.imageset/Contents.json | 12 + .../SettingsAIChatHero.pdf | Bin 0 -> 3779 bytes DuckDuckGo/SettingsAIChatView.swift | 54 +++++ DuckDuckGo/SettingsMainSettingsView.swift | 10 +- DuckDuckGo/SettingsRootView.swift | 2 + DuckDuckGo/SettingsState.swift | 8 +- DuckDuckGo/SettingsViewModel.swift | 24 +- DuckDuckGo/TabDelegate.swift | 2 + ...bViewControllerBrowsingMenuExtension.swift | 63 +++++- DuckDuckGo/UserText.swift | 21 +- DuckDuckGo/en.lproj/Localizable.strings | 26 ++- .../AIChat/AIChatSettingsTests.swift | 131 +++++++++++ DuckDuckGoTests/MockTabDelegate.swift | 2 + LocalPackages/AIChat/Package.swift | 20 ++ .../Sources/AIChat/AIChatViewModel.swift | 81 +++++++ .../AIChat/AIChatWebViewController.swift | 133 ++++++++++++ .../Public API/AIChatPixelHandling.swift | 27 +++ .../Public API/AIChatSettingsProvider.swift | 37 ++++ .../Public API/AIChatViewController.swift | 205 ++++++++++++++++++ .../AIChat/Public API/Logger+AIChat.swift | 25 +++ .../Sources/AIChat/TimerPixelHandler.swift | 56 +++++ .../AIChat/Sources/AIChat/UserText.swift | 24 ++ 36 files changed, 1218 insertions(+), 30 deletions(-) create mode 100644 DuckDuckGo/AIChat/AIChatPixelHandler.swift create mode 100644 DuckDuckGo/AIChat/AIChatSettings.swift create mode 100644 DuckDuckGo/Assets.xcassets/DesignSystemIcons/24px/AIChat-24.imageset/AIChat-24.pdf create mode 100644 DuckDuckGo/Assets.xcassets/DesignSystemIcons/24px/AIChat-24.imageset/Contents.json create mode 100644 DuckDuckGo/BrowsingMenu/BrowsingMenu.xcassets/MenuAIChat.imageset/AIChat.pdf create mode 100644 DuckDuckGo/BrowsingMenu/BrowsingMenu.xcassets/MenuAIChat.imageset/Contents.json create mode 100644 DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/Contents.json create mode 100644 DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/SettingsAIChat.pdf create mode 100644 DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/Contents.json create mode 100644 DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/SettingsAIChatHero.pdf create mode 100644 DuckDuckGo/SettingsAIChatView.swift create mode 100644 DuckDuckGoTests/AIChat/AIChatSettingsTests.swift create mode 100644 LocalPackages/AIChat/Package.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/Public API/AIChatSettingsProvider.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/Public API/Logger+AIChat.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift create mode 100644 LocalPackages/AIChat/Sources/AIChat/UserText.swift diff --git a/Core/FeatureFlag.swift b/Core/FeatureFlag.swift index 15263d9e7b..8bf183dafd 100644 --- a/Core/FeatureFlag.swift +++ b/Core/FeatureFlag.swift @@ -56,6 +56,7 @@ public enum FeatureFlag: String { /// https://app.asana.com/0/1208592102886666/1208613627589762/f case crashReportOptInStatusResetting + case isPrivacyProLaunchedROW case isPrivacyProLaunchedROWOverride diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index b98773df96..2edc84584d 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -80,6 +80,7 @@ extension Pixel { case browsingMenuShare case browsingMenuCopy case browsingMenuPrint + case browsingMenuListPrint case browsingMenuFindInPage case browsingMenuZoom case browsingMenuDisableProtection @@ -87,7 +88,8 @@ extension Pixel { case browsingMenuReportBrokenSite case browsingMenuFireproof case browsingMenuAutofill - + case browsingMenuAIChat + case addressBarShare case addressBarSettings case addressBarCancelPressedOnNTP @@ -895,9 +897,13 @@ extension Pixel { case appDidShowUITime(time: BucketAggregation) case appDidBecomeActiveTime(time: BucketAggregation) + // MARK: AI Chat + case openAIChatBefore10min + case openAIChatAfter10min + case aiChatNoRemoteSettingsFound(settings: String) + // MARK: Lifecycle case appDidTransitionToUnexpectedState - } } @@ -959,6 +965,7 @@ extension Pixel.Event { case .browsingMenuToggleBrowsingMode: return "mb_dm" case .browsingMenuCopy: return "mb_cp" case .browsingMenuPrint: return "mb_pr" + case .browsingMenuFindInPage: return "mb_fp" case .browsingMenuZoom: return "m_menu_page_zoom_taps" case .browsingMenuDisableProtection: return "mb_wla" @@ -968,6 +975,8 @@ extension Pixel.Event { case .browsingMenuAutofill: return "m_nav_autofill_menu_item_pressed" case .browsingMenuShare: return "m_browsingmenu_share" + case .browsingMenuAIChat: return "m_aichat_menu_tab_icon" + case .browsingMenuListPrint: return "m_browsing_menu_list_print" case .addressBarShare: return "m_addressbar_share" case .addressBarSettings: return "m_addressbar_settings" @@ -1787,6 +1796,12 @@ extension Pixel.Event { case .appDidShowUITime(let time): return "m_debug_app-did-show-ui-time-\(time)" case .appDidBecomeActiveTime(let time): return "m_debug_app-did-become-active-time-\(time)" + // MARK: AI Chat + case .openAIChatAfter10min: return "m_aichat_open_after_10_min" + case .openAIChatBefore10min: return "m_aichat_open_before_10_min" + case .aiChatNoRemoteSettingsFound(let settings): + return "m_aichat_no_remote_settings_found-\(settings.lowercased())" + // MARK: Lifecycle case .appDidTransitionToUnexpectedState: return "m_debug_app-did-transition-to-unexpected-state" diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 74091cfaf2..b4d015e475 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -128,6 +128,7 @@ 1EFDCBC127D2393C00916BC5 /* DownloadsDeleteHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFDCBC027D2393C00916BC5 /* DownloadsDeleteHelper.swift */; }; 22CB1ED8203DDD2C00D2C724 /* AppDeepLinksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22CB1ED7203DDD2C00D2C724 /* AppDeepLinksTests.swift */; }; 2DC3FC65C6D9DA634426672D /* AutofillNoAuthAvailableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DC3FBD62FBAF21E87610FA8 /* AutofillNoAuthAvailableView.swift */; }; + 31043B162CFA5B8E0028A97F /* AIChatPixelHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */; }; 310742A62848CD780012660B /* BackForwardMenuHistoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310742A52848CD780012660B /* BackForwardMenuHistoryItem.swift */; }; 310742AB2848E6FD0012660B /* BackForwardMenuHistoryItemURLSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310742A92848E5B70012660B /* BackForwardMenuHistoryItemURLSanitizerTests.swift */; }; 310C4B45281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310C4B44281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift */; }; @@ -137,6 +138,7 @@ 310D09212799FD1A00DC0060 /* MIMEType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310D09202799FD1A00DC0060 /* MIMEType.swift */; }; 310E79BD2949CAA5007C49E8 /* FireButtonReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310E79BC2949CAA5007C49E8 /* FireButtonReferenceTests.swift */; }; 310ECFDD282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310ECFDC282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift */; }; + 310EEA2F2CFFCDC60043CA1A /* AIChatSettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310EEA2E2CFFCDBF0043CA1A /* AIChatSettingsTests.swift */; }; 311BD1AD2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311BD1AC2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift */; }; 311BD1AF2836BB4200AEF6C1 /* AutofillItemsLockedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311BD1AE2836BB4200AEF6C1 /* AutofillItemsLockedView.swift */; }; 311BD1B12836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311BD1B02836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift */; }; @@ -157,13 +159,16 @@ 3157B43827F4C8490042D3D7 /* FaviconsHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3157B43727F4C8490042D3D7 /* FaviconsHelper.swift */; }; 31584616281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31584615281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift */; }; 3158461A281B08F5004ADB8B /* AutofillLoginListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31584619281B08F5004ADB8B /* AutofillLoginListViewModel.swift */; }; + 315C77822CFA41A400699683 /* AIChat in Frameworks */ = {isa = PBXBuildFile; productRef = 315C77812CFA41A400699683 /* AIChat */; }; 3161D13227AC161B00285CF6 /* DownloadMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3161D13127AC161B00285CF6 /* DownloadMetadata.swift */; }; 31669B9A28020A460071CC18 /* SaveLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31669B9928020A460071CC18 /* SaveLoginViewModel.swift */; }; 316790E52C9352190090B0A2 /* MarketplaceAdPostbackManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316790E42C9352190090B0A2 /* MarketplaceAdPostbackManagerTests.swift */; }; 316931D727BD10BB0095F5ED /* SaveToDownloadsAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316931D627BD10BB0095F5ED /* SaveToDownloadsAlert.swift */; }; 316931D927BD22A80095F5ED /* DownloadActionMessageViewHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316931D827BD22A80095F5ED /* DownloadActionMessageViewHelper.swift */; }; + 316AA45A2CF8E31F00A2ED28 /* AIChatSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316AA4592CF8E31F00A2ED28 /* AIChatSettings.swift */; }; 3170048227A9504F00C03F35 /* DownloadMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3170048127A9504F00C03F35 /* DownloadMocks.swift */; }; 317045C02858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317045BF2858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift */; }; + 317CA3432CFF82E100F88848 /* SettingsAIChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317CA3422CFF82DB00F88848 /* SettingsAIChatView.swift */; }; 317F5F982C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317F5F972C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift */; }; 31860A5B2C57ED2D005561F5 /* DuckPlayerStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31860A5A2C57ED2D005561F5 /* DuckPlayerStorage.swift */; }; 31951E8E2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */; }; @@ -1488,6 +1493,7 @@ 1EFDCBC027D2393C00916BC5 /* DownloadsDeleteHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadsDeleteHelper.swift; sourceTree = ""; }; 22CB1ED7203DDD2C00D2C724 /* AppDeepLinksTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDeepLinksTests.swift; sourceTree = ""; }; 2DC3FBD62FBAF21E87610FA8 /* AutofillNoAuthAvailableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillNoAuthAvailableView.swift; sourceTree = ""; }; + 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatPixelHandler.swift; sourceTree = ""; }; 310742A52848CD780012660B /* BackForwardMenuHistoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackForwardMenuHistoryItem.swift; sourceTree = ""; }; 310742A92848E5B70012660B /* BackForwardMenuHistoryItemURLSanitizerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackForwardMenuHistoryItemURLSanitizerTests.swift; sourceTree = ""; }; 310C4B44281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsView.swift; sourceTree = ""; }; @@ -1497,6 +1503,7 @@ 310D09202799FD1A00DC0060 /* MIMEType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MIMEType.swift; sourceTree = ""; }; 310E79BC2949CAA5007C49E8 /* FireButtonReferenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FireButtonReferenceTests.swift; sourceTree = ""; }; 310ECFDC282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnableAutofillSettingsTableViewCell.swift; sourceTree = ""; }; + 310EEA2E2CFFCDBF0043CA1A /* AIChatSettingsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatSettingsTests.swift; sourceTree = ""; }; 311BD1AC2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillItemsEmptyView.swift; sourceTree = ""; }; 311BD1AE2836BB4200AEF6C1 /* AutofillItemsLockedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillItemsLockedView.swift; sourceTree = ""; }; 311BD1B02836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginListAuthenticator.swift; sourceTree = ""; }; @@ -1517,14 +1524,17 @@ 3157B43727F4C8490042D3D7 /* FaviconsHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconsHelper.swift; sourceTree = ""; }; 31584615281AFB46004ADB8B /* AutofillLoginDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsViewController.swift; sourceTree = ""; }; 31584619281B08F5004ADB8B /* AutofillLoginListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginListViewModel.swift; sourceTree = ""; }; + 315C77802CFA414400699683 /* AIChat */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = AIChat; sourceTree = ""; }; 3161D13127AC161B00285CF6 /* DownloadMetadata.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadMetadata.swift; sourceTree = ""; }; 31669B9928020A460071CC18 /* SaveLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveLoginViewModel.swift; sourceTree = ""; }; 316790E42C9352190090B0A2 /* MarketplaceAdPostbackManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketplaceAdPostbackManagerTests.swift; sourceTree = ""; }; 316931D627BD10BB0095F5ED /* SaveToDownloadsAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SaveToDownloadsAlert.swift; sourceTree = ""; }; 316931D827BD22A80095F5ED /* DownloadActionMessageViewHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadActionMessageViewHelper.swift; sourceTree = ""; }; + 316AA4592CF8E31F00A2ED28 /* AIChatSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatSettings.swift; sourceTree = ""; }; 3170048127A9504F00C03F35 /* DownloadMocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadMocks.swift; sourceTree = ""; }; 317045BF2858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceEmailTruncatorTests.swift; sourceTree = ""; }; 31794BFF2821DFB600F18633 /* DuckUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = DuckUI; sourceTree = ""; }; + 317CA3422CFF82DB00F88848 /* SettingsAIChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAIChatView.swift; sourceTree = ""; }; 317F5F972C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketplaceAdPostbackStorage.swift; sourceTree = ""; }; 31860A5A2C57ED2D005561F5 /* DuckPlayerStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DuckPlayerStorage.swift; sourceTree = ""; }; 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsHeaderView.swift; sourceTree = ""; }; @@ -3127,6 +3137,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 315C77822CFA41A400699683 /* AIChat in Frameworks */, 9F8FE9492BAE50E50071E372 /* Lottie in Frameworks */, 853273B624FFE0BB00E3C778 /* WidgetKit.framework in Frameworks */, 0238E44F29C0FAA100615E30 /* FindInPageIOSJSSupport in Frameworks */, @@ -3341,6 +3352,7 @@ 1DEAADEB2BA45B4400E25A97 /* SettingsAccessibilityView.swift */, 1DEAADED2BA45DFE00E25A97 /* SettingsDataClearingView.swift */, D65625A02C232F5E006EF297 /* SettingsDuckPlayerView.swift */, + 317CA3422CFF82DB00F88848 /* SettingsAIChatView.swift */, ); name = MainSettings; sourceTree = ""; @@ -3588,6 +3600,30 @@ name = Downloads; sourceTree = ""; }; + 310EEA2C2CFFCD9B0043CA1A /* New Group */ = { + isa = PBXGroup; + children = ( + ); + path = "New Group"; + sourceTree = ""; + }; + 310EEA2D2CFFCDB60043CA1A /* AIChat */ = { + isa = PBXGroup; + children = ( + 310EEA2E2CFFCDBF0043CA1A /* AIChatSettingsTests.swift */, + ); + path = AIChat; + sourceTree = ""; + }; + 311C79E22CF790270021196A /* AIChat */ = { + isa = PBXGroup; + children = ( + 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */, + 316AA4592CF8E31F00A2ED28 /* AIChatSettings.swift */, + ); + path = AIChat; + sourceTree = ""; + }; 3132FA2227A0776B00DD7A12 /* FilePreview */ = { isa = PBXGroup; children = ( @@ -3768,6 +3804,7 @@ 85875B5F29912A2D00115F05 /* SyncUI */, 37FCAACB2993149A000E420A /* Waitlist */, 31794BFF2821DFB600F18633 /* DuckUI */, + 315C77802CFA414400699683 /* AIChat */, ); path = LocalPackages; sourceTree = ""; @@ -4309,6 +4346,7 @@ 84E341941E2F7EFB00BDBA6F /* DuckDuckGo */ = { isa = PBXGroup; children = ( + 311C79E22CF790270021196A /* AIChat */, 6FD1BAE02B87A0E8000C475C /* AdAttribution */, AA4D6A8023DE4973007E8790 /* AppIcon */, F1C5ECF31E37812900C599A4 /* Application */, @@ -6523,6 +6561,7 @@ F1E092B31E92A6B900732CCC /* Core */ = { isa = PBXGroup; children = ( + 310EEA2C2CFFCD9B0043CA1A /* New Group */, 316790E32C9350980090B0A2 /* MarketplaceAdPostback */, 858479CA2B8795BF00D156C1 /* History */, EA7EFE662677F5BD0075464E /* PrivacyReferenceTests */, @@ -6533,6 +6572,7 @@ EE3B226929DE0EE10082298A /* FeatureFlags */, F1134EC91F40E74800B73467 /* Statistics */, F198D78F1E3976300088DA8A /* Utilities */, + 310EEA2D2CFFCDB60043CA1A /* AIChat */, ); name = Core; sourceTree = ""; @@ -6736,6 +6776,7 @@ 9F8FE9482BAE50E50071E372 /* Lottie */, 9F96F73A2C9144D5009E45D5 /* Onboarding */, 1E5918462CA422A7008ED2B3 /* Navigation */, + 315C77812CFA41A400699683 /* AIChat */, ); productName = DuckDuckGo; productReference = 84E341921E2F7EFB00BDBA6F /* DuckDuckGo.app */; @@ -7801,6 +7842,7 @@ D668D92B2B696840008E2FF2 /* IdentityTheftRestorationPagesFeature.swift in Sources */, 85F2FFCF2211F8E5006BB258 /* TabSwitcherViewController+KeyCommands.swift in Sources */, 3157B43327F497E90042D3D7 /* SaveLoginView.swift in Sources */, + 316AA45A2CF8E31F00A2ED28 /* AIChatSettings.swift in Sources */, F17922E01E71BB59006E3D97 /* AutocompleteViewControllerDelegate.swift in Sources */, BDE91CDC2C62AA3A0005CB74 /* DefaultMetadataCollector.swift in Sources */, D664C7C82B289AA200CBFA76 /* SubscriptionFlowView.swift in Sources */, @@ -7980,6 +8022,7 @@ 9FE05CEE2C36424E00D9046B /* OnboardingPixelReporter.swift in Sources */, 9821234E2B6D0A6300F08C57 /* UserAuthenticator.swift in Sources */, 310C4B47281B60E300BA79A9 /* AutofillLoginDetailsViewModel.swift in Sources */, + 31043B162CFA5B8E0028A97F /* AIChatPixelHandler.swift in Sources */, 85EE7F572246685B000FE757 /* WebContainerViewController.swift in Sources */, CB48D3332B90CE9F00631D8B /* PageRefreshStore.swift in Sources */, 1EC458462948932500CB2B13 /* UIHostingControllerExtension.swift in Sources */, @@ -8111,6 +8154,7 @@ 8590CB67268A2E520089F6BF /* RootDebugViewController.swift in Sources */, 1DEAADEA2BA4539800E25A97 /* SettingsAppearanceView.swift in Sources */, B623C1C22862CA9E0043013E /* DownloadSession.swift in Sources */, + 317CA3432CFF82E100F88848 /* SettingsAIChatView.swift in Sources */, 9F7CFF7F2C8A94F70012833E /* OnboardingView+AddressBarPositionContent.swift in Sources */, 985892522260B1B200EEB31B /* ProgressView.swift in Sources */, 85BA585A1F3506AE00C6E8CA /* AppSettings.swift in Sources */, @@ -8313,6 +8357,7 @@ 987130C8294AAB9F00AB05E0 /* BookmarksTestHelpers.swift in Sources */, 9F4CC51D2C48D240006A96EB /* CoreDataDatabaseTestUtilities.swift in Sources */, C185ED672BD43DA100BAE9DC /* ImportPasswordsStatusHandlerTests.swift in Sources */, + 310EEA2F2CFFCDC60043CA1A /* AIChatSettingsTests.swift in Sources */, 6FF9AD452CE766F700C5A406 /* NewTabPageControllerPixelTests.swift in Sources */, 85C503FD2CF0E7B10075DF6F /* MockFireproofing.swift in Sources */, 6F3529FF2CDCEDFF00A59170 /* OmniBarLoadingStateBearerTests.swift in Sources */, @@ -11426,6 +11471,10 @@ package = 98A16C2928A11BDE00A6C003 /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; productName = Common; }; + 315C77812CFA41A400699683 /* AIChat */ = { + isa = XCSwiftPackageProductDependency; + productName = AIChat; + }; 31E69A62280F4CB600478327 /* DuckUI */ = { isa = XCSwiftPackageProductDependency; productName = DuckUI; diff --git a/DuckDuckGo/AIChat/AIChatPixelHandler.swift b/DuckDuckGo/AIChat/AIChatPixelHandler.swift new file mode 100644 index 0000000000..b4e1ccd4b5 --- /dev/null +++ b/DuckDuckGo/AIChat/AIChatPixelHandler.swift @@ -0,0 +1,32 @@ +// +// AIChatPixelHandler.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import AIChat +import Core + +struct AIChatPixelHandler: AIChatPixelHandling { + func fire(pixel: AIChatPixel) { + switch pixel { + case .openAfter10min: + Pixel.fire(pixel: .openAIChatAfter10min) + case .openBefore10min: + Pixel.fire(pixel: .openAIChatBefore10min) + } + } +} diff --git a/DuckDuckGo/AIChat/AIChatSettings.swift b/DuckDuckGo/AIChat/AIChatSettings.swift new file mode 100644 index 0000000000..6a0b1e3706 --- /dev/null +++ b/DuckDuckGo/AIChat/AIChatSettings.swift @@ -0,0 +1,108 @@ +// +// AIChatSettings.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import BrowserServicesKit +import AIChat +import Foundation +import Core + +/// This struct serves as a wrapper for PrivacyConfigurationManaging, enabling the retrieval of data relevant to AIChat. +/// It also fire pixels when necessary data is missing. +struct AIChatSettings: AIChatSettingsProvider { + enum SettingsValue: String { + case aiChatURL + + var defaultValue: String { + switch self { + case .aiChatURL: return "https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=4" + } + } + } + + private let privacyConfigurationManager: PrivacyConfigurationManaging + private var remoteSettings: PrivacyConfigurationData.PrivacyFeature.FeatureSettings { + privacyConfigurationManager.privacyConfig.settings(for: .aiChat) + } + private let internalUserDecider: InternalUserDecider + private let userDefaults: UserDefaults + + init(privacyConfigurationManager: PrivacyConfigurationManaging, internalUserDecider: InternalUserDecider, userDefaults: UserDefaults = .standard) { + self.internalUserDecider = internalUserDecider + self.privacyConfigurationManager = privacyConfigurationManager + self.userDefaults = userDefaults + } + + // MARK: - Public + + var aiChatURL: URL { + guard let url = URL(string: getSettingsData(.aiChatURL)) else { + return URL(string: SettingsValue.aiChatURL.defaultValue)! + } + return url + } + + var isAIChatBrowsingMenuUserSettingsEnabled: Bool { + userDefaults.showAIChatBrowsingMenu + } + + var isAIChatFeatureEnabled: Bool { + privacyConfigurationManager.privacyConfig.isEnabled(featureKey: .aiChat) || internalUserDecider.isInternalUser + } + + var isAIChatBrowsingToolbarShortcutFeatureEnabled: Bool { + let isBrowsingToolbarShortcutFeatureFlagEnabled = privacyConfigurationManager.privacyConfig.isSubfeatureEnabled(AIChatSubfeature.browsingToolbarShortcut) + let isInternalUser = internalUserDecider.isInternalUser + let isFeatureEnabled = isBrowsingToolbarShortcutFeatureFlagEnabled || isInternalUser + return isFeatureEnabled && isAIChatBrowsingMenuUserSettingsEnabled + } + + func enableAIChatBrowsingMenuUserSettings(enable: Bool) { + userDefaults.showAIChatBrowsingMenu = enable + } + + // MARK: - Private + + private func getSettingsData(_ value: SettingsValue) -> String { + if let value = remoteSettings[value.rawValue] as? String { + return value + } else { + Pixel.fire(pixel: .aiChatNoRemoteSettingsFound(settings: value.rawValue)) + return value.defaultValue + } + } +} + +private extension UserDefaults { + enum Keys { + static let showAIChatBrowsingMenu = "aichat.settings.showAIChatBrowsingMenu" + } + + static let showAIChatBrowsingMenuDefaultValue = true + + @objc dynamic var showAIChatBrowsingMenu: Bool { + get { + value(forKey: Keys.showAIChatBrowsingMenu) as? Bool ?? Self.showAIChatBrowsingMenuDefaultValue + } + + set { + guard newValue != showAIChatBrowsingMenu else { return } + set(newValue, forKey: Keys.showAIChatBrowsingMenu) + } + } +} diff --git a/DuckDuckGo/Assets.xcassets/DesignSystemIcons/24px/AIChat-24.imageset/AIChat-24.pdf b/DuckDuckGo/Assets.xcassets/DesignSystemIcons/24px/AIChat-24.imageset/AIChat-24.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b806da0f5968053e90bf582df2ee923e9bbd50b3 GIT binary patch literal 1590 zcmY!laBkm(vTRHc6J~)rRJr8Ji%pz;v2WjoRZWc1%0<1ppRTqlk-zjA+Fc= zNzF?y$xtu`Dh~n*0Zk|_DN0Su<*H!ZI`wp(h@pV%_rIc>-MSuEP2X;FMCwP27~>KZ zp{^s}i|@|dXnT@Paj7Zy`ONFD!*168{`h--{O|AU=ii@iS93e>`ToC|zxUp)TXea9 zd9Ro4yx_e$dB?K$JU-pDDJ7_D{tPyBf?^i0aWy8`>+EvpsK3Ys+ zaekrvE#dbyF3&4^ml`4;{JeF)%k2TDd)wvPIw@_kZ=#ATlh5uIh-dpW$HruSNs7M& zf8D&x6SWe%cJ10_kfC?jHo6w5C{0|>$n*Mh!*LxEg&FpHYCb~+xFJ(rV*pa*f57*VR6z(_enVqbtYU9h1 zxY=>aJag7nV$J!wXO2na%02vL?K4-GqweI4RfozJ#%<8w{54LxI7`NCT0yO3=$qMV z;=QC8^^mRjk}LTKrPf@@_jvnReM9p!wuRLa>!U6%tA27}Re_OFj+|K2^ck%OO6E!5 ztrF6&zN+3jVYY_*dEVc#!n!Wy35V`jnXGI0&hArTpAc5`O5o9!Rf#*wF3&djTHM`G zv7jStnag(esHxE!HnSete4U!i#&q`Z?R%U&|B5+l?$e67NV-P<2dd%=DxqmTK@{u-HE zzh+k5J$UcN?(*ZZAH;L~mob2H3pBaI@(m~>KuQ5~69af|GJ%VN$_B^0y!?`4h3Hsl z9tx=}NLA1eNKA)iD&N$U%tWXB3WaE3c>yXdfaL|8VPpamLa<;a1*I0}mlh?b7At^C zBT$9}0)6NFypq&BppBqR4HFDVECPxtm_mh+vOY)%QIL6OrU0F)0P;bQ0?Z!g{8FG^ zLk#y9Ly7=cV3?tp1oB`p+(MAUARc#4EJ@7CPe;{SQIwj-WuRcr1@S&O2+T}PjZGDR z!cbrc3>C0M9!$u{5NIWekfDJIx++5hGhjfVsxkr^j3#7kUUZB>AC&7{K(Sl zUTfbTKWz5m_36tWcX(!QIC{8OZCToH<^+$Y>$u-Y3Z?IV>AIxrbJLOt`?Yi%5P4>l&g0~BmxS#m+Z+3~kc*5%83O+-(J0QW@XQmc)EB0Zk4%mz)&T~zDXSuFF-^jBDd#^oz3=$`kvl6OZe&f#nzH$IfpK)G{qd^-Lgd1=VSBcd%R(RE0x3amt1Y$ zd@#@P=9K8xt`FI+XIGVPc(>!JL{INU!zDb~rhi%Lp11JK>N?yn5Hf4QnoDycZ~fyn zT~N|0tEYA(W3fQlfk_L@WG2L?p89&AXp{TZt|hPT_$-iH;GmKtD!w{Ux0vDEDW^#j zE-p~XnQ%mzr9RX(?y$SUhSSZBD-=C+GG^XxiC_sg=}|rB&%o=PxTkhn;wjS$jeoN) zy;8kxyySk%?nS0=r$$aZ)^;|dbpOL=IR_Qct_)@5YH9SSqi30j;z`E zI7d&G@zBoVRoP9k&W9CVtx)(|rT2EG+noi{b>fK&HMNXQUwNES>pQYmLEp~$hh@m7 zsL8CJ4!<;_LKOr~WjlRnR+0F}{W0kBZ}aEo|AkM7%+%#d%}aqMX&?)fp}9cW5|Xpc z4UItZU{PbZC@8<<$<-!9I9Kbtq?TnSrv|w@DL4mnA@P!nxeB=qVTA&`z|e)WFy-J< z$+=u`HYTGuIS(O?C~b1N5Nrf12T2reR1QKvHZf$~8C+>xd0c^9SYjO%ZID(EjhTuet8DuAkhAVg{ET2bO2Tmmfr!Sb$#U@F)*u{aydf+QIb7p2%nlMMko z0us|Nx1uOD zjmtp6(2xsK^@B(SGgDJzQw5+n6o4!M0R>TS04zTORR910 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/BrowsingMenu/BrowsingMenu.xcassets/MenuAIChat.imageset/Contents.json b/DuckDuckGo/BrowsingMenu/BrowsingMenu.xcassets/MenuAIChat.imageset/Contents.json new file mode 100644 index 0000000000..0fcb063039 --- /dev/null +++ b/DuckDuckGo/BrowsingMenu/BrowsingMenu.xcassets/MenuAIChat.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "AIChat.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.swift b/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.swift index 6b7f6b9abe..cc3d04d61b 100644 --- a/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.swift +++ b/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.swift @@ -249,8 +249,9 @@ extension BrowsingMenuViewController: UITableViewDelegate { switch menuEntries[indexPath.row] { case .regular(_, _, _, _, let action): - dismiss(animated: true) - action() + dismiss(animated: true) { + action() + } case .separator: break } diff --git a/DuckDuckGo/MainViewController+Segues.swift b/DuckDuckGo/MainViewController+Segues.swift index 5eafe2cdea..beee686007 100644 --- a/DuckDuckGo/MainViewController+Segues.swift +++ b/DuckDuckGo/MainViewController+Segues.swift @@ -296,6 +296,9 @@ extension MainViewController { fireproofing: fireproofing, websiteDataManager: websiteDataManager) + let aiChatSettings = AIChatSettings(privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager, + internalUserDecider: AppDependencyProvider.shared.internalUserDecider) + let settingsViewModel = SettingsViewModel(legacyViewProvider: legacyViewProvider, subscriptionManager: AppDependencyProvider.shared.subscriptionManager, subscriptionFeatureAvailability: subscriptionFeatureAvailability, @@ -304,7 +307,8 @@ extension MainViewController { historyManager: historyManager, syncPausedStateManager: syncPausedStateManager, privacyProDataReporter: privacyProDataReporter, - textZoomCoordinator: textZoomCoordinator) + textZoomCoordinator: textZoomCoordinator, + aiChatSettings: aiChatSettings) Pixel.fire(pixel: .settingsPresented) if let navigationController = self.presentedViewController as? UINavigationController, diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index ab0835156d..3e09cddf25 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -38,6 +38,7 @@ import Onboarding import os.log import PageRefreshMonitor import BrokenSitePrompt +import AIChat class MainViewController: UIViewController { @@ -186,6 +187,16 @@ class MainViewController: UIViewController { var appDidFinishLaunchingStartTime: CFAbsoluteTime? + private lazy var aiChatNavigationController: UINavigationController = { + let settings = AIChatSettings(privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager, + internalUserDecider: AppDependencyProvider.shared.internalUserDecider) + let aiChatViewController = AIChatViewController(settings: settings, + webViewConfiguration: WKWebViewConfiguration.persistent(), + pixelHandler: AIChatPixelHandler()) + aiChatViewController.delegate = self + return UINavigationController(rootViewController: aiChatViewController) + }() + init( bookmarksDatabase: CoreDataDatabase, bookmarksDatabaseCleaner: BookmarkDatabaseCleaner, @@ -351,6 +362,7 @@ class MainViewController: UIViewController { let launchTime = CFAbsoluteTimeGetCurrent() - appDidFinishLaunchingStartTime Pixel.fire(pixel: .appDidShowUITime(time: Pixel.Event.BucketAggregation(number: launchTime)), withAdditionalParameters: [PixelParameters.time: String(launchTime)]) + self.appDidFinishLaunchingStartTime = nil /// We only want this pixel to be fired once } } @@ -1688,7 +1700,6 @@ class MainViewController: UIViewController { Pixel.fire(pixel: pixel, withAdditionalParameters: pixelParameters, includedParameters: [.atb]) } - } extension MainViewController: FindInPageDelegate { @@ -2347,6 +2358,11 @@ extension MainViewController: TabDelegate { segueToReportBrokenSite(entryPoint: .toggleReport(completionHandler: completionHandler)) } + func tabDidRequestAIChat(tab: TabViewController) { + aiChatNavigationController.modalPresentationStyle = .fullScreen + tab.present(aiChatNavigationController, animated: true, completion: nil) + } + func tabDidRequestBookmarks(tab: TabViewController) { Pixel.fire(pixel: .bookmarksButtonPressed, withAdditionalParameters: [PixelParameters.originatedFromMenu: "1"]) @@ -2931,3 +2947,10 @@ extension MainViewController: AutofillLoginSettingsListViewControllerDelegate { controller.dismiss(animated: true) } } + +// MARK: - AIChatViewControllerDelegate +extension MainViewController: AIChatViewControllerDelegate { + func aiChatViewController(_ viewController: AIChatViewController, didRequestToLoad url: URL) { + loadUrlInNewTab(url, inheritedAttribution: nil) + } +} diff --git a/DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/Contents.json b/DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/Contents.json new file mode 100644 index 0000000000..356f0fd6ea --- /dev/null +++ b/DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "SettingsAIChat.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/SettingsAIChat.pdf b/DuckDuckGo/Settings.xcassets/Images/SettingsAIChat.imageset/SettingsAIChat.pdf new file mode 100644 index 0000000000000000000000000000000000000000..adad6866a41da085c02f8b7c3b9225e9c0cd2a66 GIT binary patch literal 2766 zcma)8dsq}z6i>xZT{XiLO~NjMBpU3_%syB`0v1+5v~`K>(-6nqVI5dz*4Q&3QRp!h-_Cg2OwG(t2qA3*{NSVH+o{4}xd?C!u~TYCSPIrE!y&pr3t-#O=w zR|Lzw5N`>OhX4Vf=g0B@@bd%waDvh>3jhj1C4}JMD{)FgfH^?mEiey&aKft~QC2I# zbUaQ{cFk}qawDZ;NSgX6K}P@~oagV)GcbArkLM)j;+p{XJR@<@8O~6>+tP`w` z{qF<>V~2Hu)%WfR$$*RjtY6)Me%U4j-WVdWi49^C4S}~1%O3Y=jGJ!K|~0x`d)4~Z39>NPR?m*i=U5BaM6%|L9X(r!|MFz8RktH^0Wqfv`f84b zm>77ZFm8Vi4PQx09 z$1B>}3^!tC#jgtpKYuQ2dPRFnPS=BmyE!Mf&P{ptJge*HoYGCVuKxP4^Dht2+M<-L zIiK8(j#}nH-YEEe&ttDWKN;RCQ!OZ2hse{5Qv8#(TNdA+&1~9IoLHbrxfwR``pVYV zvc9=-ZQ7CjZid;iagfgS+n!X(#3g(w8XheG6%bb+;yPtWR~ZvGH*u}4fdU!*T07;R6M`$ zxb^Xa(3p&X0|c`@_FVq@b?uWCr2oF~;uUEjdqsQKD349cQy1KjxfRr082!h_8M*o> zO^(8iG&t}e)?5GNL{$<>VT}ASmwcw~YXy=HL$5Q(aEfJnMKeEiT zxiWRKBul=%WG}vBK%R@@OXuu<&8~%K_V=&r?_QOt8NgH@3#hD#Jih7N^;Ju^B$Nat zhkAIFhbb;!UKbcv@wxJ*#FzIB&(DAVQbWeg4W7g|;AB?oyAgj&%A2U=!GU8-Yn)g9 zhEEDv_F4H#-te}DQwrIZj+n!geEkUit)sclg`?!<*_tN{f63^}ANc)ukCwjvX>()0 z0Zr{oD4$_#`$m^Kg(O^~+#f2Av{mC$zeQC~Gw!Tzx|Qb`mNw;&BhGzYF1)Ao3zOG0 zXQAQD!9ksU0)38e+!w0xYo4Y*jmoMu6G}&wFBuY$JABW~h>oN+LB|IVA9J++{iuq= zq)y$9;(&<`c*Hhfy^OCmx zIrr)~?bmCuKjU2m9jDJei@ut&ds4q88Sf6AQ`-^R=Cnwsu1+2HRc+<)HwSz$s`-u1 zR4-{vc4b*svFr7Uv3>aN4$Zz*$@A(O=iQrSnthIWBkBI@OANaQNn0P?6UqjiZ++A_ zXX?P}M`^KmUE|x^oKTnSCkHE^_c!>xKpXWc!T{Lz#$9z}GzDuUT#+q59H_wc z5Cak`WK*PA$g&02*=eM?E3rFJa=i>T79*UCSgTc!{|1QISn}y*Nr7viW88wU)>=!b z3}yFc7^U z6oI#_7a(|9dJ$r8W-n+7g>XYwTZ|qjwS=C>hAlK09^M249Zz_I38dQ75<0$;rWwG7 f#e59>2y!t2_h_!~xSla@8Wjn|yz%2hK9v6hA}e?H literal 0 HcmV?d00001 diff --git a/DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/Contents.json b/DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/Contents.json new file mode 100644 index 0000000000..bb0ab0cbc3 --- /dev/null +++ b/DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "SettingsAIChatHero.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/SettingsAIChatHero.pdf b/DuckDuckGo/Settings.xcassets/Images/SettingsAIChatHero.imageset/SettingsAIChatHero.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a47a1810197e86e4d9c2c075104133d15258033c GIT binary patch literal 3779 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 { + Binding( + get: { self.aiChatSettings.isAIChatBrowsingMenuUserSettingsEnabled }, + set: { newValue in + self.aiChatSettings.enableAIChatBrowsingMenuUserSettings(enable: newValue) + } + ) + } + var textZoomLevelBinding: Binding { Binding( get: { self.state.textZoom.level }, @@ -386,7 +397,8 @@ final class SettingsViewModel: ObservableObject { historyManager: HistoryManaging, syncPausedStateManager: any SyncPausedStateManaging, privacyProDataReporter: PrivacyProDataReporting, - textZoomCoordinator: TextZoomCoordinating) { + textZoomCoordinator: TextZoomCoordinating, + aiChatSettings: AIChatSettingsProvider) { self.state = SettingsState.defaults self.legacyViewProvider = legacyViewProvider @@ -398,6 +410,7 @@ final class SettingsViewModel: ObservableObject { self.syncPausedStateManager = syncPausedStateManager self.privacyProDataReporter = privacyProDataReporter self.textZoomCoordinator = textZoomCoordinator + self.aiChatSettings = aiChatSettings setupNotificationObservers() updateRecentlyVisitedSitesVisibility() @@ -447,8 +460,9 @@ extension SettingsViewModel { duckPlayerEnabled: featureFlagger.isFeatureOn(.duckPlayer) || shouldDisplayDuckPlayerContingencyMessage, duckPlayerMode: appSettings.duckPlayerMode, duckPlayerOpenInNewTab: appSettings.duckPlayerOpenInNewTab, - duckPlayerOpenInNewTabEnabled: featureFlagger.isFeatureOn(.duckPlayerOpenInNewTab) - + duckPlayerOpenInNewTabEnabled: featureFlagger.isFeatureOn(.duckPlayerOpenInNewTab), + aiChatEnabled: aiChatSettings.isAIChatFeatureEnabled + ) updateRecentlyVisitedSitesVisibility() @@ -665,6 +679,7 @@ extension SettingsViewModel { case subscriptionFlow(origin: String? = nil) case restoreFlow case duckPlayer + case aiChat // Add other cases as needed var id: String { @@ -675,6 +690,7 @@ extension SettingsViewModel { case .subscriptionFlow: return "subscriptionFlow" case .restoreFlow: return "restoreFlow" case .duckPlayer: return "duckPlayer" + case .aiChat: return "aiChat" // Ensure all cases are covered } } @@ -683,7 +699,7 @@ extension SettingsViewModel { // Default to .sheet, specify .push where needed var type: DeepLinkType { switch self { - case .netP, .dbp, .itr, .subscriptionFlow, .restoreFlow, .duckPlayer: + case .netP, .dbp, .itr, .subscriptionFlow, .restoreFlow, .duckPlayer, .aiChat: return .navigationLink } } diff --git a/DuckDuckGo/TabDelegate.swift b/DuckDuckGo/TabDelegate.swift index 90424e25fb..6865b4bf65 100644 --- a/DuckDuckGo/TabDelegate.swift +++ b/DuckDuckGo/TabDelegate.swift @@ -59,6 +59,8 @@ protocol TabDelegate: AnyObject { func tabDidRequestDownloads(tab: TabViewController) + func tabDidRequestAIChat(tab: TabViewController) + func tabDidRequestAutofillLogins(tab: TabViewController) func tabDidRequestSettings(tab: TabViewController) diff --git a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift index d76c6c18b2..8cba18608b 100644 --- a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift +++ b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift @@ -28,25 +28,32 @@ import PrivacyDashboard extension TabViewController { - func buildBrowsingMenuHeaderContent() -> [BrowsingMenuEntry] { + private var shouldShowAIChatInMenuHeader: Bool { + let settings = AIChatSettings(privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager, + internalUserDecider: AppDependencyProvider.shared.internalUserDecider) + return settings.isAIChatBrowsingToolbarShortcutFeatureEnabled + } + + private var shouldShowPrintButtonInBrowsingMenuList: Bool { shouldShowAIChatInMenuHeader } + func buildBrowsingMenuHeaderContent() -> [BrowsingMenuEntry] { var entries = [BrowsingMenuEntry]() - entries.append(BrowsingMenuEntry.regular(name: UserText.actionNewTab, - accessibilityLabel: UserText.keyCommandNewTab, - image: UIImage(named: "Add-24")!, - action: { [weak self] in + let newTabEntry = BrowsingMenuEntry.regular(name: UserText.actionNewTab, + accessibilityLabel: UserText.keyCommandNewTab, + image: UIImage(named: "Add-24")!, + action: { [weak self] in self?.onNewTabAction() - })) + }) - entries.append(BrowsingMenuEntry.regular(name: UserText.actionShare, image: UIImage(named: "Share-24")!, action: { [weak self] in + let shareEntry = BrowsingMenuEntry.regular(name: UserText.actionShare, image: UIImage(named: "Share-24")!, action: { [weak self] in guard let self = self else { return } guard let menu = self.chromeDelegate?.omniBar.menuButton else { return } Pixel.fire(pixel: .browsingMenuShare) self.onShareAction(forLink: self.link!, fromView: menu) - })) + }) - entries.append(BrowsingMenuEntry.regular(name: UserText.actionCopy, image: UIImage(named: "Copy-24")!, action: { [weak self] in + let copyEntry = BrowsingMenuEntry.regular(name: UserText.actionCopy, image: UIImage(named: "Copy-24")!, action: { [weak self] in guard let strongSelf = self else { return } if !strongSelf.isError, let url = strongSelf.webView.url { strongSelf.onCopyAction(forUrl: url) @@ -58,16 +65,34 @@ extension TabViewController { let addressBarBottom = strongSelf.appSettings.currentAddressBarPosition.isBottom ActionMessageView.present(message: UserText.actionCopyMessage, presentationLocation: .withBottomBar(andAddressBarBottom: addressBarBottom)) - })) + }) - entries.append(BrowsingMenuEntry.regular(name: UserText.actionPrint, image: UIImage(named: "Print-24")!, action: { [weak self] in + let printEntry = BrowsingMenuEntry.regular(name: UserText.actionPrint, image: UIImage(named: "Print-24")!, action: { [weak self] in Pixel.fire(pixel: .browsingMenuPrint) self?.print() - })) + }) + + let chatEntry = BrowsingMenuEntry.regular(name: UserText.actionOpenAIChat, image: UIImage(named: "AIChat-24")!, action: { [weak self] in + Pixel.fire(pixel: .browsingMenuAIChat) + self?.openAIChat() + }) + + if shouldShowAIChatInMenuHeader { + entries.append(newTabEntry) + entries.append(chatEntry) + entries.append(shareEntry) + entries.append(copyEntry) + } else { + entries.append(newTabEntry) + entries.append(shareEntry) + entries.append(copyEntry) + entries.append(printEntry) + } return entries } + var favoriteEntryIndex: Int { 1 } func buildShortcutsMenu() -> [BrowsingMenuEntry] { @@ -80,6 +105,16 @@ extension TabViewController { let linkEntries = buildLinkEntries(with: bookmarksInterface) entries.append(contentsOf: linkEntries) + if shouldShowPrintButtonInBrowsingMenuList { + entries.append(.regular(name: UserText.actionPrintSite, + accessibilityLabel: UserText.actionPrintSite, + image: UIImage(named: "Print-16")!, + action: { [weak self] in + Pixel.fire(pixel: .browsingMenuListPrint) + self?.print() + })) + } + if let domain = self.privacyInfo?.domain { entries.append(self.buildToggleProtectionEntry(forDomain: domain)) } @@ -440,6 +475,10 @@ extension TabViewController { delegate?.tabDidRequestBookmarks(tab: self) } + private func openAIChat() { + delegate?.tabDidRequestAIChat(tab: self) + } + private func buildToggleProtectionEntry(forDomain domain: String) -> BrowsingMenuEntry { let config = ContentBlocking.shared.privacyConfigurationManager.privacyConfig let isProtected = !config.isUserUnprotected(domain: domain) diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift index f4d0d7460b..ff3430d987 100644 --- a/DuckDuckGo/UserText.swift +++ b/DuckDuckGo/UserText.swift @@ -49,7 +49,10 @@ public struct UserText { public static let actionCopy = NSLocalizedString("action.title.copy", value: "Copy", comment: "Copy action") public static let actionCopyMessage = NSLocalizedString("action.title.copy.message", value: "URL copied", comment: "Floating message indicating URL has been copied") public static let actionShare = NSLocalizedString("action.title.share", value: "Share", comment: "Share action") - public static let actionPrint = NSLocalizedString("action.title.print", value: "Print", comment: "Print action") + public static let actionPrint = NSLocalizedString("action.title.print", value: "Print", comment: "Print action in the menu header") + public static let actionPrintSite = NSLocalizedString("action.title.print.site", value: "Print", comment: "Print action in the menu list") + public static let actionOpenAIChat = NSLocalizedString("action.title.aichat", value: "Chat", comment: "Open AI Chat action in the menu list") + public static let actionOpenBookmarks = NSLocalizedString("action.title.bookmarks", value: "Bookmarks", comment: "Button: Open bookmarks list") public static let actionEnableProtection = NSLocalizedString("action.title.enable.protection", value: "Enable Privacy Protection", comment: "Enable protection action") public static let actionDisableProtection = NSLocalizedString("action.title.disable.protection", value: "Disable Privacy Protection", comment: "Disable protection action") @@ -1293,8 +1296,8 @@ But if you *do* want a peek under the hood, you can find more information about public static let settingsOpenVideosInDuckPlayerLabel = NSLocalizedString("duckplayer.settings.open-videos-in", value: "Open YouTube Videos in Duck Player", comment: "Settings screen cell text for DuckPlayer settings") public static let duckPlayerFeatureName = NSLocalizedString("duckplayer.settings.title", value: "Duck Player", comment: "Settings screen cell text for DuckPlayer settings") - public static let settingsOpenDuckPlayerNewTabLabel = NSLocalizedString("duckplayer.settings.open-new-tab-label", value: "Open Duck Player in a new tab", comment: "Settings screen cell text for DuckPlayer settings to open in new tab") - + public static let settingsOpenDuckPlayerNewTabLabel = NSLocalizedString("duckplayer.settings.open-new-tab-label", value: "Open Duck Player in a New Tab", comment: "Settings screen cell text for DuckPlayer settings to open in new tab") + public static let settingsOpenVideosInDuckPlayerTitle = NSLocalizedString("duckplayer.settings.title", value: "Duck Player", comment: "Settings screen cell text for DuckPlayer settings") public static let settingsDuckPlayerFooter = NSLocalizedString("duckplayer.settings.footer", value: "DuckDuckGo provides all the privacy essentials you need to protect yourself as you browse the web.", comment: "Footer label in the settings screen for Duck Player") @@ -1310,6 +1313,18 @@ But if you *do* want a peek under the hood, you can find more information about static let duckPlayerContingencyMessageBody = NSLocalizedString("duck-player.video-contingency-message", value: "Duck Player's functionality has been affected by recent changes to YouTube. We’re working to fix these issues and appreciate your understanding.", comment: "Message explaining to the user that Duck Player is not available") static let duckPlayerContingencyMessageCTA = NSLocalizedString("duck-player.video-contingency-cta", value: "Learn More", comment: "Button for the message explaining to the user that Duck Player is not available so the user can learn more") + // MARK: - AI Chat + public static let aiChatTitle = NSLocalizedString("aichat.title", value: "DuckDuckGo AI Chat", comment: "Title for DuckDuckGo AI Chat. Should not be translated") + public static let aiChatFeatureName = NSLocalizedString("aichat.settings.title", value: "AI Chat", comment: "Settings screen cell text for AI Chat settings") + + public static let aiChatSettingsEnableFooter = NSLocalizedString("aichat.settings.enable.footer", value: "Turning this off will hide the AI Chat feature in the DuckDuckGo app.", comment: "Footer text for AI Chat settings") + static let aiChatSettingsCaptionWithLinkMarkdown = NSLocalizedString("ai-chat.preferences.text.markdown", value: """ +AI Chat is an optional feature available at [duck.ai](ddgquicklink://duck.ai) that lets you have private conversations with popular 3rd-party AI chat models. Your chats are not used to train chat models. +[Learn More](ddgquicklink://duckduckgo.com/duckduckgo-help-pages/aichat/) +""", comment: "Ai Chat preferences explanation with a markdown link. Do not translate what's inside [] and ()") + public static let aiChatSettingsEnableBrowsingMenuToggle = NSLocalizedString("aichat.settings.enable.browsing-menu-toggle", value: "Show AI Chat in Browser Menu", comment: "Toggle text to enable/disable AI Chat in the browsing menu") + + // MARK: - New Tab Page // MARK: Shortcuts diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings index f12ff46fea..f65a3bac1a 100644 --- a/DuckDuckGo/en.lproj/Localizable.strings +++ b/DuckDuckGo/en.lproj/Localizable.strings @@ -25,6 +25,9 @@ /* Add action - button shown in alert */ "action.title.add" = "Add"; +/* Open AI Chat action in the menu list */ +"action.title.aichat" = "Chat"; + /* Autofill Logins menu item opening the login list */ "action.title.autofill.logins" = "Passwords"; @@ -79,9 +82,12 @@ /* Paste and Go action */ "action.title.pasteAndGo" = "Paste & Go"; -/* Print action */ +/* Print action in the menu header */ "action.title.print" = "Print"; +/* Print action in the menu list */ +"action.title.print.site" = "Print"; + /* Refresh action - button shown in alert */ "action.title.refresh" = "Refresh"; @@ -136,6 +142,22 @@ /* No comment provided by engineer. */ "addWidget.title" = "One tap to your favorite sites."; +/* Ai Chat preferences explanation with a markdown link. Do not translate what's inside [] and () */ +"ai-chat.preferences.text.markdown" = "AI Chat is an optional feature available at [duck.ai](ddgquicklink://duck.ai) that lets you have private conversations with popular 3rd-party AI chat models. Your chats are not used to train chat models. +[Learn More](ddgquicklink://duckduckgo.com/duckduckgo-help-pages/aichat/)"; + +/* Toggle text to enable/disable AI Chat in the browsing menu */ +"aichat.settings.enable.browsing-menu-toggle" = "Show AI Chat in Browser Menu"; + +/* Footer text for AI Chat settings */ +"aichat.settings.enable.footer" = "Turning this off will hide the AI Chat feature in the DuckDuckGo app."; + +/* Settings screen cell text for AI Chat settings */ +"aichat.settings.title" = "AI Chat"; + +/* Title for DuckDuckGo AI Chat. Should not be translated */ +"aichat.title" = "DuckDuckGo AI Chat"; + /* No comment provided by engineer. */ "alert.message.bookmarkAll" = "Existing bookmarks will not be duplicated."; @@ -1083,7 +1105,7 @@ "duckplayer.settings.learn-more" = "Learn More"; /* Settings screen cell text for DuckPlayer settings to open in new tab */ -"duckplayer.settings.open-new-tab-label" = "Open Duck Player in a new tab"; +"duckplayer.settings.open-new-tab-label" = "Open Duck Player in a New Tab"; /* Settings screen cell text for DuckPlayer settings */ "duckplayer.settings.open-videos-in" = "Open YouTube Videos in Duck Player"; diff --git a/DuckDuckGoTests/AIChat/AIChatSettingsTests.swift b/DuckDuckGoTests/AIChat/AIChatSettingsTests.swift new file mode 100644 index 0000000000..93667a4aa9 --- /dev/null +++ b/DuckDuckGoTests/AIChat/AIChatSettingsTests.swift @@ -0,0 +1,131 @@ +// +// AIChatSettingsTests.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import XCTest +@testable import Core +@testable import DuckDuckGo +import BrowserServicesKit +import Combine + +class AIChatSettingsTests: XCTestCase { + + private var mockPrivacyConfigurationManager: PrivacyConfigurationManagerMock! + private var mockInternalUserDecider: MockInternalUserDecider! + private var mockUserDefaults: UserDefaults! + + override func setUp() { + super.setUp() + mockPrivacyConfigurationManager = PrivacyConfigurationManagerMock() + mockInternalUserDecider = MockInternalUserDecider() + mockUserDefaults = UserDefaults(suiteName: "TestDefaults") + } + + override func tearDown() { + mockUserDefaults.removePersistentDomain(forName: "TestDefaults") + mockPrivacyConfigurationManager = nil + mockInternalUserDecider = nil + mockUserDefaults = nil + super.tearDown() + } + + func testAIChatURLReturnsDefaultWhenRemoteSettingsMissing() { + let settings = AIChatSettings(privacyConfigurationManager: mockPrivacyConfigurationManager, + internalUserDecider: mockInternalUserDecider, + userDefaults: mockUserDefaults) + + (mockPrivacyConfigurationManager.privacyConfig as? PrivacyConfigurationMock)?.settings = [:] + + let expectedURL = URL(string: AIChatSettings.SettingsValue.aiChatURL.defaultValue)! + XCTAssertEqual(settings.aiChatURL, expectedURL) + } + + func testAIChatURLReturnsRemoteSettingWhenAvailable() { + let settings = AIChatSettings(privacyConfigurationManager: mockPrivacyConfigurationManager, + internalUserDecider: mockInternalUserDecider, + userDefaults: mockUserDefaults) + + let remoteURL = "https://example.com/ai-chat" + (mockPrivacyConfigurationManager.privacyConfig as? PrivacyConfigurationMock)?.settings = [ + .aiChat: [AIChatSettings.SettingsValue.aiChatURL.rawValue: remoteURL] + ] + + XCTAssertEqual(settings.aiChatURL, URL(string: remoteURL)) + } + + func testIsAIChatFeatureEnabledWhenFeatureIsEnabled() { + let settings = AIChatSettings(privacyConfigurationManager: mockPrivacyConfigurationManager, + internalUserDecider: mockInternalUserDecider, + userDefaults: mockUserDefaults) + + (mockPrivacyConfigurationManager.privacyConfig as? PrivacyConfigurationMock)?.enabledFeaturesForVersions = [ + .aiChat: [AppVersionProvider().appVersion() ?? ""] + ] + + XCTAssertTrue(settings.isAIChatFeatureEnabled) + } + + func testIsAIChatFeatureEnabledForInternalUser() { + let settings = AIChatSettings(privacyConfigurationManager: mockPrivacyConfigurationManager, + internalUserDecider: mockInternalUserDecider, + userDefaults: mockUserDefaults) + + mockInternalUserDecider.mockIsInternalUser = true + XCTAssertTrue(settings.isAIChatFeatureEnabled) + } + + func testEnableAIChatBrowsingMenuUserSettings() { + let settings = AIChatSettings(privacyConfigurationManager: mockPrivacyConfigurationManager, + internalUserDecider: mockInternalUserDecider, + userDefaults: mockUserDefaults) + + (mockPrivacyConfigurationManager.privacyConfig as? PrivacyConfigurationMock)?.enabledFeaturesForVersions = [ + .aiChat: [AppVersionProvider().appVersion() ?? ""] + ] + + (mockPrivacyConfigurationManager.privacyConfig as? PrivacyConfigurationMock)?.enabledSubfeaturesForVersions = [ + AIChatSubfeature.browsingToolbarShortcut.rawValue: [AppVersionProvider().appVersion() ?? ""] + ] + settings.enableAIChatBrowsingMenuUserSettings(enable: false) + XCTAssertFalse(settings.isAIChatBrowsingToolbarShortcutFeatureEnabled) + + settings.enableAIChatBrowsingMenuUserSettings(enable: true) + XCTAssertTrue(settings.isAIChatBrowsingToolbarShortcutFeatureEnabled) + } +} + + +final private class MockInternalUserDecider: InternalUserDecider { + var mockIsInternalUser: Bool = false + var mockIsInternalUserPublisher: AnyPublisher { + Just(mockIsInternalUser).eraseToAnyPublisher() + } + + var isInternalUser: Bool { + return mockIsInternalUser + } + + var isInternalUserPublisher: AnyPublisher { + return mockIsInternalUserPublisher + } + + @discardableResult + func markUserAsInternalIfNeeded(forUrl url: URL?, response: HTTPURLResponse?) -> Bool { + return mockIsInternalUser + } +} diff --git a/DuckDuckGoTests/MockTabDelegate.swift b/DuckDuckGoTests/MockTabDelegate.swift index 7878b46cbd..47522ae542 100644 --- a/DuckDuckGoTests/MockTabDelegate.swift +++ b/DuckDuckGoTests/MockTabDelegate.swift @@ -68,6 +68,8 @@ final class MockTabDelegate: TabDelegate { func tabDidRequestAutofillLogins(tab: DuckDuckGo.TabViewController) {} + func tabDidRequestAIChat(tab: TabViewController) {} + func tabDidRequestSettings(tab: DuckDuckGo.TabViewController) {} func tab(_ tab: DuckDuckGo.TabViewController, didRequestSettingsToLogins account: BrowserServicesKit.SecureVaultModels.WebsiteAccount) {} diff --git a/LocalPackages/AIChat/Package.swift b/LocalPackages/AIChat/Package.swift new file mode 100644 index 0000000000..70d6f9499d --- /dev/null +++ b/LocalPackages/AIChat/Package.swift @@ -0,0 +1,20 @@ +// swift-tools-version: 6.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "AIChat", + platforms: [ + .iOS(.v15) + ], + products: [ + .library( + name: "AIChat", + targets: ["AIChat"]), + ], + targets: [ + .target( + name: "AIChat"), + ] +) diff --git a/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift b/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift new file mode 100644 index 0000000000..36c326dd8a --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift @@ -0,0 +1,81 @@ +// +// AIChatViewModel.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import WebKit +import Combine +import os.log + +protocol AIChatViewModeling { + /// The URL to be loaded in the AI Chat View Controller's web view. + var aiChatURL: URL { get } + + /// The configuration settings for the web view used in the AI Chat. + /// This configuration can include preferences such as data storage + var webViewConfiguration: WKWebViewConfiguration { get } + + /// A publisher that emits a signal after a 10-minute interval. + /// This is used to notify the controller that it should perform a reload or cleanup operation, + var cleanupPublisher: PassthroughSubject { get } + + /// Cancels the currently active cleanup timer. + func cancelTimer() + + /// Initiates the cleanup timer, which is set to trigger after a specified duration. + /// The purpose of this timer is to clear previous chat conversations + func startCleanupTimer() +} + + +final class AIChatViewModel: AIChatViewModeling { + private let settings: AIChatSettingsProvider + private var cleanupTimerCancellable: AnyCancellable? + + let webViewConfiguration: WKWebViewConfiguration + let cleanupPublisher = PassthroughSubject() + + let cleanupTime: TimeInterval + + init(webViewConfiguration: WKWebViewConfiguration, settings: AIChatSettingsProvider, cleanupTime: TimeInterval = 600) { + self.cleanupTime = cleanupTime + self.webViewConfiguration = webViewConfiguration + self.settings = settings + } + + func cancelTimer() { + Logger.aiChat.debug("Cancelling cleanup timer") + cleanupTimerCancellable?.cancel() + } + + func startCleanupTimer() { + cancelTimer() + + Logger.aiChat.debug("Starting cleanup timer") + + cleanupTimerCancellable = Just(()) + .delay(for: .seconds(cleanupTime), scheduler: RunLoop.main) + .sink { [weak self] in + Logger.aiChat.debug("Cleanup timer done") + self?.cleanupPublisher.send() + } + } + + var aiChatURL: URL { + settings.aiChatURL + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift b/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift new file mode 100644 index 0000000000..ec0d1d5d2d --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift @@ -0,0 +1,133 @@ +// +// AIChatWebViewController.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +import UIKit +import WebKit + +protocol AIChatWebViewControllerDelegate: AnyObject { + @MainActor func aiChatWebViewController(_ viewController: AIChatWebViewController, didRequestToLoad url: URL) +} + +final class AIChatWebViewController: UIViewController { + weak var delegate: AIChatWebViewControllerDelegate? + private let chatModel: AIChatViewModeling + + private lazy var webView: WKWebView = { + let webView = WKWebView(frame: .zero, configuration: chatModel.webViewConfiguration) + webView.isOpaque = false /// Required to make the background color visible + webView.backgroundColor = .systemBackground + webView.navigationDelegate = self + webView.translatesAutoresizingMaskIntoConstraints = false + return webView + }() + + private lazy var loadingView: UIActivityIndicatorView = { + let activityIndicator = UIActivityIndicatorView(style: .large) + activityIndicator.color = .label + activityIndicator.translatesAutoresizingMaskIntoConstraints = false + activityIndicator.hidesWhenStopped = true + return activityIndicator + }() + + init(chatModel: AIChatViewModeling) { + self.chatModel = chatModel + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + view.backgroundColor = .black + + setupWebView() + setupLoadingView() + loadWebsite() + } + + private func setupWebView() { + view.addSubview(webView) + + NSLayoutConstraint.activate([ + webView.topAnchor.constraint(equalTo: view.topAnchor), + webView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + webView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + webView.trailingAnchor.constraint(equalTo: view.trailingAnchor) + ]) + } + + private func setupLoadingView() { + view.addSubview(loadingView) + + NSLayoutConstraint.activate([ + loadingView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + loadingView.centerYAnchor.constraint(equalTo: view.centerYAnchor) + ]) + } +} + +// MARK: - WebView functions + +extension AIChatWebViewController { + + func reload() { + loadWebsite() + } + + private func loadWebsite() { + let request = URLRequest(url: chatModel.aiChatURL) + webView.load(request) + } +} + +// MARK: - WKNavigationDelegate + +extension AIChatWebViewController: WKNavigationDelegate { + + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction) async -> WKNavigationActionPolicy { + if let url = navigationAction.request.url { + if url == chatModel.aiChatURL || navigationAction.targetFrame?.isMainFrame == false { + return .allow + } else { + delegate?.aiChatWebViewController(self, didRequestToLoad: url) + return .cancel + } + } else { + return .allow + } + } + + func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { + loadingView.startAnimating() + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + loadingView.stopAnimating() + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + loadingView.stopAnimating() + } + + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + loadingView.stopAnimating() + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift new file mode 100644 index 0000000000..f1981fd264 --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift @@ -0,0 +1,27 @@ +// +// AIChatPixelHandling.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +public enum AIChatPixel { + case openBefore10min + case openAfter10min +} + +public protocol AIChatPixelHandling { + func fire(pixel: AIChatPixel) +} diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatSettingsProvider.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatSettingsProvider.swift new file mode 100644 index 0000000000..afd76aaf9b --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatSettingsProvider.swift @@ -0,0 +1,37 @@ +// +// AIChatSettingsProvider.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +public protocol AIChatSettingsProvider { + /// The URL used to open AI Chat in `AIChatViewController`. + var aiChatURL: URL { get } + + /// User settings state for AI Chat browsing menu icon + var isAIChatBrowsingMenuUserSettingsEnabled: Bool { get } + + /// Remote feature flag state for AI Chat + var isAIChatFeatureEnabled: Bool { get } + + /// Remote feature flag for AI Chat shortcut in browsing menu + var isAIChatBrowsingToolbarShortcutFeatureEnabled: Bool { get } + + /// Update user settings state for AI Chat browsing menu + func enableAIChatBrowsingMenuUserSettings(enable: Bool) +} diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift new file mode 100644 index 0000000000..436ec008c8 --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift @@ -0,0 +1,205 @@ +// +// AIChatViewController.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +import UIKit +import Combine +import WebKit + +/// A protocol that defines the delegate methods for `AIChatViewController`. +public protocol AIChatViewControllerDelegate: AnyObject { + /// Tells the delegate that a request to load a URL has been made. + /// + /// - Parameters: + /// - viewController: The `AIChatViewController` instance making the request. + /// - url: The `URL` that is requested to be loaded. + func aiChatViewController(_ viewController: AIChatViewController, didRequestToLoad url: URL) +} + +public final class AIChatViewController: UIViewController { + public weak var delegate: AIChatViewControllerDelegate? + private let chatModel: AIChatViewModeling + private var webViewController: AIChatWebViewController? + private var cleanupCancellable: AnyCancellable? + private var didCleanup: Bool = false + private let timerPixelHandler: TimerPixelHandler + + /// Initializes a new instance of `AIChatViewController` with the specified remote settings and web view configuration. + /// + /// - Parameters: + /// - remoteSettings: An object conforming to `AIChatSettingsProvider` that provides remote settings. + /// - webViewConfiguration: A `WKWebViewConfiguration` object used to configure the web view. + /// - pixelHandler: A `AIChatPixelHandling` object used to send pixel events. + public convenience init(settings: AIChatSettingsProvider, webViewConfiguration: WKWebViewConfiguration, pixelHandler: AIChatPixelHandling) { + let chatModel = AIChatViewModel(webViewConfiguration: webViewConfiguration, settings: settings) + self.init(chatModel: chatModel, pixelHandler: pixelHandler) + } + + internal init(chatModel: AIChatViewModeling, pixelHandler: AIChatPixelHandling) { + self.chatModel = chatModel + self.timerPixelHandler = TimerPixelHandler(pixelHandler: pixelHandler) + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Lifecycle +extension AIChatViewController { + + public override func viewDidLoad() { + super.viewDidLoad() + self.view.backgroundColor = .black + + setupNavigationBar() + + subscribeToCleanupPublisher() + } + + public override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + addWebViewController() + } + + public override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + timerPixelHandler.sendOpenPixel() + chatModel.cancelTimer() + } + + public override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + + if viewIfLoaded?.window == nil { + chatModel.cancelTimer() + removeWebViewController() + } + } +} + +// MARK: - Views Setup +extension AIChatViewController { + + private func setupNavigationBar() { + guard let navigationController = navigationController else { return } + + let appearance = UINavigationBarAppearance() + appearance.configureWithTransparentBackground() + appearance.backgroundColor = .clear + appearance.shadowImage = UIImage() + appearance.shadowColor = .clear + + navigationController.navigationBar.standardAppearance = appearance + navigationController.navigationBar.scrollEdgeAppearance = appearance + navigationController.navigationBar.compactAppearance = appearance + navigationController.navigationBar.isTranslucent = true + + let imageView = UIImageView(image: UIImage(named: "Logo")) + imageView.contentMode = .scaleAspectFit + imageView.translatesAutoresizingMaskIntoConstraints = false + + let imageSize: CGFloat = 28 + NSLayoutConstraint.activate([ + imageView.widthAnchor.constraint(equalToConstant: imageSize), + imageView.heightAnchor.constraint(equalToConstant: imageSize) + ]) + + let titleLabel = UILabel() + titleLabel.text = UserText.aiChatTitle + titleLabel.font = UIFont.systemFont(ofSize: 17, weight: .semibold) + titleLabel.textColor = .white + let stackView = UIStackView(arrangedSubviews: [imageView, titleLabel]) + stackView.axis = .horizontal + stackView.spacing = 8 + stackView.alignment = .center + stackView.distribution = .fill + + navigationItem.leftBarButtonItem = UIBarButtonItem(customView: stackView) + + let closeButton = UIBarButtonItem( + image: UIImage(named: "Close-24"), + style: .plain, + target: self, + action: #selector(closeAIChat) + ) + closeButton.accessibilityIdentifier = "aichat.close.button" + closeButton.tintColor = .white + + navigationItem.rightBarButtonItem = closeButton + } + + + private func addWebViewController() { + guard webViewController == nil else { return } + + let viewController = AIChatWebViewController(chatModel: chatModel) + viewController.delegate = self + webViewController = viewController + + addChild(viewController) + view.addSubview(viewController.view) + viewController.view.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + viewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), + viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor) + ]) + + viewController.view.backgroundColor = .black + viewController.view.layer.cornerRadius = 20 + viewController.view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + viewController.view.clipsToBounds = true + + viewController.didMove(toParent: self) + } + + private func removeWebViewController() { + webViewController?.removeFromParent() + webViewController?.view.removeFromSuperview() + webViewController = nil + } +} + +// MARK: - Event handling +extension AIChatViewController { + + private func subscribeToCleanupPublisher() { + cleanupCancellable = chatModel.cleanupPublisher + .receive(on: DispatchQueue.main) + .sink { [weak self] in + self?.webViewController?.reload() + self?.timerPixelHandler.markCleanup() + } + } + + @objc private func closeAIChat() { + chatModel.startCleanupTimer() + dismiss(animated: true) + } +} + +extension AIChatViewController: AIChatWebViewControllerDelegate { + func aiChatWebViewController(_ viewController: AIChatWebViewController, didRequestToLoad url: URL) { + delegate?.aiChatViewController(self, didRequestToLoad: url) + closeAIChat() + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/Logger+AIChat.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/Logger+AIChat.swift new file mode 100644 index 0000000000..d928d98e2e --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/Public API/Logger+AIChat.swift @@ -0,0 +1,25 @@ +// +// Logger+AIChat.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import os.log + +public extension Logger { + static let aiChat = { Logger(subsystem: "AI Chat", category: "") }() +} diff --git a/LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift b/LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift new file mode 100644 index 0000000000..91f64f5cdd --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift @@ -0,0 +1,56 @@ +// +// TimerPixelHandler.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + + +final class TimerPixelHandler { + private let pixelHandler: AIChatPixelHandling + private var hasCleanedUp = false + private var isFirstPixelSent = true + + init(pixelHandler: any AIChatPixelHandling) { + self.pixelHandler = pixelHandler + } + + /// Marks that cleanup has been performed. + func markCleanup() { + hasCleanedUp = true + } + + /// Sends an "open" pixel based on the cleanup status. + /// - If this is the first time sending a pixel, it will not send any pixel. + /// - If cleanup has been called, it sends an `openAfter10min` pixel. + /// - Otherwise, it sends an `openBefore10min` pixel. + func sendOpenPixel() { + defer { + hasCleanedUp = false + } + + // Skip sending a pixel on the first call. + guard !isFirstPixelSent else { + isFirstPixelSent = false + return + } + + if hasCleanedUp { + pixelHandler.fire(pixel: .openAfter10min) + } else { + pixelHandler.fire(pixel: .openBefore10min) + } + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/UserText.swift b/LocalPackages/AIChat/Sources/AIChat/UserText.swift new file mode 100644 index 0000000000..d33e745d2d --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/UserText.swift @@ -0,0 +1,24 @@ +// +// UserText.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +public struct UserText { + public static let aiChatTitle = NSLocalizedString("aichat.title", value: "DuckDuckGo AI Chat", comment: "Title for DuckDuckGo AI Chat. Should not be translated") +} From a58b9c9da8c7b8683224143c20bf3c2463bd7c55 Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Wed, 4 Dec 2024 11:48:43 -0800 Subject: [PATCH 02/66] Add `install` pixel (#3656) Task/Issue URL: https://app.asana.com/0/1199333091098016/1208873240363373/f Tech Design URL: CC: Description: This PR adds an m.install.ios.* pixel that is sent when calling the exti URL. --- Core/PixelEvent.swift | 4 +++- Core/StatisticsLoader.swift | 20 +++++++++++++++++++- DuckDuckGoTests/StatisticsLoaderTests.swift | 21 ++++++++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index 2edc84584d..48d2f36ac4 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -27,7 +27,8 @@ import NetworkProtection extension Pixel { public enum Event { - + + case appInstall case appLaunch case refreshPressed case pullToRefresh @@ -914,6 +915,7 @@ extension Pixel.Event { public var name: String { switch self { + case .appInstall: return "m_install" case .appLaunch: return "ml" case .refreshPressed: return "m_r" case .pullToRefresh: return "m_pull-to-reload" diff --git a/Core/StatisticsLoader.swift b/Core/StatisticsLoader.swift index a8001e6077..7d60430add 100644 --- a/Core/StatisticsLoader.swift +++ b/Core/StatisticsLoader.swift @@ -35,15 +35,18 @@ public class StatisticsLoader { private let parser = AtbParser() private let atbPresenceFileMarker = BoolFileMarker(name: .isATBPresent) private let inconsistencyMonitoring: StatisticsStoreInconsistencyMonitoring + private let pixelFiring: PixelFiring.Type init(statisticsStore: StatisticsStore = StatisticsUserDefaults(), returnUserMeasurement: ReturnUserMeasurement = KeychainReturnUserMeasurement(), usageSegmentation: UsageSegmenting = UsageSegmentation(), - inconsistencyMonitoring: StatisticsStoreInconsistencyMonitoring = StorageInconsistencyMonitor()) { + inconsistencyMonitoring: StatisticsStoreInconsistencyMonitoring = StorageInconsistencyMonitor(), + pixelFiring: PixelFiring.Type = Pixel.self) { self.statisticsStore = statisticsStore self.returnUserMeasurement = returnUserMeasurement self.usageSegmentation = usageSegmentation self.inconsistencyMonitoring = inconsistencyMonitoring + self.pixelFiring = pixelFiring } public func load(completion: @escaping Completion = {}) { @@ -94,6 +97,7 @@ public class StatisticsLoader { completion() return } + self.fireInstallPixel() self.statisticsStore.installDate = Date() self.statisticsStore.atb = atb.version self.returnUserMeasurement.installCompletedWithATB(atb) @@ -102,6 +106,20 @@ public class StatisticsLoader { } } + private func fireInstallPixel() { + let formattedLocale = Locale.current.localeIdentifierAsJsonFormat + let isReinstall = String(statisticsStore.variant == VariantIOS.returningUser.name) + let parameters = [ + "locale": formattedLocale, + "reinstall": isReinstall + ] + pixelFiring.fire(.appInstall, withAdditionalParameters: parameters, includedParameters: [.appVersion], onComplete: { error in + if let error { + Logger.general.error("Install pixel failed with error: \(error.localizedDescription, privacy: .public)") + } + }) + } + private func createATBFileMarker() { atbPresenceFileMarker?.mark() } diff --git a/DuckDuckGoTests/StatisticsLoaderTests.swift b/DuckDuckGoTests/StatisticsLoaderTests.swift index f066097e99..8fa235203c 100644 --- a/DuckDuckGoTests/StatisticsLoaderTests.swift +++ b/DuckDuckGoTests/StatisticsLoaderTests.swift @@ -27,20 +27,26 @@ class StatisticsLoaderTests: XCTestCase { var mockStatisticsStore: StatisticsStore! var mockUsageSegmentation: MockUsageSegmentation! + var mockPixelFiring: PixelFiringMock.Type! var testee: StatisticsLoader! override func setUpWithError() throws { try super.setUpWithError() + PixelFiringMock.tearDown() + + mockPixelFiring = PixelFiringMock.self mockStatisticsStore = MockStatisticsStore() mockUsageSegmentation = MockUsageSegmentation() testee = StatisticsLoader(statisticsStore: mockStatisticsStore, usageSegmentation: mockUsageSegmentation, - inconsistencyMonitoring: MockStatisticsStoreInconsistencyMonitoring()) + inconsistencyMonitoring: MockStatisticsStoreInconsistencyMonitoring(), + pixelFiring: mockPixelFiring) } override func tearDown() { HTTPStubs.removeAllStubs() + PixelFiringMock.tearDown() super.tearDown() } @@ -270,6 +276,19 @@ class StatisticsLoaderTests: XCTestCase { waitForExpectations(timeout: 5, handler: nil) } + func testWhenInstallStatisticsRequestedThenInstallPixelIsFired() { + loadSuccessfulExiStub() + + let testExpectation = expectation(description: "refresh complete") + testee.refreshAppRetentionAtb { + Thread.sleep(forTimeInterval: .seconds(0.1)) + testExpectation.fulfill() + } + + wait(for: [testExpectation], timeout: 5.0) + XCTAssertEqual(mockPixelFiring.lastPixelName, Pixel.Event.appInstall.name) + } + func loadSuccessfulAtbStub() { stub(condition: isHost(URL.atb.host!)) { _ in let path = OHPathForFile("MockFiles/atb.json", type(of: self))! From d4cc2484f7ebf9deb575ef8213fe933045643e0e Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Wed, 4 Dec 2024 21:46:15 +0100 Subject: [PATCH 03/66] Merge hotfix changes from 7.147.1 (#3674) Task/Issue URL: https://app.asana.com/0/414709148257752/1208887772407026/f **Description**: Merging in changes from the hotfix version 7.147.1. --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --------- Co-authored-by: Chris Brind --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 ++-- DuckDuckGo/AppDependencyProvider.swift | 5 ++++- DuckDuckGo/TextZoomEditorModel.swift | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index b4d015e475..9b20f234e6 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11358,7 +11358,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 216.0.1; + version = "216.0.1-1"; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index fbf8a01291..eef282eea7 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "59f8fb2f850f8a0482c604d07396e01e8de59d21", - "version" : "216.0.1" + "revision" : "3517357ecd9d5e9ef7ef2f229c0ebc6460f309e6", + "version" : "216.0.1-1" } }, { diff --git a/DuckDuckGo/AppDependencyProvider.swift b/DuckDuckGo/AppDependencyProvider.swift index b867f5ea79..0ee74aa535 100644 --- a/DuckDuckGo/AppDependencyProvider.swift +++ b/DuckDuckGo/AppDependencyProvider.swift @@ -135,7 +135,10 @@ final class AppDependencyProvider: DependencyProvider { } } - let subscriptionManager = DefaultSubscriptionManager(storePurchaseManager: DefaultStorePurchaseManager(subscriptionFeatureMappingCache: subscriptionFeatureMappingCache), + let storePurchaseManager = DefaultStorePurchaseManager(subscriptionFeatureMappingCache: subscriptionFeatureMappingCache, + subscriptionFeatureFlagger: subscriptionFeatureFlagger) + + let subscriptionManager = DefaultSubscriptionManager(storePurchaseManager: storePurchaseManager, accountManager: accountManager, subscriptionEndpointService: subscriptionService, authEndpointService: authService, diff --git a/DuckDuckGo/TextZoomEditorModel.swift b/DuckDuckGo/TextZoomEditorModel.swift index 44e187d762..74f082c2fd 100644 --- a/DuckDuckGo/TextZoomEditorModel.swift +++ b/DuckDuckGo/TextZoomEditorModel.swift @@ -59,11 +59,11 @@ class TextZoomEditorModel: ObservableObject { NotificationCenter.default.post( name: AppUserDefaults.Notifications.textZoomChange, object: nil) - DailyPixel.fire(pixel: .textZoomChangedOnPageDaily) } func onDismiss() { guard initialValue.rawValue != TextZoomLevel.allCases[value].rawValue else { return } + DailyPixel.fire(pixel: .textZoomChangedOnPageDaily) Pixel.fire(.textZoomChangedOnPage, withAdditionalParameters: [ PixelParameters.textZoomInitial: String(initialValue.rawValue), PixelParameters.textZoomUpdated: String(TextZoomLevel.allCases[value].rawValue), From 75dff245d5ff8d1634670ab246d003e04703028d Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Wed, 4 Dec 2024 22:20:09 +0100 Subject: [PATCH 04/66] Release 7.148.0-2 (#3676) Please make sure all GH checks passed before merging. It can take around 20 minutes. Briefly review this PR to see if there are no issues or red flags and then merge it. --- DuckDuckGo.xcodeproj/project.pbxproj | 56 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 9b20f234e6..6a9f6a9398 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9476,7 +9476,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9513,7 +9513,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9603,7 +9603,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9630,7 +9630,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9776,7 +9776,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9800,7 +9800,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9867,7 +9867,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -9901,7 +9901,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9934,7 +9934,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9964,7 +9964,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10353,7 +10353,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10384,7 +10384,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10412,7 +10412,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10445,7 +10445,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10475,7 +10475,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10508,11 +10508,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -10742,7 +10742,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10770,7 +10770,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10802,7 +10802,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10839,7 +10839,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10874,7 +10874,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10909,11 +10909,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11085,11 +11085,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11118,10 +11118,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; From abdc3c17f286512ba6bb7baa5c5fa1c4b35e96fb Mon Sep 17 00:00:00 2001 From: Pete Smith <5278441+aataraxiaa@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:34:12 +0000 Subject: [PATCH 05/66] Add Missing Enum to Freemium RMF Implementation (#3673) Task/Issue URL: https://app.asana.com/0/1206488453854252/1208904081551825/f **Description**: Bump BSK for missing Freemium RMF enum --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index d0119223ce..c1ff74b017 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11358,7 +11358,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 217.0.1; + version = 217.0.2; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b4e514023f..2ef745a21a 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "0448a7610e23d03e4d8ac3173af40bd591094d90", - "version" : "217.0.1" + "revision" : "f0755fbb3309c93c8490dc8bbdfb7e2e7613bef6", + "version" : "217.0.2" } }, { From f0d0107b15980623ab8a49708b7449eb00aa4948 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio <44158575+SabrinaTardio@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:33:44 +0100 Subject: [PATCH 06/66] experiment pixels (#3669) Task/Issue URL: https://app.asana.com/0/1204186595873227/1208775176602791/f Tech Design URL: https://app.asana.com/0/1204186595873227/1208682592686299 CC: **Description**: Implements PixelExperimentKit to provide Experiment metrics API to clients and fires pixel for preset experiment metrics --- Core/StatisticsLoader.swift | 10 ++++++ DuckDuckGo.xcodeproj/project.pbxproj | 22 +++++++++++-- .../xcshareddata/swiftpm/Package.resolved | 4 +-- DuckDuckGo/AppDelegate.swift | 29 ++++++++++++++++ DuckDuckGo/AppDependencyProvider.swift | 15 +++++---- DuckDuckGoTests/StatisticsLoaderTests.swift | 12 +++++++ IntegrationTests/AtbServerTests.swift | 33 ++++++++++++++++++- 7 files changed, 112 insertions(+), 13 deletions(-) diff --git a/Core/StatisticsLoader.swift b/Core/StatisticsLoader.swift index 7d60430add..166e8e5014 100644 --- a/Core/StatisticsLoader.swift +++ b/Core/StatisticsLoader.swift @@ -21,6 +21,8 @@ import Common import Foundation import BrowserServicesKit import Networking +import PixelKit +import PixelExperimentKit import os.log public class StatisticsLoader { @@ -35,17 +37,23 @@ public class StatisticsLoader { private let parser = AtbParser() private let atbPresenceFileMarker = BoolFileMarker(name: .isATBPresent) private let inconsistencyMonitoring: StatisticsStoreInconsistencyMonitoring + private let fireSearchExperimentPixels: () -> Void + private let fireAppRetentionExperimentPixels: () -> Void private let pixelFiring: PixelFiring.Type init(statisticsStore: StatisticsStore = StatisticsUserDefaults(), returnUserMeasurement: ReturnUserMeasurement = KeychainReturnUserMeasurement(), usageSegmentation: UsageSegmenting = UsageSegmentation(), inconsistencyMonitoring: StatisticsStoreInconsistencyMonitoring = StorageInconsistencyMonitor(), + fireAppRetentionExperimentPixels: @escaping () -> Void = PixelKit.fireAppRetentionExperimentPixels, + fireSearchExperimentPixels: @escaping () -> Void = PixelKit.fireSearchExperimentPixels, pixelFiring: PixelFiring.Type = Pixel.self) { self.statisticsStore = statisticsStore self.returnUserMeasurement = returnUserMeasurement self.usageSegmentation = usageSegmentation self.inconsistencyMonitoring = inconsistencyMonitoring + self.fireSearchExperimentPixels = fireSearchExperimentPixels + self.fireAppRetentionExperimentPixels = fireAppRetentionExperimentPixels self.pixelFiring = pixelFiring } @@ -125,6 +133,7 @@ public class StatisticsLoader { } public func refreshSearchRetentionAtb(completion: @escaping Completion = {}) { + fireSearchExperimentPixels() guard let url = StatisticsDependentURLFactory(statisticsStore: statisticsStore).makeSearchAtbURL() else { requestInstallStatistics { self.updateUsageSegmentationAfterInstall(activityType: .search) @@ -154,6 +163,7 @@ public class StatisticsLoader { } public func refreshAppRetentionAtb(completion: @escaping Completion = {}) { + fireAppRetentionExperimentPixels() guard let url = StatisticsDependentURLFactory(statisticsStore: statisticsStore).makeAppAtbURL() else { requestInstallStatistics { self.updateUsageSegmentationAfterInstall(activityType: .appUse) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index c1ff74b017..0d51c5c184 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -288,6 +288,9 @@ 56D060262C359D2E003BAEB5 /* ContextualOnboardingDialogs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D060252C359D2E003BAEB5 /* ContextualOnboardingDialogs.swift */; }; 56D060282C380D83003BAEB5 /* OnboardingSuggestedSearchesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D060272C380D83003BAEB5 /* OnboardingSuggestedSearchesProvider.swift */; }; 56D0602D2C383FD2003BAEB5 /* OnboardingSuggestedSearchesProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D0602C2C383FD2003BAEB5 /* OnboardingSuggestedSearchesProviderTests.swift */; }; + 56D7792C2CFF476800B619EF /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D664C7DC2B28A02800CBFA76 /* StoreKit.framework */; }; + 56D7793A2CFFC7E800B619EF /* PixelExperimentKit in Frameworks */ = {isa = PBXBuildFile; productRef = 56D779392CFFC7E800B619EF /* PixelExperimentKit */; }; + 56D7793C2CFFC7E800B619EF /* PixelKit in Frameworks */ = {isa = PBXBuildFile; productRef = 56D7793B2CFFC7E800B619EF /* PixelKit */; }; 56D8556A2BEA9169009F9698 /* CurrentDateProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D855692BEA9169009F9698 /* CurrentDateProviding.swift */; }; 56D8556C2BEA91C4009F9698 /* SyncAlertsPresenting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D8556B2BEA91C4009F9698 /* SyncAlertsPresenting.swift */; }; 6AC6DAB328804F97002723C0 /* BarsAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC6DAB228804F97002723C0 /* BarsAnimator.swift */; }; @@ -1043,7 +1046,6 @@ D664C7C92B289AA200CBFA76 /* AsyncHeadlessWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D664C7AF2B289AA000CBFA76 /* AsyncHeadlessWebView.swift */; }; D664C7CC2B289AA200CBFA76 /* SubscriptionPagesUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = D664C7B32B289AA000CBFA76 /* SubscriptionPagesUserScript.swift */; }; D664C7CE2B289AA200CBFA76 /* SubscriptionPagesUseSubscriptionFeature.swift in Sources */ = {isa = PBXBuildFile; fileRef = D664C7B52B289AA000CBFA76 /* SubscriptionPagesUseSubscriptionFeature.swift */; }; - D664C7DD2B28A02800CBFA76 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D664C7DC2B28A02800CBFA76 /* StoreKit.framework */; }; D668D9252B693778008E2FF2 /* SubscriptionITPView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D668D9242B693778008E2FF2 /* SubscriptionITPView.swift */; }; D668D9272B6937D2008E2FF2 /* SubscriptionITPViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D668D9262B6937D2008E2FF2 /* SubscriptionITPViewModel.swift */; }; D668D9292B69681C008E2FF2 /* IdentityTheftRestorationPagesUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = D668D9282B69681C008E2FF2 /* IdentityTheftRestorationPagesUserScript.swift */; }; @@ -3141,6 +3143,7 @@ 9F8FE9492BAE50E50071E372 /* Lottie in Frameworks */, 853273B624FFE0BB00E3C778 /* WidgetKit.framework in Frameworks */, 0238E44F29C0FAA100615E30 /* FindInPageIOSJSSupport in Frameworks */, + 56D7792C2CFF476800B619EF /* StoreKit.framework in Frameworks */, 3760DFED299315EF0045A446 /* Waitlist in Frameworks */, F1D43AFA2B99C1D300BAB743 /* BareBonesBrowserKit in Frameworks */, F143C2EB1E4A4CD400CFDE3A /* Core.framework in Frameworks */, @@ -3152,7 +3155,6 @@ F4D7F634298C00C3006C3AE9 /* FindInPageIOSJSSupport in Frameworks */, 9F96F73B2C9144D5009E45D5 /* Onboarding in Frameworks */, 85D598872927F84C00FA3B1B /* Crashes in Frameworks */, - D664C7DD2B28A02800CBFA76 /* StoreKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3260,7 +3262,9 @@ CBC83E3429B631780008E19C /* Configuration in Frameworks */, D61CDA182B7CF78300A0FBB9 /* ZIPFoundation in Frameworks */, CB6D8E982C80A9B100D0E772 /* SpecialErrorPages in Frameworks */, + 56D7793A2CFFC7E800B619EF /* PixelExperimentKit in Frameworks */, 851F74262B9A1BFD00747C42 /* Suggestions in Frameworks */, + 56D7793C2CFFC7E800B619EF /* PixelKit in Frameworks */, 98A16C2D28A11D6200A6C003 /* BrowserServicesKit in Frameworks */, 8599690F29D2F1C100DBF9FA /* DDGSync in Frameworks */, 851481882A600EFC00ABC65F /* RemoteMessaging in Frameworks */, @@ -7014,6 +7018,8 @@ CB6D8E972C80A9B100D0E772 /* SpecialErrorPages */, CB6CC7E32CD2529000320907 /* BrokenSitePrompt */, CBECDB6E2CD3DFBE005B8B87 /* PageRefreshMonitor */, + 56D779392CFFC7E800B619EF /* PixelExperimentKit */, + 56D7793B2CFFC7E800B619EF /* PixelKit */, ); productName = Core; productReference = F143C2E41E4A4CD400CFDE3A /* Core.framework */; @@ -11358,7 +11364,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 217.0.2; + version = 218.0.0; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { @@ -11528,6 +11534,16 @@ package = 98A16C2928A11BDE00A6C003 /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; productName = Common; }; + 56D779392CFFC7E800B619EF /* PixelExperimentKit */ = { + isa = XCSwiftPackageProductDependency; + package = 98A16C2928A11BDE00A6C003 /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; + productName = PixelExperimentKit; + }; + 56D7793B2CFFC7E800B619EF /* PixelKit */ = { + isa = XCSwiftPackageProductDependency; + package = 98A16C2928A11BDE00A6C003 /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; + productName = PixelKit; + }; 851481872A600EFC00ABC65F /* RemoteMessaging */ = { isa = XCSwiftPackageProductDependency; package = 98A16C2928A11BDE00A6C003 /* XCRemoteSwiftPackageReference "BrowserServicesKit" */; diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2ef745a21a..7d8e4affb7 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "f0755fbb3309c93c8490dc8bbdfb7e2e7613bef6", - "version" : "217.0.2" + "revision" : "e5d390c8559fbe7b1ca67fd3982c91bcc0437d60", + "version" : "218.0.0" } }, { diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift index 1f6cb0cf60..0ec3c93bf1 100644 --- a/DuckDuckGo/AppDelegate.swift +++ b/DuckDuckGo/AppDelegate.swift @@ -36,6 +36,8 @@ import RemoteMessaging import SyncDataProviders import Subscription import NetworkProtection +import PixelKit +import PixelExperimentKit import WebKit import os.log @@ -294,6 +296,33 @@ import os.log ).wrappedValue ) ?? defaultEnvironment + var dryRun = false +#if DEBUG + dryRun = true +#endif + let isPhone = UIDevice.current.userInterfaceIdiom == .phone + let source = isPhone ? PixelKit.Source.iOS : PixelKit.Source.iPadOS + PixelKit.setUp(dryRun: dryRun, + appVersion: AppVersion.shared.versionNumber, + source: source.rawValue, + defaultHeaders: [:], + defaults: UserDefaults(suiteName: "\(Global.groupIdPrefix).app-configuration") ?? UserDefaults()) { (pixelName: String, headers: [String: String], parameters: [String: String], _, _, onComplete: @escaping PixelKit.CompletionBlock) in + + let url = URL.pixelUrl(forPixelNamed: pixelName) + let apiHeaders = APIRequestV2.HeadersV2(additionalHeaders: headers) + let request = APIRequestV2(url: url, method: .get, queryItems: parameters, headers: apiHeaders) + Task { + do { + _ = try await DefaultAPIService().fetch(request: request) + onComplete(true, nil) + } catch { + onComplete(false, error) + } + } + } + PixelKit.configureExperimentKit(featureFlagger: AppDependencyProvider.shared.featureFlagger, + eventTracker: ExperimentEventTracker(store: UserDefaults(suiteName: "\(Global.groupIdPrefix).app-configuration") ?? UserDefaults())) + let syncErrorHandler = SyncErrorHandler() syncDataProviders = SyncDataProviders( diff --git a/DuckDuckGo/AppDependencyProvider.swift b/DuckDuckGo/AppDependencyProvider.swift index 0ee74aa535..00b6f9fc29 100644 --- a/DuckDuckGo/AppDependencyProvider.swift +++ b/DuckDuckGo/AppDependencyProvider.swift @@ -27,6 +27,8 @@ import Common import NetworkProtection import RemoteMessaging import PageRefreshMonitor +import PixelKit +import PixelExperimentKit protocol DependencyProvider { @@ -58,10 +60,8 @@ protocol DependencyProvider { final class AppDependencyProvider: DependencyProvider { static var shared: DependencyProvider = AppDependencyProvider() - let appSettings: AppSettings = AppUserDefaults() let variantManager: VariantManager = DefaultVariantManager() - let internalUserDecider: InternalUserDecider = ContentBlocking.shared.privacyConfigurationManager.internalUserDecider let featureFlagger: FeatureFlagger @@ -93,13 +93,14 @@ final class AppDependencyProvider: DependencyProvider { let persistentPixel: PersistentPixelFiring = PersistentPixel() private init() { + let featureFlaggerOverrides = FeatureFlagLocalOverrides(keyValueStore: UserDefaults(suiteName: FeatureFlag.localOverrideStoreName)!, + actionHandler: FeatureFlagOverridesPublishingHandler() + ) + let experimentManager = ExperimentCohortsManager(store: ExperimentsDataStore(), fireCohortAssigned: PixelKit.fireExperimentEnrollmentPixel(subfeatureID:experiment:)) featureFlagger = DefaultFeatureFlagger(internalUserDecider: internalUserDecider, privacyConfigManager: ContentBlocking.shared.privacyConfigurationManager, - localOverrides: FeatureFlagLocalOverrides( - keyValueStore: UserDefaults(suiteName: FeatureFlag.localOverrideStoreName)!, - actionHandler: FeatureFlagOverridesPublishingHandler() - ), - experimentManager: ExperimentCohortsManager(store: ExperimentsDataStore()), + localOverrides: featureFlaggerOverrides, + experimentManager: experimentManager, for: FeatureFlag.self) configurationManager = ConfigurationManager(store: configurationStore) diff --git a/DuckDuckGoTests/StatisticsLoaderTests.swift b/DuckDuckGoTests/StatisticsLoaderTests.swift index 8fa235203c..f64d667df5 100644 --- a/DuckDuckGoTests/StatisticsLoaderTests.swift +++ b/DuckDuckGoTests/StatisticsLoaderTests.swift @@ -29,6 +29,8 @@ class StatisticsLoaderTests: XCTestCase { var mockUsageSegmentation: MockUsageSegmentation! var mockPixelFiring: PixelFiringMock.Type! var testee: StatisticsLoader! + private var fireAppRetentionExperimentPixelsCalled = false + private var fireSearchExperimentPixelsCalled = false override func setUpWithError() throws { try super.setUpWithError() @@ -41,6 +43,8 @@ class StatisticsLoaderTests: XCTestCase { testee = StatisticsLoader(statisticsStore: mockStatisticsStore, usageSegmentation: mockUsageSegmentation, inconsistencyMonitoring: MockStatisticsStoreInconsistencyMonitoring(), + fireAppRetentionExperimentPixels: { self.fireAppRetentionExperimentPixelsCalled = true }, + fireSearchExperimentPixels: { self.fireSearchExperimentPixelsCalled = true }, pixelFiring: mockPixelFiring) } @@ -62,6 +66,7 @@ class StatisticsLoaderTests: XCTestCase { } wait(for: [testExpectation], timeout: 5.0) XCTAssertTrue(mockUsageSegmentation.atbs[0].installAtb.isReturningUser) + XCTAssertTrue(fireAppRetentionExperimentPixelsCalled) } func testWhenReturnUser_ThenSegmentationIncludesCorrectVariant() { @@ -76,6 +81,7 @@ class StatisticsLoaderTests: XCTestCase { } wait(for: [testExpectation], timeout: 5.0) XCTAssertTrue(mockUsageSegmentation.atbs[0].installAtb.isReturningUser) + XCTAssertTrue(fireSearchExperimentPixelsCalled) } func testWhenSearchRefreshHappensButNotInstalled_ThenRetentionSegmentationNotified() { @@ -87,6 +93,7 @@ class StatisticsLoaderTests: XCTestCase { } wait(for: [testExpectation], timeout: 5.0) XCTAssertFalse(mockUsageSegmentation.atbs.isEmpty) + XCTAssertTrue(fireSearchExperimentPixelsCalled) } func testWhenAppRefreshHappensButNotInstalled_ThenRetentionSegmentationNotified() { @@ -98,6 +105,7 @@ class StatisticsLoaderTests: XCTestCase { } wait(for: [testExpectation], timeout: 5.0) XCTAssertFalse(mockUsageSegmentation.atbs.isEmpty) + XCTAssertTrue(fireAppRetentionExperimentPixelsCalled) } func testWhenStatisticsInstalled_ThenRetentionSegmentationNotNotified() { @@ -122,6 +130,7 @@ class StatisticsLoaderTests: XCTestCase { } wait(for: [testExpectation], timeout: 5.0) XCTAssertFalse(mockUsageSegmentation.atbs.isEmpty) + XCTAssertTrue(fireAppRetentionExperimentPixelsCalled) } func testWhenSearchRetentionRefreshHappens_ThenRetentionSegmentationNotified() { @@ -135,6 +144,7 @@ class StatisticsLoaderTests: XCTestCase { } wait(for: [testExpectation], timeout: 5.0) XCTAssertFalse(mockUsageSegmentation.atbs.isEmpty) + XCTAssertTrue(self.fireSearchExperimentPixelsCalled) } func testWhenSearchRefreshHasSuccessfulUpdateAtbRequestThenSearchRetentionAtbUpdated() { @@ -151,6 +161,7 @@ class StatisticsLoaderTests: XCTestCase { } waitForExpectations(timeout: 5, handler: nil) + XCTAssertTrue(self.fireSearchExperimentPixelsCalled) } func testWhenAppRefreshHasSuccessfulUpdateAtbRequestThenAppRetentionAtbUpdated() { @@ -167,6 +178,7 @@ class StatisticsLoaderTests: XCTestCase { } waitForExpectations(timeout: 5, handler: nil) + XCTAssertTrue(self.fireAppRetentionExperimentPixelsCalled) } func testWhenLoadHasSuccessfulAtbAndExtiRequestsThenStoreUpdatedWithVariant() { diff --git a/IntegrationTests/AtbServerTests.swift b/IntegrationTests/AtbServerTests.swift index 029e2bba34..624e66a3e4 100644 --- a/IntegrationTests/AtbServerTests.swift +++ b/IntegrationTests/AtbServerTests.swift @@ -20,6 +20,8 @@ import XCTest @testable import Core @testable import BrowserServicesKit +import Combine +import PixelKit class AtbServerTests: XCTestCase { @@ -32,7 +34,7 @@ class AtbServerTests: XCTestCase { override func setUp() { super.setUp() - + PixelKit.configureExperimentKit(featureFlagger: MockFeatureFlagger()) store = MockStatisticsStore() loader = StatisticsLoader(statisticsStore: store, inconsistencyMonitoring: MockStatisticsStoreInconsistencyMonitoring()) @@ -136,3 +138,32 @@ private struct MockStatisticsStoreInconsistencyMonitoring: StatisticsStoreIncons } } + +class MockFeatureFlagger: FeatureFlagger { + func isFeatureOn(for featureFlag: Flag, allowOverride: Bool) -> Bool where Flag: FeatureFlagDescribing { + return false + } + + var internalUserDecider: any InternalUserDecider = MockInteranlUserDecider() + + var localOverrides: (any BrowserServicesKit.FeatureFlagLocalOverriding)? + + func getCohortIfEnabled(for featureFlag: Flag) -> (any FlagCohort)? where Flag: FeatureFlagExperimentDescribing { + return nil + } + + func getAllActiveExperiments() -> Experiments { + return [:] + } + +} + +class MockInteranlUserDecider: InternalUserDecider { + var isInternalUser: Bool = false + + var isInternalUserPublisher: AnyPublisher = Just(false).eraseToAnyPublisher() + + func markUserAsInternalIfNeeded(forUrl url: URL?, response: HTTPURLResponse?) -> Bool { + return false + } +} From 3437ecfd98f4cfd5ad14743f38af4e6dc2980bbc Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Thu, 5 Dec 2024 08:15:58 -0800 Subject: [PATCH 07/66] Widget accent color improvements (#3677) Task/Issue URL: https://app.asana.com/0/414235014887631/1208886733474308/f Tech Design URL: CC: Description: This PR updates the widgets to better handle an accent color. --- .maestro/release_tests/widgets.yaml | 14 +++++-- Widgets/VPNWidget.swift | 30 +++++++++++++-- Widgets/WidgetViews.swift | 57 ++++++++++++++++++----------- 3 files changed, 72 insertions(+), 29 deletions(-) diff --git a/.maestro/release_tests/widgets.yaml b/.maestro/release_tests/widgets.yaml index 491c82b079..0c3ba823c4 100644 --- a/.maestro/release_tests/widgets.yaml +++ b/.maestro/release_tests/widgets.yaml @@ -30,10 +30,14 @@ appId: com.duckduckgo.mobile.ios # Validate search widget - longPressOn: point: 50%,50% + +# iOS 18 now has an edit button first +- tapOn: "Edit" - tapOn: "Add Widget" - tapOn: "Search Widgets" -- inputText: "DuckDuck" -- tapOn: "DuckDuckGo" +- inputText: "DuckDuckGo" +- tapOn: + point: 30%,30% - tapOn: " Add Widget" - tapOn: "Done" - tapOn: "DuckDuckGo" @@ -48,10 +52,12 @@ appId: com.duckduckgo.mobile.ios - pressKey: HOME - longPressOn: point: 50%,50% +- tapOn: "Edit" - tapOn: "Add Widget" - tapOn: "Search Widgets" -- inputText: "DuckDuck" -- tapOn: "DuckDuckGo" +- inputText: "DuckDuckGo" +- tapOn: + point: 30%,30% - assertVisible: "Search" - swipe: start: 90%, 50% diff --git a/Widgets/VPNWidget.swift b/Widgets/VPNWidget.swift index 3f6309ff88..9ad909410f 100644 --- a/Widgets/VPNWidget.swift +++ b/Widgets/VPNWidget.swift @@ -110,9 +110,12 @@ extension NEVPNStatus { @available(iOSApplicationExtension 17.0, *) struct VPNStatusView: View { + @Environment(\.widgetFamily) var family: WidgetFamily + @Environment(\.widgetRenderingMode) var widgetRenderingMode @Environment(\.colorScheme) private var colorScheme @Environment(\.openURL) private var openURL + var entry: VPNStatusTimelineProvider.Entry private let dateFormatter: DateFormatter = { @@ -143,7 +146,10 @@ struct VPNStatusView: View { private func connectionView(with status: NEVPNStatus) -> some View { HStack { VStack(alignment: .leading, spacing: 0) { - Image(headerImageName(with: status)).padding([.bottom], 7) + Image(headerImageName(with: status)) + .useFullColorRendering() + .padding([.bottom], 7) + .accessibilityHidden(true) Text(title(with: status)) .font(.system(size: 16, weight: .semibold)) @@ -168,11 +174,12 @@ struct VPNStatusView: View { let intent: any AppIntent = snoozeTimingStore.isSnoozing ? CancelSnoozeVPNIntent() : DisableVPNIntent() Button(buttonTitle, intent: intent) + .borderedStyle(widgetRenderingMode == .fullColor) + .makeAccentable(status == .connected) .font(.system(size: 14, weight: .semibold)) .foregroundStyle(snoozeTimingStore.isSnoozing ? connectButtonForegroundColor(isDisabled: false) : disconnectButtonForegroundColor(isDisabled: status != .connected)) - .buttonStyle(.borderedProminent) .buttonBorderShape(.roundedRectangle(radius: 8)) .tint(snoozeTimingStore.isSnoozing ? Color(designSystemColor: .accent) : @@ -184,9 +191,10 @@ struct VPNStatusView: View { .padding(.bottom, 16) case .connecting, .reasserting: Button(UserText.vpnWidgetDisconnectButton, intent: DisableVPNIntent()) + .borderedStyle(widgetRenderingMode == .fullColor) + .makeAccentable(status == .connected) .font(.system(size: 14, weight: .semibold)) .foregroundStyle(disconnectButtonForegroundColor(isDisabled: status != .connected)) - .buttonStyle(.borderedProminent) .buttonBorderShape(.roundedRectangle(radius: 8)) .tint(disconnectButtonBackgroundColor(isDisabled: status != .connected)) .disabled(status != .connected) @@ -195,9 +203,10 @@ struct VPNStatusView: View { .padding(.bottom, 16) case .disconnected, .disconnecting: connectButton + .borderedStyle(widgetRenderingMode == .fullColor) + .makeAccentable(status == .disconnected) .font(.system(size: 14, weight: .semibold)) .foregroundStyle(connectButtonForegroundColor(isDisabled: status != .disconnected)) - .buttonStyle(.borderedProminent) .buttonBorderShape(.roundedRectangle(radius: 8)) .tint(Color(designSystemColor: .accent)) .disabled(status != .disconnected) @@ -351,3 +360,16 @@ struct VPNStatusView_Previews: PreviewProvider { } } } + +extension Button { + + @ViewBuilder + func borderedStyle(_ isBordered: Bool) -> some View { + if isBordered { + self.buttonStyle(.borderedProminent) + } else { + self.buttonStyle(.automatic) + } + } + +} diff --git a/Widgets/WidgetViews.swift b/Widgets/WidgetViews.swift index 2215b1aead..a99451f7ab 100644 --- a/Widgets/WidgetViews.swift +++ b/Widgets/WidgetViews.swift @@ -43,15 +43,24 @@ struct FavoriteView: View { .shadow(color: Color.black.opacity(0.08), radius: 8, x: 0, y: 2) if let image = favorite.favicon { - - Image(uiImage: image) - .scaleDown(image.size.width > 60) - .cornerRadius(10) + + if image.size.width > 60 { + Image(uiImage: image) + .resizable() + .useFullColorRendering() + .aspectRatio(contentMode: .fit) + .cornerRadius(10) + } else { + Image(uiImage: image) + .useFullColorRendering() + .cornerRadius(10) + } } else if favorite.isDuckDuckGo { Image(.duckDuckGoColor24) .resizable() + .useFullColorRendering() .frame(width: 45, height: 45, alignment: .center) } else { @@ -83,13 +92,14 @@ struct LargeSearchFieldView: View { ZStack { RoundedRectangle(cornerSize: CGSize(width: 8, height: 8)) - .fill(Color.widgetSearchFieldBackground) + .fill(Color(designSystemColor: .container)) .frame(minHeight: 46, maxHeight: 46) .padding(.vertical, 16) HStack { Image(.duckDuckGoColor24) + .useFullColorRendering() .frame(width: 24, height: 24, alignment: .leading) Text(UserText.searchDuckDuckGo) @@ -99,6 +109,7 @@ struct LargeSearchFieldView: View { Spacer() Image(.findSearch20) + .useFullColorRendering() .foregroundColor(Color(designSystemColor: .textPrimary).opacity(0.5)) }.padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16)) @@ -167,7 +178,6 @@ struct FavoritesWidgetView: View { var body: some View { ZStack { - Rectangle().fill(Color(designSystemColor: .backgroundSheets)) VStack(alignment: .center, spacing: 0) { @@ -215,14 +225,11 @@ struct SearchWidgetView: View { var body: some View { ZStack { - Rectangle() - .fill(Color(designSystemColor: .backgroundSheets)) - .accessibilityLabel(Text(UserText.searchDuckDuckGo)) - VStack(alignment: .center, spacing: 15) { Image(.logo) .resizable() + .useFullColorRendering() .frame(width: 46, height: 46, alignment: .center) .isHidden(false) .accessibilityHidden(true) @@ -230,10 +237,11 @@ struct SearchWidgetView: View { ZStack(alignment: Alignment(horizontal: .trailing, vertical: .center)) { RoundedRectangle(cornerSize: CGSize(width: 8, height: 8)) - .fill(Color.widgetSearchFieldBackground) + .fill(Color(designSystemColor: .container)) .frame(width: 126, height: 46) Image(.findSearch20) + .useFullColorRendering() .frame(width: 20, height: 20) .padding(.leading) .padding(.trailing, 13) @@ -241,7 +249,8 @@ struct SearchWidgetView: View { .accessibilityHidden(true) .foregroundColor(Color(designSystemColor: .textPrimary).opacity(0.5)) } - }.accessibilityHidden(true) + .accessibilityHidden(true) + }.accessibilityLabel(Text(UserText.searchDuckDuckGo)) } .widgetContainerBackground(color: Color(designSystemColor: .backgroundSheets)) } @@ -252,13 +261,10 @@ struct PasswordsWidgetView: View { var body: some View { ZStack { - Rectangle() - .fill(Color(designSystemColor: .backgroundSheets)) - .accessibilityLabel(Text(UserText.passwords)) - VStack(alignment: .center, spacing: 6) { Image(.widgetPasswordIllustration) + .useFullColorRendering() .frame(width: 96, height: 72) .isHidden(false) .accessibilityHidden(true) @@ -270,7 +276,7 @@ struct PasswordsWidgetView: View { .padding(.horizontal, 8) } - .accessibilityHidden(true) + .accessibilityLabel(Text(UserText.passwords)) } .widgetContainerBackground(color: Color(designSystemColor: .backgroundSheets)) } @@ -285,7 +291,15 @@ extension View { color } } else { - self + background(color) + } + } + + func makeAccentable(_ isAccentable: Bool = true) -> some View { + if #available(iOSApplicationExtension 16.0, *) { + return self.widgetAccentable(isAccentable) + } else { + return self } } @@ -325,9 +339,10 @@ extension View { extension Image { - @ViewBuilder func scaleDown(_ shouldScale: Bool) -> some View { - if shouldScale { - self.resizable().aspectRatio(contentMode: .fit) + /// Marks images as exempt from tint color overrides, such as favicons which should not have their color modified even when a tint color is set. + @ViewBuilder func useFullColorRendering() -> some View { + if #available(iOSApplicationExtension 18.0, *) { + self.widgetAccentedRenderingMode(.fullColor) } else { self } From 684a4d9e15ee1a9098068e0e42923f91ef2eb3dc Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Thu, 5 Dec 2024 13:38:06 -0300 Subject: [PATCH 08/66] AI Chat transition animation (#3682) Task/Issue URL: https://app.asana.com/0/1204167627774280/1208906546735883/f **Description**: Add new transition for AI Chat UI --- DuckDuckGo.xcodeproj/project.pbxproj | 16 ++ DuckDuckGo/MainViewController.swift | 15 +- ...ndedPageSheetContainerViewController.swift | 175 ++++++++++++++++++ ...RoundedPageSheetPresentationAnimator.swift | 71 +++++++ .../Public API/AIChatViewController.swift | 70 +------ 5 files changed, 279 insertions(+), 68 deletions(-) create mode 100644 DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift create mode 100644 DuckDuckGo/RoundedPageContainer/RoundedPageSheetPresentationAnimator.swift diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 6a9f6a9398..bffe6bd5d8 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -169,6 +169,8 @@ 3170048227A9504F00C03F35 /* DownloadMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3170048127A9504F00C03F35 /* DownloadMocks.swift */; }; 317045C02858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317045BF2858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift */; }; 317CA3432CFF82E100F88848 /* SettingsAIChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317CA3422CFF82DB00F88848 /* SettingsAIChatView.swift */; }; + 317DF6082D01E7B900DE0145 /* RoundedPageSheetContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317DF6072D01E7B900DE0145 /* RoundedPageSheetContainerViewController.swift */; }; + 317DF60B2D01E7D600DE0145 /* RoundedPageSheetPresentationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317DF60A2D01E7D600DE0145 /* RoundedPageSheetPresentationAnimator.swift */; }; 317F5F982C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317F5F972C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift */; }; 31860A5B2C57ED2D005561F5 /* DuckPlayerStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31860A5A2C57ED2D005561F5 /* DuckPlayerStorage.swift */; }; 31951E8E2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */; }; @@ -1535,6 +1537,8 @@ 317045BF2858C6B90016ED1F /* AutofillInterfaceEmailTruncatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceEmailTruncatorTests.swift; sourceTree = ""; }; 31794BFF2821DFB600F18633 /* DuckUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = DuckUI; sourceTree = ""; }; 317CA3422CFF82DB00F88848 /* SettingsAIChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsAIChatView.swift; sourceTree = ""; }; + 317DF6072D01E7B900DE0145 /* RoundedPageSheetContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedPageSheetContainerViewController.swift; sourceTree = ""; }; + 317DF60A2D01E7D600DE0145 /* RoundedPageSheetPresentationAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedPageSheetPresentationAnimator.swift; sourceTree = ""; }; 317F5F972C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketplaceAdPostbackStorage.swift; sourceTree = ""; }; 31860A5A2C57ED2D005561F5 /* DuckPlayerStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DuckPlayerStorage.swift; sourceTree = ""; }; 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsHeaderView.swift; sourceTree = ""; }; @@ -3710,6 +3714,15 @@ name = Utils; sourceTree = ""; }; + 317DF6092D01E7C400DE0145 /* RoundedPageContainer */ = { + isa = PBXGroup; + children = ( + 317DF60A2D01E7D600DE0145 /* RoundedPageSheetPresentationAnimator.swift */, + 317DF6072D01E7B900DE0145 /* RoundedPageSheetContainerViewController.swift */, + ); + path = RoundedPageContainer; + sourceTree = ""; + }; 31951E9328230D8900CAF535 /* Shared */ = { isa = PBXGroup; children = ( @@ -6508,6 +6521,7 @@ F1D796ED1E7AE4090019D451 /* UserInterface */ = { isa = PBXGroup; children = ( + 317DF6092D01E7C400DE0145 /* RoundedPageContainer */, 859872221F5743AF00041CB8 /* FireAnimation */, 1E162603296840790004127F /* SwiftUI */, 982686AC2600C0850011A8D6 /* ActionMessageView.swift */, @@ -7954,6 +7968,7 @@ 8598D2E32CEB98B500C45685 /* FaviconUserScript.swift in Sources */, 8598D2E42CEB98B500C45685 /* FaviconSourcesProvider.swift in Sources */, BD862E052B30DB250073E2EE /* VPNFeedbackCategory.swift in Sources */, + 317DF60B2D01E7D600DE0145 /* RoundedPageSheetPresentationAnimator.swift in Sources */, 85AE6690209724120014CF04 /* NotificationView.swift in Sources */, BDE91CE02C6515420005CB74 /* UnifiedFeedbackFormViewModel.swift in Sources */, 1EA51376286596A000493C6A /* PrivacyIconLogic.swift in Sources */, @@ -8040,6 +8055,7 @@ BD862E072B30F5E30073E2EE /* VPNFeedbackSender.swift in Sources */, AA4D6A6A23DB87B1007E8790 /* AppIconManager.swift in Sources */, 8563A03C1F9288D600F04442 /* BrowserChromeManager.swift in Sources */, + 317DF6082D01E7B900DE0145 /* RoundedPageSheetContainerViewController.swift in Sources */, 980891A32237146B00313A70 /* Feedback.swift in Sources */, F1D796F01E7B07610019D451 /* BookmarksViewControllerCells.swift in Sources */, 9F9EE4D42C37BB1300D4118E /* OnboardingView+Landing.swift in Sources */, diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index 3e09cddf25..c99718f5bf 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -187,14 +187,14 @@ class MainViewController: UIViewController { var appDidFinishLaunchingStartTime: CFAbsoluteTime? - private lazy var aiChatNavigationController: UINavigationController = { + private lazy var aiChatViewController: AIChatViewController = { let settings = AIChatSettings(privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager, internalUserDecider: AppDependencyProvider.shared.internalUserDecider) let aiChatViewController = AIChatViewController(settings: settings, webViewConfiguration: WKWebViewConfiguration.persistent(), pixelHandler: AIChatPixelHandler()) aiChatViewController.delegate = self - return UINavigationController(rootViewController: aiChatViewController) + return aiChatViewController }() init( @@ -2359,8 +2359,15 @@ extension MainViewController: TabDelegate { } func tabDidRequestAIChat(tab: TabViewController) { - aiChatNavigationController.modalPresentationStyle = .fullScreen - tab.present(aiChatNavigationController, animated: true, completion: nil) + let logoImage = UIImage(named: "Logo") + let title = UserText.aiChatTitle + + let roundedPageSheet = RoundedPageSheetContainerViewController( + contentViewController: aiChatViewController, + logoImage: logoImage, + title: title) + + present(roundedPageSheet, animated: true, completion: nil) } func tabDidRequestBookmarks(tab: TabViewController) { diff --git a/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift b/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift new file mode 100644 index 0000000000..880f474802 --- /dev/null +++ b/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift @@ -0,0 +1,175 @@ +// +// RoundedPageSheetContainerViewController.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +final class RoundedPageSheetContainerViewController: UIViewController { + let contentViewController: UIViewController + private let logoImage: UIImage? + private let titleText: String + + private lazy var titleBarView: TitleBarView = { + let titleBarView = TitleBarView(logoImage: logoImage, title: titleText) { [weak self] in + self?.closeController() + } + return titleBarView + }() + + init(contentViewController: UIViewController, logoImage: UIImage?, title: String) { + self.contentViewController = contentViewController + self.logoImage = logoImage + self.titleText = title + super.init(nibName: nil, bundle: nil) + modalPresentationStyle = .custom + + transitioningDelegate = self + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .black + + setupTitleBar() + setupContentViewController() + } + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + + coordinator.animate(alongsideTransition: { _ in + // Update layout or constraints here + }, completion: nil) + } + + + private func setupTitleBar() { + view.addSubview(titleBarView) + titleBarView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + titleBarView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + titleBarView.leadingAnchor.constraint(equalTo: view.leadingAnchor), + titleBarView.trailingAnchor.constraint(equalTo: view.trailingAnchor), + titleBarView.heightAnchor.constraint(equalToConstant: 44) + ]) + } + + private func setupContentViewController() { + addChild(contentViewController) + view.addSubview(contentViewController.view) + contentViewController.view.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + contentViewController.view.topAnchor.constraint(equalTo: titleBarView.bottomAnchor), // Below the title bar + contentViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), + contentViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + contentViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor) + ]) + + contentViewController.view.layer.cornerRadius = 20 + contentViewController.view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] + contentViewController.view.clipsToBounds = true + + contentViewController.didMove(toParent: self) + } + + @objc func closeController() { + dismiss(animated: true, completion: nil) + } +} + +extension RoundedPageSheetContainerViewController: UIViewControllerTransitioningDelegate { + func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return RoundedPageSheetPresentationAnimator() + } + + func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return RoundedPageSheetDismissalAnimator() + } +} + +final private class TitleBarView: UIView { + private let imageView: UIImageView + private let titleLabel: UILabel + private let closeButton: UIButton + + init(logoImage: UIImage?, title: String, closeAction: @escaping () -> Void) { + imageView = UIImageView(image: logoImage) + titleLabel = UILabel() + closeButton = UIButton(type: .system) + + super.init(frame: .zero) + + setupView(title: title, closeAction: closeAction) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setupView(title: String, closeAction: @escaping () -> Void) { + backgroundColor = .clear + + imageView.contentMode = .scaleAspectFit + imageView.translatesAutoresizingMaskIntoConstraints = false + + let imageSize: CGFloat = 28 + NSLayoutConstraint.activate([ + imageView.widthAnchor.constraint(equalToConstant: imageSize), + imageView.heightAnchor.constraint(equalToConstant: imageSize) + ]) + + titleLabel.text = title + titleLabel.font = UIFont.systemFont(ofSize: 17, weight: .semibold) + titleLabel.textColor = .white + titleLabel.translatesAutoresizingMaskIntoConstraints = false + + closeButton.setImage(UIImage(named: "Close-24"), for: .normal) + closeButton.tintColor = .white + closeButton.translatesAutoresizingMaskIntoConstraints = false + closeButton.addTarget(self, action: #selector(closeButtonTapped), for: .touchUpInside) + + addSubview(imageView) + addSubview(titleLabel) + addSubview(closeButton) + + NSLayoutConstraint.activate([ + imageView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor, constant: 16), + imageView.centerYAnchor.constraint(equalTo: centerYAnchor), + + titleLabel.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 8), + titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor), + + closeButton.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor, constant: -16), + closeButton.centerYAnchor.constraint(equalTo: centerYAnchor) + ]) + + self.closeAction = closeAction + } + + private var closeAction: (() -> Void)? + + @objc private func closeButtonTapped() { + closeAction?() + } +} diff --git a/DuckDuckGo/RoundedPageContainer/RoundedPageSheetPresentationAnimator.swift b/DuckDuckGo/RoundedPageContainer/RoundedPageSheetPresentationAnimator.swift new file mode 100644 index 0000000000..8f5f584591 --- /dev/null +++ b/DuckDuckGo/RoundedPageContainer/RoundedPageSheetPresentationAnimator.swift @@ -0,0 +1,71 @@ +// +// RoundedPageSheetPresentationAnimator.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +enum AnimatorConstants { + static let duration: TimeInterval = 0.4 +} + +class RoundedPageSheetPresentationAnimator: NSObject, UIViewControllerAnimatedTransitioning { + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return AnimatorConstants.duration + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + guard let toViewController = transitionContext.viewController(forKey: .to) as? RoundedPageSheetContainerViewController, + let toView = toViewController.view, + let contentView = toViewController.contentViewController.view else { return } + + let containerView = transitionContext.containerView + + containerView.addSubview(toView) + toView.alpha = 0 + contentView.transform = CGAffineTransform(translationX: 0, y: containerView.bounds.height) + + UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { + toView.alpha = 1 + contentView.transform = .identity + }, completion: { finished in + transitionContext.completeTransition(finished) + }) + } +} + +class RoundedPageSheetDismissalAnimator: NSObject, UIViewControllerAnimatedTransitioning { + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return AnimatorConstants.duration + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + guard let fromViewController = transitionContext.viewController(forKey: .from) as? RoundedPageSheetContainerViewController, + let fromView = fromViewController.view, + let contentView = fromViewController.contentViewController.view else { return } + + let containerView = transitionContext.containerView + + UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { + fromView.alpha = 0 + contentView.transform = CGAffineTransform(translationX: 0, y: containerView.bounds.height) + }, completion: { finished in + fromView.removeFromSuperview() + transitionContext.completeTransition(finished) + }) + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift index 436ec008c8..66d2d46fdb 100644 --- a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift +++ b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift @@ -67,9 +67,6 @@ extension AIChatViewController { public override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .black - - setupNavigationBar() - subscribeToCleanupPublisher() } @@ -84,6 +81,11 @@ extension AIChatViewController { chatModel.cancelTimer() } + public override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + chatModel.startCleanupTimer() + } + public override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() @@ -97,55 +99,6 @@ extension AIChatViewController { // MARK: - Views Setup extension AIChatViewController { - private func setupNavigationBar() { - guard let navigationController = navigationController else { return } - - let appearance = UINavigationBarAppearance() - appearance.configureWithTransparentBackground() - appearance.backgroundColor = .clear - appearance.shadowImage = UIImage() - appearance.shadowColor = .clear - - navigationController.navigationBar.standardAppearance = appearance - navigationController.navigationBar.scrollEdgeAppearance = appearance - navigationController.navigationBar.compactAppearance = appearance - navigationController.navigationBar.isTranslucent = true - - let imageView = UIImageView(image: UIImage(named: "Logo")) - imageView.contentMode = .scaleAspectFit - imageView.translatesAutoresizingMaskIntoConstraints = false - - let imageSize: CGFloat = 28 - NSLayoutConstraint.activate([ - imageView.widthAnchor.constraint(equalToConstant: imageSize), - imageView.heightAnchor.constraint(equalToConstant: imageSize) - ]) - - let titleLabel = UILabel() - titleLabel.text = UserText.aiChatTitle - titleLabel.font = UIFont.systemFont(ofSize: 17, weight: .semibold) - titleLabel.textColor = .white - let stackView = UIStackView(arrangedSubviews: [imageView, titleLabel]) - stackView.axis = .horizontal - stackView.spacing = 8 - stackView.alignment = .center - stackView.distribution = .fill - - navigationItem.leftBarButtonItem = UIBarButtonItem(customView: stackView) - - let closeButton = UIBarButtonItem( - image: UIImage(named: "Close-24"), - style: .plain, - target: self, - action: #selector(closeAIChat) - ) - closeButton.accessibilityIdentifier = "aichat.close.button" - closeButton.tintColor = .white - - navigationItem.rightBarButtonItem = closeButton - } - - private func addWebViewController() { guard webViewController == nil else { return } @@ -158,17 +111,12 @@ extension AIChatViewController { viewController.view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ - viewController.view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), + viewController.view.topAnchor.constraint(equalTo: view.topAnchor), viewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), viewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), viewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor) ]) - viewController.view.backgroundColor = .black - viewController.view.layer.cornerRadius = 20 - viewController.view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner] - viewController.view.clipsToBounds = true - viewController.didMove(toParent: self) } @@ -190,16 +138,10 @@ extension AIChatViewController { self?.timerPixelHandler.markCleanup() } } - - @objc private func closeAIChat() { - chatModel.startCleanupTimer() - dismiss(animated: true) - } } extension AIChatViewController: AIChatWebViewControllerDelegate { func aiChatWebViewController(_ viewController: AIChatWebViewController, didRequestToLoad url: URL) { delegate?.aiChatViewController(self, didRequestToLoad: url) - closeAIChat() } } From 3f4fe385ea616398675944f58066dbf9906c9f28 Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Thu, 5 Dec 2024 13:58:32 -0300 Subject: [PATCH 09/66] Release 7.148.0-3 (#3683) Please make sure all GH checks passed before merging. It can take around 20 minutes. Briefly review this PR to see if there are no issues or red flags and then merge it. --- DuckDuckGo.xcodeproj/project.pbxproj | 56 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index bffe6bd5d8..74b6b91ac4 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9492,7 +9492,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9529,7 +9529,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9619,7 +9619,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9646,7 +9646,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9792,7 +9792,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9816,7 +9816,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9883,7 +9883,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -9917,7 +9917,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9950,7 +9950,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9980,7 +9980,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10369,7 +10369,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10400,7 +10400,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10428,7 +10428,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10461,7 +10461,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10491,7 +10491,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10524,11 +10524,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -10758,7 +10758,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10786,7 +10786,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10818,7 +10818,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10855,7 +10855,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10890,7 +10890,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10925,11 +10925,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11101,11 +11101,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11134,10 +11134,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; From a4f4eb098fd2d072211b808a3aef3fea3099422f Mon Sep 17 00:00:00 2001 From: Alessandro Boron Date: Fri, 6 Dec 2024 11:47:43 +0100 Subject: [PATCH 10/66] Alessandro/onboarding add to dock experiment setup (#3679) Task/Issue URL: https://app.asana.com/0/1206329551987282/1208662187851716/f **Description**: This PR setup the Add to Dock experiment to be prompted from the onboarding flow. --- .../01_control_group_onboarding.yaml | 29 -- ...ing.yaml => 01_onboarding_contextual.yaml} | 3 +- .../02_control_group_hide_onboarding.yaml | 33 -- .../02_onboarding_add_to_dock_intro.yaml | 54 +++ .../03_onboarding_add_to_dock_contextual.yaml | 54 +++ .maestro/shared/onboarding.yaml | 23 +- Core/DefaultVariantManager.swift | 11 +- DuckDuckGo.xcodeproj/project.pbxproj | 8 - DuckDuckGo/DaxDialogs.swift | 167 +------ DuckDuckGo/DaxDialogsSettings.swift | 4 - .../Contents.json | 15 + .../OnboardingBackgroundLight.pdf | Bin 0 -> 64451 bytes DuckDuckGo/HomeRowReminder.swift | 13 +- .../MainViewController+AddFavoriteFlow.swift | 1 + DuckDuckGo/MainViewController+Segues.swift | 19 - DuckDuckGo/MainViewController.swift | 27 +- DuckDuckGo/NewTabPageViewController.swift | 42 +- DuckDuckGo/OnboardingDebugView.swift | 36 +- .../OnboardingView+AddToDockContent.swift | 15 - .../VideoPlayer/VideoPlayerView.swift | 8 +- ...ingAddressBarPositionPickerViewModel.swift | 10 +- .../AppIconPicker/AppIconPicker.swift | 2 - .../Background/OnboardingBackground.swift | 17 +- .../Background/OnboardingGradient.swift | 59 +-- .../BrowsersComparisonModel.swift | 21 +- .../ContextualOnboardingDialogs.swift | 30 +- .../NewTabDaxDialogFactory.swift | 31 +- .../ContextualDaxDialogsFactory.swift | 30 +- .../ContextualOnboardingPresenter.swift | 8 +- .../DefaultVariantManager+Onboarding.swift | 33 -- .../Manager/OnboardingManager.swift | 42 +- .../OnboardingIntroViewModel+Copy.swift | 20 +- .../OnboardingIntroViewModel.swift | 37 +- ...ardingView+AddressBarPositionContent.swift | 5 +- .../OnboardingView+AppIconPickerContent.swift | 7 +- ...ardingView+BrowsersComparisonContent.swift | 2 +- .../OnboardingView+IntroDialogContent.swift | 4 +- .../OnboardingIntro/OnboardingView.swift | 6 - .../Styles/DaxDialogStyles.swift | 30 +- .../OnboardingSuggestedSearchesProvider.swift | 49 +- DuckDuckGo/TabSwitcherViewController.swift | 14 +- DuckDuckGo/TabViewController.swift | 3 - DuckDuckGo/TabsBarViewController.swift | 22 +- DuckDuckGo/UserText.swift | 73 +-- DuckDuckGo/en.lproj/Localizable.strings | 36 -- .../BrowserComparisonModelTests.swift | 102 +--- .../ContextualOnboardingPresenterTests.swift | 74 +-- DuckDuckGoTests/DaxDialogTests.swift | 442 +++++------------- DuckDuckGoTests/DaxDialogsNewTabTests.swift | 1 - ...DefaultVariantManagerOnboardingTests.swift | 117 ----- DuckDuckGoTests/HomeRowReminderTests.swift | 36 ++ .../NewTabPageControllerDaxDialogTests.swift | 56 +-- ...dressBarPositionPickerViewModelTests.swift | 16 +- .../OnboardingDaxFavouritesTests.swift | 36 +- .../OnboardingIntroViewModelTests.swift | 148 +----- DuckDuckGoTests/OnboardingManagerMock.swift | 3 +- DuckDuckGoTests/OnboardingManagerTests.swift | 140 ++---- ...ardingSuggestedSearchesProviderTests.swift | 62 +-- .../TabViewControllerDaxDialogTests.swift | 6 - 59 files changed, 592 insertions(+), 1800 deletions(-) delete mode 100644 .maestro/onboarding_tests/01_control_group_onboarding.yaml rename .maestro/onboarding_tests/{03_experiment_group_linear_onboarding.yaml => 01_onboarding_contextual.yaml} (97%) delete mode 100644 .maestro/onboarding_tests/02_control_group_hide_onboarding.yaml create mode 100644 .maestro/onboarding_tests/02_onboarding_add_to_dock_intro.yaml create mode 100644 .maestro/onboarding_tests/03_onboarding_add_to_dock_contextual.yaml create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/Contents.json create mode 100644 DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/OnboardingBackgroundLight.pdf delete mode 100644 DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift delete mode 100644 DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift diff --git a/.maestro/onboarding_tests/01_control_group_onboarding.yaml b/.maestro/onboarding_tests/01_control_group_onboarding.yaml deleted file mode 100644 index 609254b45a..0000000000 --- a/.maestro/onboarding_tests/01_control_group_onboarding.yaml +++ /dev/null @@ -1,29 +0,0 @@ -appId: com.duckduckgo.mobile.ios -tags: - - onboarding - ---- - -# Set up -- runFlow: - file: ../shared/setup.yaml - env: - ONBOARDING_COMPLETED: "false" - APP_VARIANT: "ma" - -# Load Site -- assertVisible: - id: "searchEntry" -- tapOn: - id: "searchEntry" -- inputText: "https://www.duckduckgo.com" -- pressKey: Enter - -# Handle Onboarding -- assertVisible: "Got It" -- assertVisible: "Hide" -- tapOn: "Got It" -- assertVisible: "Close Tabs and Clear Data" -- tapOn: "Close Tabs and Clear Data" -- tapOn: "Close Tabs and Clear Data" -- assertVisible: "You’ve got this!\n\nRemember: Every time you browse with me, a creepy ad loses its wings. 👍" diff --git a/.maestro/onboarding_tests/03_experiment_group_linear_onboarding.yaml b/.maestro/onboarding_tests/01_onboarding_contextual.yaml similarity index 97% rename from .maestro/onboarding_tests/03_experiment_group_linear_onboarding.yaml rename to .maestro/onboarding_tests/01_onboarding_contextual.yaml index 5a86cdfd17..d5fe31dc01 100644 --- a/.maestro/onboarding_tests/03_experiment_group_linear_onboarding.yaml +++ b/.maestro/onboarding_tests/01_onboarding_contextual.yaml @@ -9,7 +9,7 @@ tags: file: ../shared/setup.yaml env: ONBOARDING_COMPLETED: "false" - APP_VARIANT: "mb" + APP_VARIANT: "mh" # Handle Search Suggestions - assertVisible: "Ready to get started?\nTry a search!" @@ -50,3 +50,4 @@ tags: - assertVisible: "You’ve got this!" - assertVisible: "High five!" - tapOn: "High five!" + diff --git a/.maestro/onboarding_tests/02_control_group_hide_onboarding.yaml b/.maestro/onboarding_tests/02_control_group_hide_onboarding.yaml deleted file mode 100644 index a717b35c3a..0000000000 --- a/.maestro/onboarding_tests/02_control_group_hide_onboarding.yaml +++ /dev/null @@ -1,33 +0,0 @@ -appId: com.duckduckgo.mobile.ios -tags: - - onboarding - ---- - -# Set up -- runFlow: - file: ../shared/setup.yaml - env: - ONBOARDING_COMPLETED: "false" - APP_VARIANT: "ma" - -# Load Site -- assertVisible: - id: "searchEntry" -- tapOn: - id: "searchEntry" -- inputText: "https://www.duckduckgo.com" -- pressKey: Enter - -# Handle Onboarding -- assertVisible: "Got It" -- assertVisible: "Hide" -- tapOn: "Hide" -- assertVisible: "Hide Tips Forever" -- tapOn: "Hide Tips Forever" - -# Handle Fire Button -- assertVisible: "Close Tabs and Clear Data" -- tapOn: "Close Tabs and Clear Data" -- tapOn: "Close Tabs and Clear Data" -- assertNotVisible: "You’ve got this!\n\nRemember: Every time you browse with me, a creepy ad loses its wings. 👍" diff --git a/.maestro/onboarding_tests/02_onboarding_add_to_dock_intro.yaml b/.maestro/onboarding_tests/02_onboarding_add_to_dock_intro.yaml new file mode 100644 index 0000000000..8a354f5707 --- /dev/null +++ b/.maestro/onboarding_tests/02_onboarding_add_to_dock_intro.yaml @@ -0,0 +1,54 @@ +appId: com.duckduckgo.mobile.ios +tags: + - onboarding + +--- + +# Set up +- runFlow: + file: ../shared/setup.yaml + env: + ONBOARDING_COMPLETED: "false" + APP_VARIANT: "mk" + +# Handle Search Suggestions +- assertVisible: "Ready to get started?\nTry a search!" +- assertVisible: "Surprise Me!" +- tapOn: "Surprise Me!" + +# Handle First Dax Dialog +- assertVisible: "That’s DuckDuckGo Search. Private. Fast. Fewer ads." +- assertVisible: "Got It!" +- tapOn: "Got It!" + +# Handle Site Suggestions +- assertVisible: "Next, try visiting a site!" +- assertVisible: "Surprise Me!" +- tapOn: "Surprise Me!" + +# Handle Privacy Dashboard +- assertVisible: "Got It!" +- tapOn: + point: "6%,10%" # Shield icon. +- assertVisible: + text: "View Tracker Companies" +- assertVisible: + text: "Done" +- tapOn: "Done" + +# Handle Fire Message +- assertVisible: "Got It!" +- tapOn: "Got It!" +- assertVisible: "Instantly clear your browsing activity with the Fire Button.\n\nGive it a try! 🔥" + +# Handle Fire Button +- assertVisible: "Close Tabs and Clear Data" +- tapOn: "Close Tabs and Clear Data" +- tapOn: "Close Tabs and Clear Data" + +# Handle End of Journey Dialog +- assertVisible: "You’ve got this!" +- assertVisible: "High five!" +- tapOn: "High five!" + + diff --git a/.maestro/onboarding_tests/03_onboarding_add_to_dock_contextual.yaml b/.maestro/onboarding_tests/03_onboarding_add_to_dock_contextual.yaml new file mode 100644 index 0000000000..967ad2d11d --- /dev/null +++ b/.maestro/onboarding_tests/03_onboarding_add_to_dock_contextual.yaml @@ -0,0 +1,54 @@ +appId: com.duckduckgo.mobile.ios +tags: + - onboarding + +--- + +# Set up +- runFlow: + file: ../shared/setup.yaml + env: + ONBOARDING_COMPLETED: "false" + APP_VARIANT: "mo" + +# Handle Search Suggestions +- assertVisible: "Ready to get started?\nTry a search!" +- assertVisible: "Surprise Me!" +- tapOn: "Surprise Me!" + +# Handle First Dax Dialog +- assertVisible: "That’s DuckDuckGo Search. Private. Fast. Fewer ads." +- assertVisible: "Got It!" +- tapOn: "Got It!" + +# Handle Site Suggestions +- assertVisible: "Next, try visiting a site!" +- assertVisible: "Surprise Me!" +- tapOn: "Surprise Me!" + +# Handle Privacy Dashboard +- assertVisible: "Got It!" +- tapOn: + point: "6%,10%" # Shield icon. +- assertVisible: + text: "View Tracker Companies" +- assertVisible: + text: "Done" +- tapOn: "Done" + +# Handle Fire Message +- assertVisible: "Got It!" +- tapOn: "Got It!" +- assertVisible: "Instantly clear your browsing activity with the Fire Button.\n\nGive it a try! 🔥" + +# Handle Fire Button +- assertVisible: "Close Tabs and Clear Data" +- tapOn: "Close Tabs and Clear Data" +- tapOn: "Close Tabs and Clear Data" + +# Handle End of Journey Dialog +- assertVisible: "Add me to your Dock!" +- assertVisible: "Show Me How" +- tapOn: "Start Browsing" + + diff --git a/.maestro/shared/onboarding.yaml b/.maestro/shared/onboarding.yaml index 2117d4205b..154954b742 100644 --- a/.maestro/shared/onboarding.yaml +++ b/.maestro/shared/onboarding.yaml @@ -10,17 +10,24 @@ appId: com.duckduckgo.mobile.ios text: "Let’s Do It!" index: 0 -# Disabled while UI testing is happening -# - assertVisible: "Make DuckDuckGo your default browser." +# Browser comparison chart +# - assertVisible: "Protections activated!" - tapOn: text: "Skip" +# Add To Dock Flow - runFlow: when: - visible: "Which color looks best on me?" + visible: "Add me to your Dock!" commands: - - assertVisible: "Next" - - tapOn: "Next" - - assertVisible: "Where should I put your address bar?" - - assertVisible: "Next" - - tapOn: "Next" + - assertVisible: "Show Me How" + - tapOn: "Skip" + +# Customization Flow + +- assertVisible: "Which color looks best on me?" +- assertVisible: "Next" +- tapOn: "Next" +- assertVisible: "Where should I put your address bar?" +- assertVisible: "Next" +- tapOn: "Next" diff --git a/Core/DefaultVariantManager.swift b/Core/DefaultVariantManager.swift index 76f0f8475a..8e6748dd41 100644 --- a/Core/DefaultVariantManager.swift +++ b/Core/DefaultVariantManager.swift @@ -27,9 +27,8 @@ extension FeatureName { // Define your feature e.g.: // public static let experimentalFeature = FeatureName(rawValue: "experimentalFeature") - public static let newOnboardingIntro = FeatureName(rawValue: "newOnboardingIntro") - public static let newOnboardingIntroHighlights = FeatureName(rawValue: "newOnboardingIntroHighlights") - public static let contextualDaxDialogs = FeatureName(rawValue: "contextualDaxDialogs") + public static let addToDockIntro = FeatureName(rawValue: "addToDockIntro") + public static let addToDockContextual = FeatureName(rawValue: "addToDockContextual") } public struct VariantIOS: Variant { @@ -58,9 +57,9 @@ public struct VariantIOS: Variant { VariantIOS(name: "sd", weight: doNotAllocate, isIncluded: When.always, features: []), VariantIOS(name: "se", weight: doNotAllocate, isIncluded: When.always, features: []), - VariantIOS(name: "ms", weight: 1, isIncluded: When.always, features: [.newOnboardingIntro]), - VariantIOS(name: "mu", weight: 1, isIncluded: When.always, features: [.newOnboardingIntro, .contextualDaxDialogs]), - VariantIOS(name: "mx", weight: 1, isIncluded: When.always, features: [.newOnboardingIntroHighlights, .contextualDaxDialogs]), + VariantIOS(name: "mh", weight: 1, isIncluded: When.notPadDevice, features: []), + VariantIOS(name: "mk", weight: 1, isIncluded: When.notPadDevice, features: [.addToDockIntro]), + VariantIOS(name: "mo", weight: 1, isIncluded: When.notPadDevice, features: [.addToDockContextual]), returningUser ] diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index c8cfaf060a..158ba01632 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -748,8 +748,6 @@ 98F3A1D8217B37010011A0D4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F3A1D7217B37010011A0D4 /* Theme.swift */; }; 98F6EA472863124100720957 /* ContentBlockerRulesLists.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F6EA462863124100720957 /* ContentBlockerRulesLists.swift */; }; 98F78B8E22419093007CACF4 /* ThemableNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F78B8D22419093007CACF4 /* ThemableNavigationController.swift */; }; - 9F1061652C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1061642C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift */; }; - 9F1623092C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1623082C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift */; }; 9F16230B2CA0F0190093C4FC /* DebouncerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F16230A2CA0F0190093C4FC /* DebouncerTests.swift */; }; 9F1798572CD2443F0073018B /* AddToDockPromoViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F1798562CD2443F0073018B /* AddToDockPromoViewModelTests.swift */; }; 9F23B8012C2BC94400950875 /* OnboardingBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F23B8002C2BC94400950875 /* OnboardingBackground.swift */; }; @@ -2593,8 +2591,6 @@ 98F3A1D7217B37010011A0D4 /* Theme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = ""; }; 98F6EA462863124100720957 /* ContentBlockerRulesLists.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentBlockerRulesLists.swift; sourceTree = ""; }; 98F78B8D22419093007CACF4 /* ThemableNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemableNavigationController.swift; sourceTree = ""; }; - 9F1061642C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DefaultVariantManager+Onboarding.swift"; sourceTree = ""; }; - 9F1623082C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultVariantManagerOnboardingTests.swift; sourceTree = ""; }; 9F16230A2CA0F0190093C4FC /* DebouncerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DebouncerTests.swift; sourceTree = ""; }; 9F1798562CD2443F0073018B /* AddToDockPromoViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddToDockPromoViewModelTests.swift; sourceTree = ""; }; 9F23B8002C2BC94400950875 /* OnboardingBackground.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingBackground.swift; sourceTree = ""; }; @@ -4969,7 +4965,6 @@ 9F7CFF7C2C89B69A0012833E /* AppIconPickerViewModelTests.swift */, 9FDEC7B32C8FD62F00C7A692 /* OnboardingAddressBarPositionPickerViewModelTests.swift */, 9FDEC7B92C9006E000C7A692 /* BrowserComparisonModelTests.swift */, - 9F1623082C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift */, 9F8E0F322CCA642D001EA7C5 /* VideoPlayerViewModelTests.swift */, 9F1798562CD2443F0073018B /* AddToDockPromoViewModelTests.swift */, ); @@ -5129,7 +5124,6 @@ 9F23B7FF2C2BABE000950875 /* OnboardingIntro */, 9F5E5AAA2C3D0FAA00165F54 /* ContextualOnboarding */, 9FCFCD842C75C91A006EB7A0 /* ProgressBarView.swift */, - 9F1061642C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift */, ); path = OnboardingExperiment; sourceTree = ""; @@ -7750,7 +7744,6 @@ 6FBF0F8B2BD7C0A900136CF0 /* AllProtectedCell.swift in Sources */, 9F4CC5242C4A4F0D006A96EB /* SwiftUITestUtilities.swift in Sources */, 6FDC64032C92F4D600DB71B3 /* NewTabPageSettingsPersistentStore.swift in Sources */, - 9F1061652C9C013F008DD5A0 /* DefaultVariantManager+Onboarding.swift in Sources */, 1E4F4A5A297193DE00625985 /* MainViewController+CookiesManaged.swift in Sources */, C12324C32C4697C900FBB26B /* AutofillBreakageReportTableViewCell.swift in Sources */, 8586A10D24CBA7070049720E /* FindInPageActivity.swift in Sources */, @@ -8292,7 +8285,6 @@ 987130C7294AAB9F00AB05E0 /* MenuBookmarksViewModelTests.swift in Sources */, D6B9E8D42CDA8375002B640C /* DuckPlayerOverlayUsagePixelsTests.swift in Sources */, 858650D32469BFAD00C36F8A /* DaxDialogTests.swift in Sources */, - 9F1623092C9D14F10093C4FC /* DefaultVariantManagerOnboardingTests.swift in Sources */, 31C138B227A4097800FFD4B2 /* DownloadTestsHelper.swift in Sources */, 1E1D8B5D2994FFE100C96994 /* AutoconsentMessageProtocolTests.swift in Sources */, 85C11E532090B23A00BFFEB4 /* UserDefaultsHomeRowReminderStorageTests.swift in Sources */, diff --git a/DuckDuckGo/DaxDialogs.swift b/DuckDuckGo/DaxDialogs.swift index d1d30b9e3a..f8b4181f93 100644 --- a/DuckDuckGo/DaxDialogs.swift +++ b/DuckDuckGo/DaxDialogs.swift @@ -31,7 +31,6 @@ protocol EntityProviding { } protocol NewTabDialogSpecProvider { - func nextHomeScreenMessage() -> DaxDialogs.HomeScreenSpec? func nextHomeScreenMessageNew() -> DaxDialogs.HomeScreenSpec? func dismiss() } @@ -50,7 +49,6 @@ protocol ContextualOnboardingLogic { func setPrivacyButtonPulseSeen() func setDaxDialogDismiss() - func canEnableAddFavoriteFlow() -> Bool // Temporary during Contextual Onboarding Experiment func enableAddFavoriteFlow() } @@ -144,14 +142,14 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { highlightAddressBar: false, pixelName: .daxDialogsSiteOwnedByMajorUnique, type: .siteOwnedByMajorTracker) - static let withOneTracker = BrowsingSpec(message: UserText.daxDialogBrowsingWithOneTracker, + static let withOneTracker = BrowsingSpec(message: UserText.Onboarding.ContextualOnboarding.daxDialogBrowsingWithOneTracker, cta: UserText.daxDialogBrowsingWithOneTrackerCTA, - highlightAddressBar: true, + highlightAddressBar: false, pixelName: .daxDialogsWithTrackersUnique, type: .withOneTracker) - static let withMultipleTrackers = BrowsingSpec(message: UserText.daxDialogBrowsingWithMultipleTrackers, + static let withMultipleTrackers = BrowsingSpec(message: UserText.Onboarding.ContextualOnboarding.daxDialogBrowsingWithMultipleTrackers, cta: UserText.daxDialogBrowsingWithMultipleTrackersCTA, - highlightAddressBar: true, + highlightAddressBar: false, pixelName: .daxDialogsWithTrackersUnique, type: .withMultipleTrackers) // Message and CTA empty on purpose as for this case we use only pixelName and type @@ -233,10 +231,6 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { self.addToDockManager = onboardingManager } - private var isNewOnboarding: Bool { - variantManager.isContextualDaxDialogsEnabled - } - private var firstBrowsingMessageSeen: Bool { return settings.browsingAfterSearchShown || settings.browsingWithTrackersShown @@ -272,17 +266,14 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { } var isShowingSearchSuggestions: Bool { - guard isNewOnboarding else { return false } return currentHomeSpec == .initial } var isShowingSitesSuggestions: Bool { - guard isNewOnboarding else { return false } return lastShownDaxDialogType.flatMap(BrowsingSpec.SpecType.init(rawValue:)) == .visitWebsite || currentHomeSpec == .subsequent } var isShowingAddToDockDialog: Bool { - guard isNewOnboarding else { return false } return currentHomeSpec == .final && addToDockManager.addToDockEnabledState == .contextual } @@ -293,7 +284,7 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { } var isShowingFireDialog: Bool { - guard isNewOnboarding, let lastShownDaxDialogType else { return false } + guard let lastShownDaxDialogType else { return false } return BrowsingSpec.SpecType(rawValue: lastShownDaxDialogType) == .fire } @@ -302,25 +293,16 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { } var shouldShowFireButtonPulse: Bool { - if isNewOnboarding { - // Show fire the user hasn't seen the fire education dialog or the fire button has not animated before. - nonDDGBrowsingMessageSeen && (!settings.fireMessageExperimentShown && settings.fireButtonPulseDateShown == nil) && isEnabled - } else { - nonDDGBrowsingMessageSeen && !settings.fireButtonEducationShownOrExpired && isEnabled - } + // Show fire the user hasn't seen the fire education dialog or the fire button has not animated before. + nonDDGBrowsingMessageSeen && (!settings.fireMessageExperimentShown && settings.fireButtonPulseDateShown == nil) && isEnabled } var shouldShowPrivacyButtonPulse: Bool { - guard isNewOnboarding else { return false } return settings.browsingWithTrackersShown && !settings.privacyButtonPulseShown && fireButtonPulseTimer == nil && isEnabled } func isStillOnboarding() -> Bool { - if isNewOnboarding { - if peekNextHomeScreenMessageExperiment() != nil { - return true - } - } else if peekNextHomeScreenMessage() != nil { + if peekNextHomeScreenMessageExperiment() != nil { return true } return false @@ -336,16 +318,8 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { settings.isDismissed = false } - func canEnableAddFavoriteFlow() -> Bool { - !isNewOnboarding - } - func enableAddFavoriteFlow() { - guard canEnableAddFavoriteFlow() else { return } - nextHomeScreenMessageOverride = .addFavorite - // Progress to next home screen message, but don't re-show the second dax dialog if it's already been shown - settings.homeScreenMessagesSeen = max(settings.homeScreenMessagesSeen, 1) } func resumeRegularFlow() { @@ -360,22 +334,19 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { private static let timeToFireButtonExpire: TimeInterval = 1 * 60 * 60 private var lastVisitedOnboardingWebsiteURLPath: String? { - guard isNewOnboarding else { return nil } return settings.lastVisitedOnboardingWebsiteURLPath } private func saveLastVisitedOnboardingWebsite(url: URL?) { - guard isNewOnboarding, let url = url else { return } + guard let url = url else { return } settings.lastVisitedOnboardingWebsiteURLPath = url.absoluteString } private func removeLastVisitedOnboardingWebsite() { - guard isNewOnboarding else { return } settings.lastVisitedOnboardingWebsiteURLPath = nil } private var lastShownDaxDialogType: String? { - guard isNewOnboarding else { return nil } return settings.lastShownContextualOnboardingDialogType } @@ -384,12 +355,10 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { } private func saveLastShownDaxDialog(specType: BrowsingSpec.SpecType) { - guard isNewOnboarding else { return } settings.lastShownContextualOnboardingDialogType = specType.rawValue } private func removeLastShownDaxDialog() { - guard isNewOnboarding else { return } settings.lastShownContextualOnboardingDialogType = nil } @@ -404,13 +373,13 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { return BrowsingSpec.withoutTrackers case BrowsingSpec.SpecType.siteIsMajorTracker.rawValue: guard let host = privacyInfo.domain else { return nil } - return majorTrackerMessage(host) + return majorTrackerMessage(host, isReloadingDialog: true) case BrowsingSpec.SpecType.siteOwnedByMajorTracker.rawValue: guard let host = privacyInfo.domain, let owner = isOwnedByFacebookOrGoogle(host) else { return nil } - return majorTrackerOwnerMessage(host, owner) + return majorTrackerOwnerMessage(host, owner, isReloadingDialog: true) case BrowsingSpec.SpecType.withOneTracker.rawValue, BrowsingSpec.SpecType.withMultipleTrackers.rawValue: guard let entityNames = blockedEntityNames(privacyInfo.trackerInfo) else { return nil } - return trackersBlockedMessage(entityNames) + return trackersBlockedMessage(entityNames, isReloadingDialog: true) case BrowsingSpec.SpecType.fire.rawValue: return .fire case BrowsingSpec.SpecType.final.rawValue: @@ -439,20 +408,12 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { fireButtonPulseTimer?.invalidate() settings.fireButtonEducationShownOrExpired = true } - - func fireButtonEducationMessage() -> ActionSheetSpec? { - guard shouldShowFireButtonPulse else { return nil } - settings.fireButtonEducationShownOrExpired = true - return ActionSheetSpec.fireButtonEducation - } func setSearchMessageSeen() { - guard isNewOnboarding else { return } saveLastShownDaxDialog(specType: .visitWebsite) } func setFireEducationMessageSeen() { - guard isNewOnboarding else { return } // Set also privacy button pulse seen as we don't have to show anymore if we saw the fire educational message. settings.privacyButtonPulseShown = true settings.fireMessageExperimentShown = true @@ -460,35 +421,24 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { } func clearedBrowserData() { - guard isNewOnboarding else { return } setDaxDialogDismiss() } func setPrivacyButtonPulseSeen() { - guard isNewOnboarding else { return } settings.privacyButtonPulseShown = true } func setDaxDialogDismiss() { - guard isNewOnboarding else { return } clearOnboardingBrowsingData() } func setFinalOnboardingDialogSeen() { - guard isNewOnboarding else { return } settings.browsingFinalDialogShown = true } func nextBrowsingMessageIfShouldShow(for privacyInfo: PrivacyInfo) -> BrowsingSpec? { - var message: BrowsingSpec? - if isNewOnboarding { - message = nextBrowsingMessageExperiment(privacyInfo: privacyInfo) - } else { - guard privacyInfo.url != lastURLDaxDialogReturnedFor else { return nil } - message = nextBrowsingMessage(privacyInfo: privacyInfo) - } - + let message = nextBrowsingMessageExperiment(privacyInfo: privacyInfo) if message != nil { lastURLDaxDialogReturnedFor = privacyInfo.url } @@ -496,32 +446,6 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { return message } - private func nextBrowsingMessage(privacyInfo: PrivacyInfo) -> BrowsingSpec? { - guard isEnabled, nextHomeScreenMessageOverride == nil else { return nil } - guard let host = privacyInfo.domain else { return nil } - - if privacyInfo.url.isDuckDuckGoSearch { - return searchMessage() - } - - // won't be shown if owned by major tracker message has already been shown - if isFacebookOrGoogle(privacyInfo.url) { - return majorTrackerMessage(host) - } - - // won't be shown if major tracker message has already been shown - if let owner = isOwnedByFacebookOrGoogle(host) { - return majorTrackerOwnerMessage(host, owner) - } - - if let entityNames = blockedEntityNames(privacyInfo.trackerInfo) { - return trackersBlockedMessage(entityNames) - } - - // only shown if first time on a non-ddg page and none of the non-ddg messages shown - return noTrackersMessage() - } - private func nextBrowsingMessageExperiment(privacyInfo: PrivacyInfo) -> BrowsingSpec? { func hasTrackers(host: String) -> Bool { @@ -546,12 +470,12 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { spec = searchMessage() } else if isFacebookOrGoogle(privacyInfo.url) && shouldShowNetworkTrackerDialog { // won't be shown if owned by major tracker message has already been shown - spec = majorTrackerMessage(host) + spec = majorTrackerMessage(host, isReloadingDialog: false) } else if let owner = isOwnedByFacebookOrGoogle(host), shouldShowNetworkTrackerDialog { // won't be shown if major tracker message has already been shown - spec = majorTrackerOwnerMessage(host, owner) + spec = majorTrackerOwnerMessage(host, owner, isReloadingDialog: false) } else if let entityNames = blockedEntityNames(privacyInfo.trackerInfo), !settings.browsingWithTrackersShown { - spec = trackersBlockedMessage(entityNames) + spec = trackersBlockedMessage(entityNames, isReloadingDialog: false) } else if !settings.browsingWithoutTrackersShown && !privacyInfo.url.isDuckDuckGoSearch && !hasTrackers(host: host) { // if non duck duck go search and no trackers found and no tracker message already shown, show no trackers message spec = noTrackersMessage() @@ -570,16 +494,6 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { return spec } - func nextHomeScreenMessage() -> HomeScreenSpec? { - guard let homeScreenSpec = peekNextHomeScreenMessage() else { return nil } - - if homeScreenSpec != nextHomeScreenMessageOverride { - settings.homeScreenMessagesSeen += 1 - } - - return homeScreenSpec - } - func nextHomeScreenMessageNew() -> HomeScreenSpec? { // Reset the last browsing information when opening a new tab so loading the previous website won't show again the Dax dialog clearedBrowserData() @@ -592,25 +506,6 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { return homeScreenSpec } - private func peekNextHomeScreenMessage() -> HomeScreenSpec? { - if nextHomeScreenMessageOverride != nil { - return nextHomeScreenMessageOverride - } - - guard isEnabled else { return nil } - guard settings.homeScreenMessagesSeen < Constants.homeScreenMessagesSeenMaxCeiling else { return nil } - - if settings.homeScreenMessagesSeen == 0 { - return .initial - } - - if firstBrowsingMessageSeen { - return .final - } - - return nil - } - private func peekNextHomeScreenMessageExperiment() -> HomeScreenSpec? { if nextHomeScreenMessageOverride != nil { return nextHomeScreenMessageOverride @@ -645,9 +540,9 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { return nil } - func majorTrackerOwnerMessage(_ host: String, _ majorTrackerEntity: Entity) -> DaxDialogs.BrowsingSpec? { - if !isNewOnboarding && settings.browsingMajorTrackingSiteShown { return nil } - + func majorTrackerOwnerMessage(_ host: String, _ majorTrackerEntity: Entity, isReloadingDialog: Bool) -> DaxDialogs.BrowsingSpec? { + if !isReloadingDialog && settings.browsingMajorTrackingSiteShown { return nil } + guard let entityName = majorTrackerEntity.displayName, let entityPrevalence = majorTrackerEntity.prevalence else { return nil } settings.browsingMajorTrackingSiteShown = true @@ -657,8 +552,8 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { entityPrevalence) } - private func majorTrackerMessage(_ host: String) -> DaxDialogs.BrowsingSpec? { - if !isNewOnboarding && settings.browsingMajorTrackingSiteShown { return nil } + private func majorTrackerMessage(_ host: String, isReloadingDialog: Bool) -> DaxDialogs.BrowsingSpec? { + if !isReloadingDialog && settings.browsingMajorTrackingSiteShown { return nil } guard let entityName = entityProviding.entity(forHost: host)?.displayName else { return nil } settings.browsingMajorTrackingSiteShown = true @@ -677,8 +572,8 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { return BrowsingSpec.final } - private func trackersBlockedMessage(_ entitiesBlocked: [String]) -> BrowsingSpec? { - if !isNewOnboarding && settings.browsingWithTrackersShown { return nil } + private func trackersBlockedMessage(_ entitiesBlocked: [String], isReloadingDialog: Bool) -> BrowsingSpec? { + if !isReloadingDialog && settings.browsingWithTrackersShown { return nil } var spec: BrowsingSpec? switch entitiesBlocked.count { @@ -689,24 +584,12 @@ final class DaxDialogs: NewTabDialogSpecProvider, ContextualOnboardingLogic { case 1: settings.browsingWithTrackersShown = true let args = entitiesBlocked[0] - spec = if isNewOnboarding { - BrowsingSpec.withOneTracker.format(message: UserText.DaxOnboardingExperiment.ContextualOnboarding.daxDialogBrowsingWithOneTracker, args: args) - } else { - BrowsingSpec.withOneTracker.format(args: args) - } + spec = BrowsingSpec.withOneTracker.format(message: UserText.Onboarding.ContextualOnboarding.daxDialogBrowsingWithOneTracker, args: args) default: settings.browsingWithTrackersShown = true let args: [CVarArg] = [entitiesBlocked.count - 2, entitiesBlocked[0], entitiesBlocked[1]] - spec = if isNewOnboarding { - BrowsingSpec.withMultipleTrackers.format(message: UserText.DaxOnboardingExperiment.ContextualOnboarding.daxDialogBrowsingWithMultipleTrackers, args: args) - } else { - BrowsingSpec.withMultipleTrackers.format(args: args) - } - } - // New Contextual onboarding doesn't highlight the address bar. This checks prevents to cancel the lottie animation. - if isNewOnboarding { - spec?.highlightAddressBar = false + spec = BrowsingSpec.withMultipleTrackers.format(message: UserText.Onboarding.ContextualOnboarding.daxDialogBrowsingWithMultipleTrackers, args: args) } return spec } diff --git a/DuckDuckGo/DaxDialogsSettings.swift b/DuckDuckGo/DaxDialogsSettings.swift index 960b63013a..63be0c9973 100644 --- a/DuckDuckGo/DaxDialogsSettings.swift +++ b/DuckDuckGo/DaxDialogsSettings.swift @@ -23,8 +23,6 @@ protocol DaxDialogsSettings { var isDismissed: Bool { get set } - var homeScreenMessagesSeen: Int { get set } - var browsingAfterSearchShown: Bool { get set } var browsingWithTrackersShown: Bool { get set } @@ -96,8 +94,6 @@ class InMemoryDaxDialogsSettings: DaxDialogsSettings { var isDismissed: Bool = false - var homeScreenMessagesSeen: Int = 0 - var browsingAfterSearchShown: Bool = false var browsingWithTrackersShown: Bool = false diff --git a/DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/Contents.json b/DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/Contents.json new file mode 100644 index 0000000000..5a553e162d --- /dev/null +++ b/DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "OnboardingBackgroundLight.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true + } +} diff --git a/DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/OnboardingBackgroundLight.pdf b/DuckDuckGo/DaxOnboarding.xcassets/OnboardingGradientLight.imageset/OnboardingBackgroundLight.pdf new file mode 100644 index 0000000000000000000000000000000000000000..24684a0c471d5df8957c228b8d0f3bd98532e9c1 GIT binary patch literal 64451 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/HomeRowReminder.swift b/DuckDuckGo/HomeRowReminder.swift index 7d0ced914e..7c8a1c95ed 100644 --- a/DuckDuckGo/HomeRowReminder.swift +++ b/DuckDuckGo/HomeRowReminder.swift @@ -18,6 +18,7 @@ // import Core +import BrowserServicesKit protocol HomeRowReminderStorage { @@ -36,14 +37,22 @@ class HomeRowReminder { private var storage: HomeRowReminderStorage private var homeMessageStorage: HomeMessageStorage + private let variantManager: VariantManager - init(storage: HomeRowReminderStorage = UserDefaultsHomeRowReminderStorage(), - homeMessageStorage: HomeMessageStorage = HomeMessageStorage()) { + init( + storage: HomeRowReminderStorage = UserDefaultsHomeRowReminderStorage(), + homeMessageStorage: HomeMessageStorage = HomeMessageStorage(), + variantManager: VariantManager = DefaultVariantManager() + ) { self.storage = storage self.homeMessageStorage = homeMessageStorage + self.variantManager = variantManager } func showNow() -> Bool { + // If user saw Add to Dock instruction during onboarding do not show the reminder. + guard !(variantManager.isSupported(feature: .addToDockIntro) || variantManager.isSupported(feature: .addToDockContextual)) else { return false } + guard !hasShownBefore() else { return false } guard hasReminderTimeElapsed else { return false } return true diff --git a/DuckDuckGo/MainViewController+AddFavoriteFlow.swift b/DuckDuckGo/MainViewController+AddFavoriteFlow.swift index 78e47a03c6..8231cc52bc 100644 --- a/DuckDuckGo/MainViewController+AddFavoriteFlow.swift +++ b/DuckDuckGo/MainViewController+AddFavoriteFlow.swift @@ -48,6 +48,7 @@ extension MainViewController { guard canDisplayAddFavoriteVisualIndicator, let window = view.window, presentedViewController == nil else { return } DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + guard self.canDisplayAddFavoriteVisualIndicator else { return } ViewHighlighter.hideAll() ViewHighlighter.showIn(window, focussedOnView: self.presentedMenuButton) } diff --git a/DuckDuckGo/MainViewController+Segues.swift b/DuckDuckGo/MainViewController+Segues.swift index beee686007..2ca6573a8a 100644 --- a/DuckDuckGo/MainViewController+Segues.swift +++ b/DuckDuckGo/MainViewController+Segues.swift @@ -98,25 +98,6 @@ extension MainViewController { } } - func segueToActionSheetDaxDialogWithSpec(_ spec: DaxDialogs.ActionSheetSpec) { - Logger.lifecycle.debug(#function) - hideAllHighlightsIfNeeded() - - if spec == DaxDialogs.ActionSheetSpec.fireButtonEducation { - ViewHighlighter.hideAll() - } - - let storyboard = UIStoryboard(name: "DaxOnboarding", bundle: nil) - let controller = storyboard.instantiateViewController(identifier: "ActionSheetDaxDialog", creator: { coder in - ActionSheetDaxDialogViewController(coder: coder) - }) - controller.spec = spec - controller.delegate = self - controller.modalTransitionStyle = .crossDissolve - controller.modalPresentationStyle = .overFullScreen - present(controller, animated: true) - } - func segueToReportBrokenSite(entryPoint: PrivacyDashboardEntryPoint = .report) { Logger.lifecycle.debug(#function) hideAllHighlightsIfNeeded() diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index e5b54dca00..2ee59fc07f 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -477,12 +477,6 @@ class MainViewController: UIViewController { } func startAddFavoriteFlow() { - // Disable add favourite flow when new onboarding experiment is running and open a new tab. - guard contextualOnboardingLogic.canEnableAddFavoriteFlow() else { - newTab() - return - } - contextualOnboardingLogic.enableAddFavoriteFlow() if tutorialSettings.hasSeenOnboarding { newTab() @@ -877,18 +871,10 @@ class MainViewController: UIViewController { hideNotificationBarIfBrokenSitePromptShown() wakeLazyFireButtonAnimator() - if variantManager.isContextualDaxDialogsEnabled { - // Dismiss dax dialog and pulse animation when the user taps on the Fire Button. - currentTab?.dismissContextualDaxFireDialog() - ViewHighlighter.hideAll() - showClearDataAlert() - } else { - if let spec = DaxDialogs.shared.fireButtonEducationMessage() { - segueToActionSheetDaxDialogWithSpec(spec) - } else { - showClearDataAlert() - } - } + // Dismiss dax dialog and pulse animation when the user taps on the Fire Button. + currentTab?.dismissContextualDaxFireDialog() + ViewHighlighter.hideAll() + showClearDataAlert() performCancel() } @@ -2757,9 +2743,8 @@ extension MainViewController: AutoClearWorker { self.showKeyboardAfterFireButton = showKeyboardAfterFireButton } - if self.variantManager.isContextualDaxDialogsEnabled { - DaxDialogs.shared.clearedBrowserData() - } + DaxDialogs.shared.clearedBrowserData() + } } diff --git a/DuckDuckGo/NewTabPageViewController.swift b/DuckDuckGo/NewTabPageViewController.swift index 02c0009e75..a9ebe988a0 100644 --- a/DuckDuckGo/NewTabPageViewController.swift +++ b/DuckDuckGo/NewTabPageViewController.swift @@ -210,11 +210,6 @@ final class NewTabPageViewController: UIHostingController, NewTabPage { self.launchNewSearch() } } - - if !variantManager.isContextualDaxDialogsEnabled { - // In the new onboarding this gets called twice (viewDidAppear in Tab) which then reset the spec to nil. - presentNextDaxDialog() - } } func dismiss() { @@ -239,11 +234,7 @@ final class NewTabPageViewController: UIHostingController, NewTabPage { // MARK: - Onboarding private func presentNextDaxDialog() { - if variantManager.isContextualDaxDialogsEnabled { - showNextDaxDialogNew(dialogProvider: newTabDialogTypeProvider, factory: newTabDialogFactory) - } else { - showNextDaxDialog(dialogProvider: newTabDialogTypeProvider) - } + showNextDaxDialogNew(dialogProvider: newTabDialogTypeProvider, factory: newTabDialogFactory) } // MARK: - Private @@ -280,37 +271,6 @@ extension NewTabPageViewController: HomeScreenTransitionSource { extension NewTabPageViewController { - func showNextDaxDialog(dialogProvider: NewTabDialogSpecProvider) { - guard let spec = dialogProvider.nextHomeScreenMessage() else { return } - guard !isDaxDialogVisible else { return } - guard let daxDialogViewController = daxDialogViewController else { return } - - newTabPageViewModel.startOnboarding() - - daxDialogViewController.view.isHidden = false - daxDialogViewController.view.alpha = 0.0 - - daxDialogViewController.loadViewIfNeeded() - daxDialogViewController.message = spec.message - daxDialogViewController.accessibleMessage = spec.accessibilityLabel - - if spec == .initial { - UniquePixel.fire(pixel: .onboardingContextualTryVisitSiteUnique, includedParameters: [.appVersion, .atb]) - } - - view.addGestureRecognizer(daxDialogViewController.tapToCompleteGestureRecognizer) - - daxDialogHeightConstraint?.constant = daxDialogViewController.calculateHeight() - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - UIView.animate(withDuration: 0.4, animations: { - daxDialogViewController.view.alpha = 1.0 - }, completion: { _ in - daxDialogViewController.start() - }) - } - } - func showNextDaxDialogNew(dialogProvider: NewTabDialogSpecProvider, factory: any NewTabDaxDialogProvider) { dismissHostingController(didFinishNTPOnboarding: false) diff --git a/DuckDuckGo/OnboardingDebugView.swift b/DuckDuckGo/OnboardingDebugView.swift index f6528aea25..93c4ad3ba2 100644 --- a/DuckDuckGo/OnboardingDebugView.swift +++ b/DuckDuckGo/OnboardingDebugView.swift @@ -32,19 +32,6 @@ struct OnboardingDebugView: View { var body: some View { List { - Section { - Toggle( - isOn: $viewModel.isOnboardingHighlightsLocalFlagEnabled, - label: { - Text(verbatim: "Onboarding Highlights local setting enabled") - } - ) - } header: { - Text(verbatim: "Onboarding Higlights settings") - } footer: { - Text(verbatim: "Requires internal user flag set to have an effect.") - } - Section { Picker( selection: $viewModel.onboardingAddToDockLocalFlagState, @@ -57,10 +44,11 @@ struct OnboardingDebugView: View { Text(verbatim: "Onboarding Add to Dock local setting enabled") } ) + .disabled(!viewModel.isIphone) } header: { Text(verbatim: "Onboarding Add to Dock settings") } footer: { - Text(verbatim: "Requires internal user flag set to have an effect.") + Text(verbatim: viewModel.isIphone ? "Requires internal user flag set to have an effect." : "Requires internal user flag set to have an effect. iPhone only feature.") } Section { @@ -77,8 +65,7 @@ struct OnboardingDebugView: View { Section { Button(action: newOnboardingIntroStartAction, label: { - let onboardingType = viewModel.isOnboardingHighlightsLocalFlagEnabled ? "Highlights" : "" - Text(verbatim: "Preview New Onboarding Intro \(onboardingType)") + Text(verbatim: "Preview Onboarding Intro") }) } } @@ -86,11 +73,6 @@ struct OnboardingDebugView: View { } final class OnboardingDebugViewModel: ObservableObject { - @Published var isOnboardingHighlightsLocalFlagEnabled: Bool { - didSet { - manager.isOnboardingHighlightsLocalFlagEnabled = isOnboardingHighlightsLocalFlagEnabled - } - } @Published var onboardingAddToDockLocalFlagState: OnboardingAddToDockState { didSet { @@ -98,19 +80,23 @@ final class OnboardingDebugViewModel: ObservableObject { } } - private let manager: OnboardingHighlightsDebugging & OnboardingAddToDockDebugging + private let manager: OnboardingAddToDockDebugging private var settings: DaxDialogsSettings + let isIphone: Bool - init(manager: OnboardingHighlightsDebugging & OnboardingAddToDockDebugging = OnboardingManager(), settings: DaxDialogsSettings = DefaultDaxDialogsSettings()) { + init( + manager: OnboardingAddToDockDebugging = OnboardingManager(), + settings: DaxDialogsSettings = DefaultDaxDialogsSettings(), + isIphone: Bool = UIDevice.current.userInterfaceIdiom == .phone + ) { self.manager = manager self.settings = settings - isOnboardingHighlightsLocalFlagEnabled = manager.isOnboardingHighlightsLocalFlagEnabled + self.isIphone = isIphone onboardingAddToDockLocalFlagState = manager.addToDockLocalFlagState } func resetDaxDialogs() { settings.isDismissed = false - settings.homeScreenMessagesSeen = 0 settings.browsingAfterSearchShown = false settings.browsingWithTrackersShown = false settings.browsingWithoutTrackersShown = false diff --git a/DuckDuckGo/OnboardingExperiment/AddToDock/OnboardingView+AddToDockContent.swift b/DuckDuckGo/OnboardingExperiment/AddToDock/OnboardingView+AddToDockContent.swift index c1311dec7f..af74e72b42 100644 --- a/DuckDuckGo/OnboardingExperiment/AddToDock/OnboardingView+AddToDockContent.swift +++ b/DuckDuckGo/OnboardingExperiment/AddToDock/OnboardingView+AddToDockContent.swift @@ -22,32 +22,17 @@ import Onboarding extension OnboardingView { - struct AddToDockPromoContentState { - var animateTitle = true - var animateMessage = false - var showContent = false - } - struct AddToDockPromoContent: View { @State private var showAddToDockTutorial = false - private var animateTitle: Binding - private var animateMessage: Binding - private var showContent: Binding private let showTutorialAction: () -> Void private let dismissAction: (_ fromAddToDock: Bool) -> Void init( - animateTitle: Binding = .constant(true), - animateMessage: Binding = .constant(true), - showContent: Binding = .constant(false), showTutorialAction: @escaping () -> Void, dismissAction: @escaping (_ fromAddToDock: Bool) -> Void ) { - self.animateTitle = animateTitle - self.animateMessage = animateMessage - self.showContent = showContent self.showTutorialAction = showTutorialAction self.dismissAction = dismissAction } diff --git a/DuckDuckGo/OnboardingExperiment/AddToDock/VideoPlayer/VideoPlayerView.swift b/DuckDuckGo/OnboardingExperiment/AddToDock/VideoPlayer/VideoPlayerView.swift index c840bb7555..ea8fccf72a 100644 --- a/DuckDuckGo/OnboardingExperiment/AddToDock/VideoPlayer/VideoPlayerView.swift +++ b/DuckDuckGo/OnboardingExperiment/AddToDock/VideoPlayer/VideoPlayerView.swift @@ -24,7 +24,7 @@ struct VideoPlayerView: View { @ObservedObject private var model: VideoPlayerViewModel - private var isPlaying: Binding + private var isPlaying: Binding init(model: VideoPlayerViewModel, isPlaying: Binding = .constant(true)) { self.model = model @@ -41,6 +41,12 @@ struct VideoPlayerView: View { model.pause() } } + .onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification), perform: { _ in + isPlaying.wrappedValue = false + }) + .onReceive(NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification)) { _ in + isPlaying.wrappedValue = true + } } } diff --git a/DuckDuckGo/OnboardingExperiment/AddressBarPositionPicker/OnboardingAddressBarPositionPickerViewModel.swift b/DuckDuckGo/OnboardingExperiment/AddressBarPositionPicker/OnboardingAddressBarPositionPickerViewModel.swift index 595fb5c061..5bfe88fcae 100644 --- a/DuckDuckGo/OnboardingExperiment/AddressBarPositionPicker/OnboardingAddressBarPositionPickerViewModel.swift +++ b/DuckDuckGo/OnboardingExperiment/AddressBarPositionPicker/OnboardingAddressBarPositionPickerViewModel.swift @@ -74,22 +74,22 @@ private extension AddressBarPosition { var titleAndMessage: (title: NSAttributedString, message: String) { switch self { case .top: - let firstPart = NSAttributedString(string: UserText.HighlightsOnboardingExperiment.AddressBarPosition.topTitle) + let firstPart = NSAttributedString(string: UserText.Onboarding.AddressBarPosition.topTitle) .withFont(UIFont.daxBodyBold()) .withTextColor(UIColor.label) - let secondPart = NSAttributedString(string: UserText.HighlightsOnboardingExperiment.AddressBarPosition.defaultOption) + let secondPart = NSAttributedString(string: UserText.Onboarding.AddressBarPosition.defaultOption) .withFont(UIFont.daxBodyRegular()) .withTextColor(UIColor.secondaryLabel) return ( firstPart + " " + secondPart, - UserText.HighlightsOnboardingExperiment.AddressBarPosition.topMessage + UserText.Onboarding.AddressBarPosition.topMessage ) case .bottom: return ( - NSAttributedString(string: UserText.HighlightsOnboardingExperiment.AddressBarPosition.bottomTitle) + NSAttributedString(string: UserText.Onboarding.AddressBarPosition.bottomTitle) .withFont(UIFont.daxBodyBold()), - UserText.HighlightsOnboardingExperiment.AddressBarPosition.bottomMessage + UserText.Onboarding.AddressBarPosition.bottomMessage ) } } diff --git a/DuckDuckGo/OnboardingExperiment/AppIconPicker/AppIconPicker.swift b/DuckDuckGo/OnboardingExperiment/AppIconPicker/AppIconPicker.swift index 2d1dd5ea4d..6fbb17708a 100644 --- a/DuckDuckGo/OnboardingExperiment/AppIconPicker/AppIconPicker.swift +++ b/DuckDuckGo/OnboardingExperiment/AppIconPicker/AppIconPicker.swift @@ -30,8 +30,6 @@ private enum Metrics { } struct AppIconPicker: View { - @Environment(\.colorScheme) private var color - @StateObject private var viewModel = AppIconPickerViewModel() let layout = [GridItem(.adaptive(minimum: Metrics.iconSize), spacing: Metrics.spacing, alignment: .leading)] diff --git a/DuckDuckGo/OnboardingExperiment/Background/OnboardingBackground.swift b/DuckDuckGo/OnboardingExperiment/Background/OnboardingBackground.swift index 7e5b6fb531..b1dcdc5ddd 100644 --- a/DuckDuckGo/OnboardingExperiment/Background/OnboardingBackground.swift +++ b/DuckDuckGo/OnboardingExperiment/Background/OnboardingBackground.swift @@ -20,7 +20,6 @@ import SwiftUI struct OnboardingBackground: View { - @Environment(\.onboardingGradientType) private var gradientType @Environment(\.verticalSizeClass) private var vSizeClass @Environment(\.horizontalSizeClass) private var hSizeClass @Environment(\.colorScheme) private var colorScheme @@ -35,7 +34,7 @@ struct OnboardingBackground: View { .opacity(colorScheme == .light ? 0.5 : 0.3) .frame(width: proxy.size.width, height: proxy.size.height, alignment: alignment) .background( - OnboardingGradientView(type: gradientType) + OnboardingGradientView() .ignoresSafeArea() ) } @@ -48,24 +47,10 @@ private enum Metrics { #Preview("Light Mode") { OnboardingBackground() - .onboardingGradient(.default) - .preferredColorScheme(.light) -} - -#Preview("Dark Mode") { - OnboardingBackground() - .onboardingGradient(.default) - .preferredColorScheme(.dark) -} - -#Preview("Light Mode - Highlights") { - OnboardingBackground() - .onboardingGradient(.highlights) .preferredColorScheme(.light) } #Preview("Dark Mode - Highlights") { OnboardingBackground() - .onboardingGradient(.highlights) .preferredColorScheme(.dark) } diff --git a/DuckDuckGo/OnboardingExperiment/Background/OnboardingGradient.swift b/DuckDuckGo/OnboardingExperiment/Background/OnboardingGradient.swift index c5b6fff5a6..d32dfa3202 100644 --- a/DuckDuckGo/OnboardingExperiment/Background/OnboardingGradient.swift +++ b/DuckDuckGo/OnboardingExperiment/Background/OnboardingGradient.swift @@ -23,57 +23,22 @@ import Onboarding struct OnboardingGradientView: View { @Environment(\.colorScheme) private var colorScheme - private let type: OnboardingGradientType - - init(type: OnboardingGradientType) { - self.type = type - } - var body: some View { - switch (type, colorScheme) { - case (.default, .light): - linearLightGradient - case (.default, .dark): - linearDarkGradient - case (.highlights, _): - // If highlights experiment use new common gradient for iOS and macOS + switch colorScheme { + case .dark: OnboardingGradient() + case .light: + // iOS 15 doesn't render properly the light EllipticalGradient while the Dark gradient is rendered correctly + // https://app.asana.com/0/1206329551987282/1208839072951158/f + if #available(iOS 16, *) { + OnboardingGradient() + } else { + Image(.onboardingGradientLight) + .resizable() + } @unknown default: - linearLightGradient + OnboardingGradient() } } - private var linearLightGradient: some View { - gradient(colorStops: [ - .init(color: Color(red: 1, green: 0.9, blue: 0.87), location: 0.00), - .init(color: Color(red: 0.99, green: 0.89, blue: 0.87), location: 0.28), - .init(color: Color(red: 0.99, green: 0.89, blue: 0.87), location: 0.46), - .init(color: Color(red: 0.96, green: 0.87, blue: 0.87), location: 0.72), - .init(color: Color(red: 0.9, green: 0.84, blue: 0.92), location: 1.00), - ]) - } - - private var linearDarkGradient: some View { - gradient(colorStops: [ - .init(color: Color(red: 0.29, green: 0.19, blue: 0.25), location: 0.00), - .init(color: Color(red: 0.35, green: 0.23, blue: 0.32), location: 0.28), - .init(color: Color(red: 0.37, green: 0.25, blue: 0.38), location: 0.46), - .init(color: Color(red: 0.2, green: 0.15, blue: 0.32), location: 0.72), - .init(color: Color(red: 0.16, green: 0.15, blue: 0.34), location: 1.00), - ]) - } - - private func gradient(colorStops: [SwiftUI.Gradient.Stop]) -> some View { - LinearGradient( - stops: colorStops, - startPoint: UnitPoint(x: 0.5, y: 0), - endPoint: UnitPoint(x: 0.5, y: 1) - ) - } - -} - -enum OnboardingGradientType { - case `default` - case highlights } diff --git a/DuckDuckGo/OnboardingExperiment/BrowsersComparison/BrowsersComparisonModel.swift b/DuckDuckGo/OnboardingExperiment/BrowsersComparison/BrowsersComparisonModel.swift index 6f4f855868..c7011b0b1f 100644 --- a/DuckDuckGo/OnboardingExperiment/BrowsersComparison/BrowsersComparisonModel.swift +++ b/DuckDuckGo/OnboardingExperiment/BrowsersComparison/BrowsersComparisonModel.swift @@ -117,29 +117,18 @@ extension BrowsersComparisonModel.PrivacyFeature { case blockCreepyAds case eraseBrowsingData - // Remove it once Highlights experiment finishes - static var onboardingManager: OnboardingHighlightsManaging = OnboardingManager() - var title: String { switch self { case .privateSearch: - UserText.DaxOnboardingExperiment.BrowsersComparison.Features.privateSearch + UserText.Onboarding.BrowsersComparison.Features.privateSearch case .blockThirdPartyTrackers: - Self.onboardingManager.isOnboardingHighlightsEnabled ? - UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.trackerBlockers : - UserText.DaxOnboardingExperiment.BrowsersComparison.Features.trackerBlockers + UserText.Onboarding.BrowsersComparison.Features.trackerBlockers case .blockCookiePopups: - Self.onboardingManager.isOnboardingHighlightsEnabled ? - UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.cookiePopups: - UserText.DaxOnboardingExperiment.BrowsersComparison.Features.cookiePopups + UserText.Onboarding.BrowsersComparison.Features.cookiePopups case .blockCreepyAds: - Self.onboardingManager.isOnboardingHighlightsEnabled ? - UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.creepyAds : - UserText.DaxOnboardingExperiment.BrowsersComparison.Features.creepyAds + UserText.Onboarding.BrowsersComparison.Features.creepyAds case .eraseBrowsingData: - Self.onboardingManager.isOnboardingHighlightsEnabled ? - UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.eraseBrowsingData: - UserText.DaxOnboardingExperiment.BrowsersComparison.Features.eraseBrowsingData + UserText.Onboarding.BrowsersComparison.Features.eraseBrowsingData } } } diff --git a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift index b3e61bea54..abdbbec806 100644 --- a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift +++ b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift @@ -23,7 +23,7 @@ import Onboarding import DuckUI struct OnboardingTrySearchDialog: View { - let title = UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASearchTitle + let title = UserText.Onboarding.ContextualOnboarding.onboardingTryASearchTitle let message: String let viewModel: OnboardingSearchSuggestionsViewModel @@ -58,7 +58,7 @@ struct OnboardingTryVisitingSiteDialog: View { } struct OnboardingTryVisitingSiteDialogContent: View { - let message = NSAttributedString(string: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteMessage) + let message = NSAttributedString(string: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteMessage) let viewModel: OnboardingSiteSuggestionsViewModel @@ -74,7 +74,7 @@ struct OnboardingTryVisitingSiteDialogContent: View { struct OnboardingFireButtonDialogContent: View { private let attributedMessage: NSAttributedString = { - let firstString = UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryFireButtonMessage + let firstString = UserText.Onboarding.ContextualOnboarding.onboardingTryFireButtonMessage let boldString = "Fire Button." let attributedString = NSMutableAttributedString(string: firstString) let boldFontAttribute: [NSAttributedString.Key: Any] = [ @@ -95,7 +95,7 @@ struct OnboardingFireButtonDialogContent: View { } struct OnboardingFirstSearchDoneDialog: View { - let cta = UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingGotItButton + let cta = UserText.Onboarding.ContextualOnboarding.onboardingGotItButton let message: NSAttributedString @State private var showNextScreen: Bool = false @@ -147,7 +147,7 @@ struct OnboardingFireDialog: View { } struct OnboardingTrackersDoneDialog: View { - let cta = UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingGotItButton + let cta = UserText.Onboarding.ContextualOnboarding.onboardingGotItButton @State private var showNextScreen: Bool = false @@ -202,7 +202,7 @@ struct OnboardingFinalDialog: View { } } else { ContextualDaxDialogContent( - title: canShowAddToDockTutorial ? UserText.AddToDockOnboarding.Promo.title : UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenTitle, + title: canShowAddToDockTutorial ? UserText.AddToDockOnboarding.Promo.title : UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenTitle, titleFont: Font(UIFont.daxTitle3()), message: NSAttributedString(string: message), messageFont: Font.system(size: 16), @@ -295,17 +295,17 @@ struct OnboardingAddToDockTutorialContent: View { // MARK: - Preview #Preview("Try Search") { - OnboardingTrySearchDialog(message: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASearchMessage, viewModel: OnboardingSearchSuggestionsViewModel(suggestedSearchesProvider: OnboardingSuggestedSearchesProvider(), pixelReporter: OnboardingPixelReporter())) + OnboardingTrySearchDialog(message: UserText.Onboarding.ContextualOnboarding.onboardingTryASearchMessage, viewModel: OnboardingSearchSuggestionsViewModel(suggestedSearchesProvider: OnboardingSuggestedSearchesProvider(), pixelReporter: OnboardingPixelReporter())) .padding() } #Preview("Try Site Top") { - OnboardingTryVisitingSiteDialog(logoPosition: .top, viewModel: OnboardingSiteSuggestionsViewModel(title: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), pixelReporter: OnboardingPixelReporter())) + OnboardingTryVisitingSiteDialog(logoPosition: .top, viewModel: OnboardingSiteSuggestionsViewModel(title: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), pixelReporter: OnboardingPixelReporter())) .padding() } #Preview("Try Site Left") { - OnboardingTryVisitingSiteDialog(logoPosition: .left, viewModel: OnboardingSiteSuggestionsViewModel(title: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), pixelReporter: OnboardingPixelReporter())) + OnboardingTryVisitingSiteDialog(logoPosition: .left, viewModel: OnboardingSiteSuggestionsViewModel(title: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), pixelReporter: OnboardingPixelReporter())) .padding() } @@ -317,15 +317,21 @@ struct OnboardingAddToDockTutorialContent: View { } #Preview("First Search Dialog") { - OnboardingFirstSearchDoneDialog(message: NSAttributedString(string: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFirstSearchDoneMessage), shouldFollowUp: true, viewModel: OnboardingSiteSuggestionsViewModel(title: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), pixelReporter: OnboardingPixelReporter()), gotItAction: {}) + let attributedMessage = { + let message = UserText.Onboarding.ContextualOnboarding.onboardingFirstSearchDoneMessage + let boldRange = message.range(of: "DuckDuckGo Search") + return message.attributed.with(attribute: .font, value: UIFont.daxBodyBold(), in: boldRange) + }() + + return OnboardingFirstSearchDoneDialog(message: attributedMessage, shouldFollowUp: true, viewModel: OnboardingSiteSuggestionsViewModel(title: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), pixelReporter: OnboardingPixelReporter()), gotItAction: {}) .padding() } #Preview("Final Dialog - No Add to Dock Tutorial") { OnboardingFinalDialog( logoPosition: .top, - message: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenMessage, - cta: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenButton, + message: UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenMessage, + cta: UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenButton, canShowAddToDockTutorial: false, showAddToDockTutorialAction: {}, dismissAction: { _ in } diff --git a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift index 1dce0528fd..994078c2d7 100644 --- a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift +++ b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift @@ -30,17 +30,13 @@ final class NewTabDaxDialogFactory: NewTabDaxDialogProvider { private var delegate: OnboardingNavigationDelegate? private let contextualOnboardingLogic: ContextualOnboardingLogic private let onboardingPixelReporter: OnboardingPixelReporting - private let onboardingManager: OnboardingHighlightsManaging & OnboardingAddToDockManaging - - private var gradientType: OnboardingGradientType { - onboardingManager.isOnboardingHighlightsEnabled ? .highlights : .default - } + private let onboardingManager: OnboardingAddToDockManaging init( delegate: OnboardingNavigationDelegate?, contextualOnboardingLogic: ContextualOnboardingLogic, onboardingPixelReporter: OnboardingPixelReporting, - onboardingManager: OnboardingHighlightsManaging & OnboardingAddToDockManaging = OnboardingManager() + onboardingManager: OnboardingAddToDockManaging = OnboardingManager() ) { self.delegate = delegate self.contextualOnboardingLogic = contextualOnboardingLogic @@ -66,24 +62,24 @@ final class NewTabDaxDialogFactory: NewTabDaxDialogProvider { private func createInitialDialog() -> some View { let viewModel = OnboardingSearchSuggestionsViewModel(suggestedSearchesProvider: OnboardingSuggestedSearchesProvider(), delegate: delegate, pixelReporter: onboardingPixelReporter) - let message = onboardingManager.isOnboardingHighlightsEnabled ? UserText.HighlightsOnboardingExperiment.ContextualOnboarding.onboardingTryASearchMessage : UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASearchMessage + let message = UserText.Onboarding.ContextualOnboarding.onboardingTryASearchMessage return FadeInView { OnboardingTrySearchDialog(message: message, viewModel: viewModel) .onboardingDaxDialogStyle() } - .onboardingContextualBackgroundStyle(background: .illustratedGradient(gradientType)) + .onboardingContextualBackgroundStyle(background: .illustratedGradient) .onFirstAppear { [weak self] in self?.onboardingPixelReporter.trackScreenImpression(event: .onboardingContextualTrySearchUnique) } } private func createSubsequentDialog() -> some View { - let viewModel = OnboardingSiteSuggestionsViewModel(title: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteNTPTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), delegate: delegate, pixelReporter: onboardingPixelReporter) + let viewModel = OnboardingSiteSuggestionsViewModel(title: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteNTPTitle, suggestedSitesProvider: OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), delegate: delegate, pixelReporter: onboardingPixelReporter) return FadeInView { OnboardingTryVisitingSiteDialog(logoPosition: .top, viewModel: viewModel) .onboardingDaxDialogStyle() } - .onboardingContextualBackgroundStyle(background: .illustratedGradient(gradientType)) + .onboardingContextualBackgroundStyle(background: .illustratedGradient) .onFirstAppear { [weak self] in self?.onboardingPixelReporter.trackScreenImpression(event: .onboardingContextualTryVisitSiteUnique) } @@ -91,11 +87,14 @@ final class NewTabDaxDialogFactory: NewTabDaxDialogProvider { private func createAddFavoriteDialog(message: String) -> some View { FadeInView { - DaxDialogView(logoPosition: .top) { - ContextualDaxDialogContent(message: NSAttributedString(string: message)) + ScrollView(.vertical) { + DaxDialogView(logoPosition: .top) { + ContextualDaxDialogContent(message: NSAttributedString(string: message)) + } + .padding() } - .padding() } + .onboardingContextualBackgroundStyle(background: .illustratedGradient) } private func createFinalDialog(onDismiss: @escaping () -> Void) -> some View { @@ -105,8 +104,8 @@ final class NewTabDaxDialogFactory: NewTabDaxDialogProvider { (UserText.AddToDockOnboarding.Promo.contextualMessage, UserText.AddToDockOnboarding.Buttons.startBrowsing) } else { ( - onboardingManager.isOnboardingHighlightsEnabled ? UserText.HighlightsOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenMessage : UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenMessage, - UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenButton + UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenMessage, + UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenButton ) } @@ -136,7 +135,7 @@ final class NewTabDaxDialogFactory: NewTabDaxDialogProvider { dismissAction: dismissAction ) } - .onboardingContextualBackgroundStyle(background: .illustratedGradient(gradientType)) + .onboardingContextualBackgroundStyle(background: .illustratedGradient) .onFirstAppear { [weak self] in self?.contextualOnboardingLogic.setFinalOnboardingDialogSeen() self?.onboardingPixelReporter.trackScreenImpression(event: .daxDialogsEndOfJourneyNewTabUnique) diff --git a/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualDaxDialogsFactory.swift b/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualDaxDialogsFactory.swift index 25f7b7542c..5ccdb1a462 100644 --- a/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualDaxDialogsFactory.swift +++ b/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualDaxDialogsFactory.swift @@ -48,18 +48,14 @@ final class ExperimentContextualDaxDialogsFactory: ContextualDaxDialogsFactory { private let contextualOnboardingSettings: ContextualOnboardingSettings private let contextualOnboardingPixelReporter: OnboardingPixelReporting private let contextualOnboardingSiteSuggestionsProvider: OnboardingSuggestionsItemsProviding - private let onboardingManager: OnboardingHighlightsManaging & OnboardingAddToDockManaging - - private var gradientType: OnboardingGradientType { - onboardingManager.isOnboardingHighlightsEnabled ? .highlights : .default - } + private let onboardingManager: OnboardingAddToDockManaging init( contextualOnboardingLogic: ContextualOnboardingLogic, contextualOnboardingSettings: ContextualOnboardingSettings = DefaultDaxDialogsSettings(), contextualOnboardingPixelReporter: OnboardingPixelReporting, - contextualOnboardingSiteSuggestionsProvider: OnboardingSuggestionsItemsProviding = OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), - onboardingManager: OnboardingHighlightsManaging & OnboardingAddToDockManaging = OnboardingManager() + contextualOnboardingSiteSuggestionsProvider: OnboardingSuggestionsItemsProviding = OnboardingSuggestedSitesProvider(surpriseItemTitle: UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMeTitle), + onboardingManager: OnboardingAddToDockManaging = OnboardingManager() ) { self.contextualOnboardingSettings = contextualOnboardingSettings self.contextualOnboardingLogic = contextualOnboardingLogic @@ -99,7 +95,7 @@ final class ExperimentContextualDaxDialogsFactory: ContextualDaxDialogsFactory { let viewWithBackground = rootView .onboardingDaxDialogStyle() - .onboardingContextualBackgroundStyle(background: .gradientOnly(gradientType)) + .onboardingContextualBackgroundStyle(background: .gradientOnly) let hostingController = UIHostingController(rootView: AnyView(viewWithBackground)) if #available(iOS 16.0, *) { hostingController.sizingOptions = [.intrinsicContentSize] @@ -116,16 +112,12 @@ final class ExperimentContextualDaxDialogsFactory: ContextualDaxDialogsFactory { ) -> some View { func dialogMessage() -> NSAttributedString { - if onboardingManager.isOnboardingHighlightsEnabled { - let message = UserText.HighlightsOnboardingExperiment.ContextualOnboarding.onboardingFirstSearchDoneMessage - let boldRange = message.range(of: "DuckDuckGo Search") - return message.attributed.with(attribute: .font, value: UIFont.daxBodyBold(), in: boldRange) - } else { - return UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFirstSearchDoneMessage.attributed - } + let message = UserText.Onboarding.ContextualOnboarding.onboardingFirstSearchDoneMessage + let boldRange = message.range(of: "DuckDuckGo Search") + return message.attributed.with(attribute: .font, value: UIFont.daxBodyBold(), in: boldRange) } - let viewModel = OnboardingSiteSuggestionsViewModel(title: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: contextualOnboardingSiteSuggestionsProvider, delegate: delegate, pixelReporter: contextualOnboardingPixelReporter) + let viewModel = OnboardingSiteSuggestionsViewModel(title: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: contextualOnboardingSiteSuggestionsProvider, delegate: delegate, pixelReporter: contextualOnboardingPixelReporter) // If should not show websites search after searching inform the delegate that the user dimissed the dialog, otherwise let the dialog handle it. let gotItAction: () -> Void = if shouldFollowUpToWebsiteSearch { @@ -147,7 +139,7 @@ final class ExperimentContextualDaxDialogsFactory: ContextualDaxDialogsFactory { } private func tryVisitingSiteDialog(delegate: ContextualOnboardingDelegate) -> some View { - let viewModel = OnboardingSiteSuggestionsViewModel(title: UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: contextualOnboardingSiteSuggestionsProvider, delegate: delegate, pixelReporter: contextualOnboardingPixelReporter) + let viewModel = OnboardingSiteSuggestionsViewModel(title: UserText.Onboarding.ContextualOnboarding.onboardingTryASiteTitle, suggestedSitesProvider: contextualOnboardingSiteSuggestionsProvider, delegate: delegate, pixelReporter: contextualOnboardingPixelReporter) return OnboardingTryVisitingSiteDialog(logoPosition: .left, viewModel: viewModel) .onFirstAppear { [weak self] in self?.contextualOnboardingPixelReporter.trackScreenImpression(event: .onboardingContextualTryVisitSiteUnique) @@ -188,8 +180,8 @@ final class ExperimentContextualDaxDialogsFactory: ContextualDaxDialogsFactory { (UserText.AddToDockOnboarding.Promo.contextualMessage, UserText.AddToDockOnboarding.Buttons.startBrowsing) } else { ( - onboardingManager.isOnboardingHighlightsEnabled ? UserText.HighlightsOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenMessage : UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenMessage, - UserText.DaxOnboardingExperiment.ContextualOnboarding.onboardingFinalScreenButton + UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenMessage, + UserText.Onboarding.ContextualOnboarding.onboardingFinalScreenButton ) } diff --git a/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualOnboardingPresenter.swift b/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualOnboardingPresenter.swift index 3aef1552a0..91b863d63a 100644 --- a/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualOnboardingPresenter.swift +++ b/DuckDuckGo/OnboardingExperiment/ContextualOnboarding/ContextualOnboardingPresenter.swift @@ -47,15 +47,11 @@ final class ContextualOnboardingPresenter: ContextualOnboardingPresenting { } func presentContextualOnboarding(for spec: DaxDialogs.BrowsingSpec, in vc: TabViewOnboardingDelegate) { - if variantManager.isContextualDaxDialogsEnabled { - presentExperimentContextualOnboarding(for: spec, in: vc) - } else { - presentControlContextualOnboarding(for: spec, in: vc) - } + presentExperimentContextualOnboarding(for: spec, in: vc) } func dismissContextualOnboardingIfNeeded(from vc: TabViewOnboardingDelegate) { - guard variantManager.isContextualDaxDialogsEnabled, let daxContextualOnboarding = vc.daxContextualOnboardingController else { return } + guard let daxContextualOnboarding = vc.daxContextualOnboardingController else { return } remove(daxController: daxContextualOnboarding, fromParent: vc) } diff --git a/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift b/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift deleted file mode 100644 index 528ff47fc8..0000000000 --- a/DuckDuckGo/OnboardingExperiment/DefaultVariantManager+Onboarding.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// DefaultVariantManager+Onboarding.swift -// DuckDuckGo -// -// Copyright © 2024 DuckDuckGo. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import Foundation -import BrowserServicesKit - -extension VariantManager { - - var isOnboardingHighlightsExperiment: Bool { - isSupported(feature: .newOnboardingIntroHighlights) - } - - var isContextualDaxDialogsEnabled: Bool { - isSupported(feature: .contextualDaxDialogs) - } - -} diff --git a/DuckDuckGo/OnboardingExperiment/Manager/OnboardingManager.swift b/DuckDuckGo/OnboardingExperiment/Manager/OnboardingManager.swift index b2f212410f..14d06eddbc 100644 --- a/DuckDuckGo/OnboardingExperiment/Manager/OnboardingManager.swift +++ b/DuckDuckGo/OnboardingExperiment/Manager/OnboardingManager.swift @@ -56,39 +56,6 @@ final class OnboardingManager { } } -// MARK: - Onboarding Highlights - -protocol OnboardingHighlightsManaging: AnyObject { - var isOnboardingHighlightsEnabled: Bool { get } -} - -protocol OnboardingHighlightsDebugging: OnboardingHighlightsManaging { - var isOnboardingHighlightsLocalFlagEnabled: Bool { get set } - var isOnboardingHighlightsFeatureFlagEnabled: Bool { get } -} - - -extension OnboardingManager: OnboardingHighlightsManaging, OnboardingHighlightsDebugging { - - var isOnboardingHighlightsEnabled: Bool { - variantManager.isOnboardingHighlightsExperiment || (isOnboardingHighlightsLocalFlagEnabled && isOnboardingHighlightsFeatureFlagEnabled) - } - - var isOnboardingHighlightsLocalFlagEnabled: Bool { - get { - appDefaults.onboardingHighlightsEnabled - } - set { - appDefaults.onboardingHighlightsEnabled = newValue - } - } - - var isOnboardingHighlightsFeatureFlagEnabled: Bool { - featureFlagger.isFeatureOn(.onboardingHighlights) - } - -} - // MARK: - Add to Dock protocol OnboardingAddToDockManaging: AnyObject { @@ -103,7 +70,14 @@ protocol OnboardingAddToDockDebugging: AnyObject { extension OnboardingManager: OnboardingAddToDockManaging, OnboardingAddToDockDebugging { var addToDockEnabledState: OnboardingAddToDockState { - // TODO: Add variant condition OR local conditions + // Check if the variant supports Add to Dock + if variantManager.isSupported(feature: .addToDockIntro) { + return .intro + } else if variantManager.isSupported(feature: .addToDockContextual) { + return .contextual + } + + // If the variant does not support Add to Dock check if it's enabled for internal users. guard isAddToDockFeatureFlagEnabled && isIphone else { return .disabled } return addToDockLocalFlagState diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel+Copy.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel+Copy.swift index 5e2e713a7e..f8e8c777ff 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel+Copy.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel+Copy.swift @@ -23,30 +23,14 @@ extension OnboardingIntroViewModel { struct Copy { let introTitle: String let browserComparisonTitle: String - let trackerBlockers: String - let cookiePopups: String - let creepyAds: String - let eraseBrowsingData: String } } extension OnboardingIntroViewModel.Copy { static let `default` = OnboardingIntroViewModel.Copy( - introTitle: UserText.DaxOnboardingExperiment.Intro.title, - browserComparisonTitle: UserText.DaxOnboardingExperiment.BrowsersComparison.title, - trackerBlockers: UserText.DaxOnboardingExperiment.BrowsersComparison.Features.trackerBlockers, - cookiePopups: UserText.DaxOnboardingExperiment.BrowsersComparison.Features.cookiePopups, - creepyAds: UserText.DaxOnboardingExperiment.BrowsersComparison.Features.creepyAds, - eraseBrowsingData: UserText.DaxOnboardingExperiment.BrowsersComparison.Features.eraseBrowsingData + introTitle: UserText.Onboarding.Intro.title, + browserComparisonTitle: UserText.Onboarding.BrowsersComparison.title ) - static let highlights = OnboardingIntroViewModel.Copy( - introTitle: UserText.HighlightsOnboardingExperiment.Intro.title, - browserComparisonTitle: UserText.HighlightsOnboardingExperiment.BrowsersComparison.title, - trackerBlockers: UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.trackerBlockers, - cookiePopups: UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.cookiePopups, - creepyAds: UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.creepyAds, - eraseBrowsingData: UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.eraseBrowsingData - ) } diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift index d16992322b..740e6659ca 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingIntroViewModel.swift @@ -26,12 +26,11 @@ final class OnboardingIntroViewModel: ObservableObject { @Published private(set) var state: OnboardingView.ViewState = .landing let copy: Copy - let gradientType: OnboardingGradientType var onCompletingOnboardingIntro: (() -> Void)? private var introSteps: [OnboardingIntroStep] private let pixelReporter: OnboardingIntroPixelReporting & OnboardingAddToDockReporting - private let onboardingManager: OnboardingHighlightsManaging & OnboardingAddToDockManaging + private let onboardingManager: OnboardingAddToDockManaging private let isIpad: Bool private let urlOpener: URLOpener private let appIconProvider: () -> AppIcon @@ -39,7 +38,7 @@ final class OnboardingIntroViewModel: ObservableObject { init( pixelReporter: OnboardingIntroPixelReporting & OnboardingAddToDockReporting, - onboardingManager: OnboardingHighlightsManaging & OnboardingAddToDockManaging = OnboardingManager(), + onboardingManager: OnboardingAddToDockManaging = OnboardingManager(), isIpad: Bool = UIDevice.current.userInterfaceIdiom == .pad, urlOpener: URLOpener = UIApplication.shared, appIconProvider: @escaping () -> AppIcon = { AppIconManager.shared.appIcon }, @@ -52,16 +51,14 @@ final class OnboardingIntroViewModel: ObservableObject { self.appIconProvider = appIconProvider self.addressBarPositionProvider = addressBarPositionProvider - introSteps = if onboardingManager.isOnboardingHighlightsEnabled && onboardingManager.addToDockEnabledState == .intro { - isIpad ? OnboardingIntroStep.highlightsIPadFlow : OnboardingIntroStep.highlightsAddToDockIphoneFlow - } else if onboardingManager.isOnboardingHighlightsEnabled { - isIpad ? OnboardingIntroStep.highlightsIPadFlow : OnboardingIntroStep.highlightsIPhoneFlow + // Add to Dock experiment assigned only to iPhone users + introSteps = if onboardingManager.addToDockEnabledState == .intro { + OnboardingIntroStep.addToDockIphoneFlow } else { - OnboardingIntroStep.defaultFlow + isIpad ? OnboardingIntroStep.defaultIPadFlow : OnboardingIntroStep.defaultIPhoneFlow } - copy = onboardingManager.isOnboardingHighlightsEnabled ? .highlights : .default - gradientType = onboardingManager.isOnboardingHighlightsEnabled ? .highlights : .default + copy = .default } func onAppear() { @@ -129,12 +126,7 @@ private extension OnboardingIntroViewModel { func makeViewState(for introStep: OnboardingIntroStep) -> OnboardingView.ViewState { func stepInfo() -> OnboardingView.ViewState.Intro.StepInfo { - guard - let currentStepIndex = introSteps.firstIndex(of: introStep), - onboardingManager.isOnboardingHighlightsEnabled - else { - return .hidden - } + guard let currentStepIndex = introSteps.firstIndex(of: introStep) else { return .hidden } // Remove startOnboardingDialog from the count of total steps since we don't show the progress for that step. return OnboardingView.ViewState.Intro.StepInfo(currentStep: currentStepIndex, totalSteps: introSteps.count - 1) @@ -157,14 +149,12 @@ private extension OnboardingIntroViewModel { } func handleSetDefaultBrowserAction() { - if onboardingManager.addToDockEnabledState == .intro && onboardingManager.isOnboardingHighlightsEnabled { + if onboardingManager.addToDockEnabledState == .intro { state = makeViewState(for: .addToDockPromo) pixelReporter.trackAddToDockPromoImpression() - } else if onboardingManager.isOnboardingHighlightsEnabled { + } else { state = makeViewState(for: .appIconSelection) pixelReporter.trackChooseAppIconImpression() - } else { - onCompletingOnboardingIntro?() } } @@ -179,8 +169,7 @@ private enum OnboardingIntroStep { case addressBarPositionSelection case addToDockPromo - static let defaultFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison] - static let highlightsIPhoneFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison, .appIconSelection, .addressBarPositionSelection] - static let highlightsIPadFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison, .appIconSelection] - static let highlightsAddToDockIphoneFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison, .addToDockPromo, .appIconSelection, .addressBarPositionSelection] + static let defaultIPhoneFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison, .appIconSelection, .addressBarPositionSelection] + static let defaultIPadFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison, .appIconSelection] + static let addToDockIphoneFlow: [OnboardingIntroStep] = [.introDialog, .browserComparison, .addToDockPromo, .appIconSelection, .addressBarPositionSelection] } diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AddressBarPositionContent.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AddressBarPositionContent.swift index 5ef61b133c..979593d0db 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AddressBarPositionContent.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AddressBarPositionContent.swift @@ -23,7 +23,6 @@ import Onboarding private enum Metrics { static let titleFont = Font.system(size: 20, weight: .semibold) - static let messageFont = Font.system(size: 16) } extension OnboardingView { @@ -51,7 +50,7 @@ extension OnboardingView { var body: some View { VStack(spacing: 16.0) { - AnimatableTypingText(UserText.HighlightsOnboardingExperiment.AddressBarPosition.title, startAnimating: animateTitle) { + AnimatableTypingText(UserText.Onboarding.AddressBarPosition.title, startAnimating: animateTitle) { showContent.wrappedValue = true } .foregroundColor(.primary) @@ -61,7 +60,7 @@ extension OnboardingView { OnboardingAddressBarPositionPicker() Button(action: action) { - Text(verbatim: UserText.HighlightsOnboardingExperiment.AddressBarPosition.cta) + Text(verbatim: UserText.Onboarding.AddressBarPosition.cta) } .buttonStyle(PrimaryButtonStyle()) } diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AppIconPickerContent.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AppIconPickerContent.swift index a85d4df605..5fd7a30be0 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AppIconPickerContent.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+AppIconPickerContent.swift @@ -50,13 +50,13 @@ extension OnboardingView { var body: some View { VStack(spacing: 16.0) { - AnimatableTypingText(UserText.HighlightsOnboardingExperiment.AppIconSelection.title, startAnimating: animateTitle) { + AnimatableTypingText(UserText.Onboarding.AppIconSelection.title, startAnimating: animateTitle) { animateMessage.wrappedValue = true } .foregroundColor(.primary) .font(Metrics.titleFont) - AnimatableTypingText(UserText.HighlightsOnboardingExperiment.AppIconSelection.message, startAnimating: animateMessage) { + AnimatableTypingText(UserText.Onboarding.AppIconSelection.message, startAnimating: animateMessage) { withAnimation { showContent.wrappedValue = true } @@ -68,7 +68,7 @@ extension OnboardingView { AppIconPicker() Button(action: action) { - Text(UserText.HighlightsOnboardingExperiment.AppIconSelection.cta) + Text(UserText.Onboarding.AppIconSelection.cta) } .buttonStyle(PrimaryButtonStyle()) } @@ -83,5 +83,4 @@ extension OnboardingView { private enum Metrics { static let titleFont = Font.system(size: 20, weight: .semibold) static let messageFont = Font.system(size: 16) - static let pickerLeadingOffset: CGFloat = -20 } diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+BrowsersComparisonContent.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+BrowsersComparisonContent.swift index 0772d9e3b8..fdaf12a120 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+BrowsersComparisonContent.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+BrowsersComparisonContent.swift @@ -61,7 +61,7 @@ extension OnboardingView { OnboardingActions( viewModel: .init( - primaryButtonTitle: UserText.DaxOnboardingExperiment.BrowsersComparison.cta, + primaryButtonTitle: UserText.Onboarding.BrowsersComparison.cta, secondaryButtonTitle: UserText.onboardingSkip ), primaryAction: setAsDefaultBrowserAction, diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+IntroDialogContent.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+IntroDialogContent.swift index 430be926ea..d4324609f6 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+IntroDialogContent.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView+IntroDialogContent.swift @@ -39,7 +39,7 @@ extension OnboardingView { var body: some View { VStack(spacing: 24.0) { - AnimatableTypingText(title) { + AnimatableTypingText(title, startAnimating: animateText) { withAnimation { showCTA.wrappedValue = true } @@ -48,7 +48,7 @@ extension OnboardingView { .font(Font.system(size: 20, weight: .bold)) Button(action: action) { - Text(UserText.DaxOnboardingExperiment.Intro.cta) + Text(UserText.Onboarding.Intro.cta) } .buttonStyle(PrimaryButtonStyle()) .visibility(showCTA.wrappedValue ? .visible : .invisible) diff --git a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift index 2d99d818be..38d7d37a3b 100644 --- a/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift +++ b/DuckDuckGo/OnboardingExperiment/OnboardingIntro/OnboardingView.swift @@ -40,7 +40,6 @@ struct OnboardingView: View { @State private var appIconPickerContentState = AppIconPickerContentState() @State private var addressBarPositionContentState = AddressBarPositionContentState() - @State private var addToDockPromoContentState = AddToDockPromoContentState() init(model: OnboardingIntroViewModel) { self.model = model @@ -57,7 +56,6 @@ struct OnboardingView: View { onboardingDialogView(state: viewState) } } - .onboardingGradient(model.gradientType) } private func onboardingDialogView(state: ViewState.Intro) -> some View { @@ -76,10 +74,6 @@ struct OnboardingView: View { case .browsersComparisonDialog: showComparisonButton = true animateComparisonText = false - case .addToDockPromoDialog: - addToDockPromoContentState.animateTitle = false - addToDockPromoContentState.animateMessage = false - addToDockPromoContentState.showContent = true case .chooseAppIconDialog: appIconPickerContentState.animateTitle = false appIconPickerContentState.animateMessage = false diff --git a/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift b/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift index 881e5fd721..09efd90925 100644 --- a/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift +++ b/DuckDuckGo/OnboardingExperiment/Styles/DaxDialogStyles.swift @@ -38,12 +38,11 @@ extension OnboardingStyles { func body(content: Content) -> some View { ZStack { switch backgroundType { - case let .illustratedGradient(gradientType): + case .illustratedGradient: OnboardingBackground() - .onboardingGradient(gradientType) .ignoresSafeArea(.keyboard) - case let .gradientOnly(gradientType): - OnboardingGradientView(type: gradientType) + case .gradientOnly: + OnboardingGradientView() .ignoresSafeArea(.keyboard) } @@ -71,25 +70,6 @@ extension View { } enum OnboardingBackgroundType { - case illustratedGradient(OnboardingGradientType) - case gradientOnly(OnboardingGradientType) -} - -enum OnboardingGradientTypeKey: EnvironmentKey { - static var defaultValue: OnboardingGradientType = .default -} - -extension EnvironmentValues { - var onboardingGradientType: OnboardingGradientType { - get { self[OnboardingGradientTypeKey.self] } - set { self[OnboardingGradientTypeKey.self] = newValue } - } -} - -extension View { - - func onboardingGradient(_ type: OnboardingGradientType) -> some View { - environment(\.onboardingGradientType, type) - } - + case illustratedGradient + case gradientOnly } diff --git a/DuckDuckGo/OnboardingHelpers/OnboardingSuggestedSearchesProvider.swift b/DuckDuckGo/OnboardingHelpers/OnboardingSuggestedSearchesProvider.swift index ed71123a3c..fa8c180ded 100644 --- a/DuckDuckGo/OnboardingHelpers/OnboardingSuggestedSearchesProvider.swift +++ b/DuckDuckGo/OnboardingHelpers/OnboardingSuggestedSearchesProvider.swift @@ -24,31 +24,17 @@ struct OnboardingSuggestedSearchesProvider: OnboardingSuggestionsItemsProviding private static let imageSearch = "!image " private let countryAndLanguageProvider: OnboardingRegionAndLanguageProvider - private let onboardingManager: OnboardingHighlightsManaging - init( - countryAndLanguageProvider: OnboardingRegionAndLanguageProvider = Locale.current, - onboardingManager: OnboardingHighlightsManaging = OnboardingManager() - ) { + init(countryAndLanguageProvider: OnboardingRegionAndLanguageProvider = Locale.current) { self.countryAndLanguageProvider = countryAndLanguageProvider - self.onboardingManager = onboardingManager } var list: [ContextualOnboardingListItem] { - if onboardingManager.isOnboardingHighlightsEnabled { - [ - option1, - option2, - surpriseMe - ] - } else { - [ - option1, - option2, - option3, - surpriseMe - ] - } + [ + option1, + option2, + surpriseMe + ] } private var country: String? { @@ -61,9 +47,9 @@ struct OnboardingSuggestedSearchesProvider: OnboardingSuggestionsItemsProviding private var option1: ContextualOnboardingListItem { var search: String if language == "en" { - search = UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOption1English + search = UserText.Onboarding.ContextualOnboarding.tryASearchOption1English } else { - search = UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOption1International + search = UserText.Onboarding.ContextualOnboarding.tryASearchOption1International } return ContextualOnboardingListItem.search(title: search) } @@ -73,28 +59,17 @@ struct OnboardingSuggestedSearchesProvider: OnboardingSuggestionsItemsProviding // ISO 3166-1 Region capitalized. // https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html if isUSCountry { - search = UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOption2English + search = UserText.Onboarding.ContextualOnboarding.tryASearchOption2English } else { - search = UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOption2International + search = UserText.Onboarding.ContextualOnboarding.tryASearchOption2International } return ContextualOnboardingListItem.search(title: search) } - private var option3: ContextualOnboardingListItem { - let search = UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOption3 - return ContextualOnboardingListItem.search(title: search) - } - private var surpriseMe: ContextualOnboardingListItem { - let search = if onboardingManager.isOnboardingHighlightsEnabled { - Self.imageSearch + UserText.HighlightsOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMe - } else { - isUSCountry ? - UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeEnglish : - UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeInternational - } + let search = Self.imageSearch + UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMe - return ContextualOnboardingListItem.surprise(title: search, visibleTitle: UserText.DaxOnboardingExperiment.ContextualOnboarding.tryASearchOptionSurpriseMeTitle) + return ContextualOnboardingListItem.surprise(title: search, visibleTitle: UserText.Onboarding.ContextualOnboarding.tryASearchOptionSurpriseMeTitle) } private var isUSCountry: Bool { diff --git a/DuckDuckGo/TabSwitcherViewController.swift b/DuckDuckGo/TabSwitcherViewController.swift index 585d7dcafb..617ea6054c 100644 --- a/DuckDuckGo/TabSwitcherViewController.swift +++ b/DuckDuckGo/TabSwitcherViewController.swift @@ -331,18 +331,8 @@ class TabSwitcherViewController: UIViewController { } Pixel.fire(pixel: .forgetAllPressedTabSwitching) - let isNewOnboarding = DefaultVariantManager().isContextualDaxDialogsEnabled - - if !isNewOnboarding - && DaxDialogs.shared.shouldShowFireButtonPulse { - let spec = DaxDialogs.shared.fireButtonEducationMessage() - performSegue(withIdentifier: "ActionSheetDaxDialog", sender: spec) - } else { - if isNewOnboarding { - ViewHighlighter.hideAll() - } - presentForgetDataAlert() - } + ViewHighlighter.hideAll() + presentForgetDataAlert() } private func forgetAll() { diff --git a/DuckDuckGo/TabViewController.swift b/DuckDuckGo/TabViewController.swift index 24dddd1628..bc248cd104 100644 --- a/DuckDuckGo/TabViewController.swift +++ b/DuckDuckGo/TabViewController.swift @@ -1587,9 +1587,6 @@ extension TabViewController: WKNavigationDelegate { return } - if !DefaultVariantManager().isContextualDaxDialogsEnabled { - isShowingFullScreenDaxDialog = true - } scheduleTrackerNetworksAnimation(collapsing: !spec.highlightAddressBar) let daxDialogSourceURL = self.url diff --git a/DuckDuckGo/TabsBarViewController.swift b/DuckDuckGo/TabsBarViewController.swift index a2204f467d..494d5da197 100644 --- a/DuckDuckGo/TabsBarViewController.swift +++ b/DuckDuckGo/TabsBarViewController.swift @@ -104,16 +104,8 @@ class TabsBarViewController: UIViewController { self.present(controller: alert, fromView: fireButton) } - if DefaultVariantManager().isContextualDaxDialogsEnabled { - delegate?.tabsBarDidRequestFireEducationDialog(self) - showClearDataAlert() - } else { - if DaxDialogs.shared.shouldShowFireButtonPulse { - delegate?.tabsBarDidRequestFireEducationDialog(self) - } else { - showClearDataAlert() - } - } + delegate?.tabsBarDidRequestFireEducationDialog(self) + showClearDataAlert() } @IBAction func onNewTabPressed() { @@ -322,14 +314,8 @@ extension MainViewController: TabsBarDelegate { } func tabsBarDidRequestFireEducationDialog(_ controller: TabsBarViewController) { - if DefaultVariantManager().isContextualDaxDialogsEnabled { - currentTab?.dismissContextualDaxFireDialog() - ViewHighlighter.hideAll() - } else { - if let spec = DaxDialogs.shared.fireButtonEducationMessage() { - segueToActionSheetDaxDialogWithSpec(spec) - } - } + currentTab?.dismissContextualDaxFireDialog() + ViewHighlighter.hideAll() } func tabsBarDidRequestTabSwitcher(_ controller: TabsBarViewController) { diff --git a/DuckDuckGo/UserText.swift b/DuckDuckGo/UserText.swift index ff3430d987..30a8483fbb 100644 --- a/DuckDuckGo/UserText.swift +++ b/DuckDuckGo/UserText.swift @@ -1353,61 +1353,20 @@ AI Chat is an optional feature available at [duck.ai](ddgquicklink://duck.ai) th public static let newTabPageIntroMessageBody = NSLocalizedString("new.tab.page.intro.message.body", value: "Customize your Favorites and go-to features. Reorder things or hide them to keep it clean.", comment: "Information message about New Tab Page redesign") - // MARK: - Dax Onboarding Experiment - public enum DaxOnboardingExperiment { - enum Intro { - public static let title = NSLocalizedString("onboarding.intro.title", value: "Hi there.\n\nReady for a better, more private internet?", comment: "The title of the onboarding dialog popup") + // MARK: - Onboarding + public enum Onboarding { + + public enum Intro { + public static let title = NSLocalizedString("onboarding.highlights.intro.title", value: "Hi there.\n\nReady for a faster browser that keeps you protected?", comment: "The title of the onboarding dialog popup") public static let cta = NSLocalizedString("onboarding.intro.cta", value: "Let’s do it!", comment: "Button to continue the onboarding process") } - enum BrowsersComparison { - public static let title = NSLocalizedString("onboarding.browsers.title", value: "Privacy protections activated!", comment: "The title of the dialog to show the privacy features that DuckDuckGo offers") + public enum BrowsersComparison { + public static let title = NSLocalizedString("onboarding.highlights.browsers.title", value: "Protections activated!", comment: "The title of the dialog to show the privacy features that DuckDuckGo offers") public static let cta = NSLocalizedString("onboarding.browsers.cta", value: "Choose Your Browser", comment: "Button to change the default browser") - enum Features { + public enum Features { public static let privateSearch = NSLocalizedString("onboarding.browsers.features.privateSearch.title", value: "Search privately by default", comment: "Message to highlight browser capability of private searches") - public static let trackerBlockers = NSLocalizedString("onboarding.browsers.features.trackerBlocker.title", value: "Block 3rd-party trackers", comment: "Message to highlight browser capability ofblocking 3rd party trackers") - public static let cookiePopups = NSLocalizedString("onboarding.browsers.features.cookiePopups.title", value: "Block cookie pop-ups", comment: "Message to highlight how the browser allows you to block cookie pop-ups") - public static let creepyAds = NSLocalizedString("onboarding.browsers.features.creepyAds.title", value: "Block creepy ads", comment: "Message to highlight browser capability of blocking creepy ads") - public static let eraseBrowsingData = NSLocalizedString("onboarding.browsers.features.eraseBrowsingData.title", value: "Swiftly erase browsing data", comment: "Message to highlight browser capability of swiftly erase browsing data") - } - } - - enum ContextualOnboarding { - static let onboardingTryASearchTitle = NSLocalizedString("contextual.onboarding.try-a-search.title", value: "Ready to get started?\nTry a search!", comment: "Title of a popover on the browser that invites the user to try a search") - static let onboardingTryASearchMessage = NSLocalizedString("contextual.onboarding.try-a-search.message", value: "Your DuckDuckGo searches are always anonymous.", comment: "Message of a popover on the browser that invites the user to try a search explaining that their searches are anonymous") - static let onboardingTryASiteTitle = NSLocalizedString("contextual.onboarding.try-a-site.title", value: "Next, try visiting a site!", comment: "Title of a popover on the browser that invites the user to try a visiting a website") - static let onboardingTryASiteNTPTitle = NSLocalizedString("contextual.onboarding.ntp.try-a-site.title", value: "Try visiting a site!", comment: "Title of a popover on the new tab page browser that invites the user to try a visiting a website") - static let onboardingTryASiteMessage = NSLocalizedString("contextual.onboarding.try-a-site.message", value: "I’ll block trackers so they can’t spy on you.", comment: "Message of a popover on the browser that invites the user to try visiting a website to explain that we block trackers") - static let onboardingTryFireButtonMessage = NSLocalizedString("contextual.onboarding.try-fire-button.message", value: "Instantly clear your browsing activity with the Fire Button.\n\nGive it a try! 🔥", comment: "Message of a popover on the browser that invites the user to try visiting the browser Fire Button. Please leave the line break") - static let onboardingGotItButton = NSLocalizedString("contextual.onboarding.got-it.button", value: "Got it!", comment: "During onboarding steps this button is shown and takes either to the next steps or closes the onboarding.") - static let onboardingFirstSearchDoneMessage = NSLocalizedString("contextual.onboarding.first-search-done.message", value: "That’s DuckDuckGo Search. Private. Fast. Fewer ads.", comment: "After the user performs their first search using the browser, this dialog explains the advantages of using DuckDuckGo") - static let onboardingFinalScreenTitle = NSLocalizedString("contextual.onboarding.final-screen.title", value: "You’ve got this!", comment: "Title of the last screen of the onboarding to the browser app") - static let onboardingFinalScreenMessage = NSLocalizedString("contextual.onboarding.final-screen.message", value: "Remember: every time you browse with me a creepy ad loses its wings. 👌", comment: "Message of the last screen of the onboarding to the browser app.") - static let onboardingFinalScreenButton = NSLocalizedString("contextual.onboarding.final-screen.button", value: "High five!", comment: "Button on the last screen of the onboarding, it will dismiss the onboarding screen.") - static let tryASearchOption1English = NSLocalizedString("contextual.onboarding.try-search.option1-English", value: "how to say “duck” in spanish", comment: "Browser Search query for how to say duck in english") - static let tryASearchOption1International = NSLocalizedString("contextual.onboarding.try-search.option1international", value: "how to say “duck” in english", comment: "Browser Search query for how to say duck in english") - static let tryASearchOption2English = NSLocalizedString("contextual.onboarding.try-search.option2-english", value: "mighty ducks cast", comment: "Search query for the cast of Mighty Ducks") - static let tryASearchOption2International = NSLocalizedString("contextual.onboarding.try-search.option2-international", value: "cast of avatar", comment: "Search query for the cast of Avatar") - static let tryASearchOption3 = NSLocalizedString("contextual.onboarding.try-search.option3", value: "local weather", comment: "Browser Search query for local weather") - static let tryASearchOptionSurpriseMeTitle = NSLocalizedString("contextual.onboarding.try-search.surprise-me-title", value: "Surprise me!", comment: "Title for a button that triggers an unknown search query for the user.") - static let tryASearchOptionSurpriseMeEnglish = NSLocalizedString("contextual.onboarding.try-search.surprise-me-english", value: "chocolate chip cookie recipes", comment: "Browser Search query for chocolate chip cookie recipes") - static let tryASearchOptionSurpriseMeInternational = NSLocalizedString("contextual.onboarding.try-search.surprise-me-international", value: "dinner recipes", comment: "Browser Search query for dinner recipes") - - static let daxDialogBrowsingWithOneTracker = NSLocalizedString("contextual.onboarding.browsing.one.tracker", value: "*%1$@* was trying to track you here. I blocked them!\n\n☝️ Tap the shield for more info.", comment: "Parameter is domain name (string)") - static let daxDialogBrowsingWithMultipleTrackers = NSLocalizedString("contextual.onboarding.browsing.multiple.trackers", comment: "First parameter is a count of additional trackers, second and third are names of the tracker networks (strings)") - } - } - - public enum HighlightsOnboardingExperiment { - enum Intro { - public static let title = NSLocalizedString("onboarding.highlights.intro.title", value: "Hi there.\n\nReady for a faster browser that keeps you protected?", comment: "The title of the onboarding dialog popup") - } - - enum BrowsersComparison { - public static let title = NSLocalizedString("onboarding.highlights.browsers.title", value: "Protections activated!", comment: "The title of the dialog to show the privacy features that DuckDuckGo offers") - - enum Features { public static let trackerBlockers = NSLocalizedString("onboarding.highlights.browsers.features.trackerBlocker.title", value: "Block 3rd party trackers", comment: "Message to highlight browser capability ofblocking 3rd party trackers") public static let cookiePopups = NSLocalizedString("onboarding.highlights.browsers.features.cookiePopups.title", value: "Block cookie requests & popups", comment: "Message to highlight how the browser allows you to block cookie pop-ups") public static let creepyAds = NSLocalizedString("onboarding.highlights.browsers.features.creepyAds.title", value: "Block targeted ads", comment: "Message to highlight browser capability of blocking creepy ads") @@ -1432,10 +1391,26 @@ AI Chat is an optional feature available at [duck.ai](ddgquicklink://duck.ai) th } enum ContextualOnboarding { + static let onboardingTryASearchTitle = NSLocalizedString("contextual.onboarding.try-a-search.title", value: "Ready to get started?\nTry a search!", comment: "Title of a popover on the browser that invites the user to try a search") static let onboardingTryASearchMessage = NSLocalizedString("contextual.onboarding.highlights.try-a-search.message", value: "Your DuckDuckGo searches are always private.", comment: "Message of a popover on the browser that invites the user to try a search explaining that their searches are private") static let onboardingFirstSearchDoneMessage = NSLocalizedString("contextual.onboarding.highlights.first-search-done.message", value: "That’s DuckDuckGo Search! Private. Fast. Fewer ads.", comment: "After the user performs their first search using the browser, this dialog explains the advantages of using DuckDuckGo") + static let onboardingTryASiteTitle = NSLocalizedString("contextual.onboarding.try-a-site.title", value: "Next, try visiting a site!", comment: "Title of a popover on the browser that invites the user to try a visiting a website") static let onboardingFinalScreenMessage = NSLocalizedString("contextual.onboarding.highlights.final-screen.message", value: "Remember: every time you browse with me a creepy ad loses its wings.", comment: "Message of the last screen of the onboarding to the browser app.") static let tryASearchOptionSurpriseMe = NSLocalizedString("contextual.onboarding.highlights.try-search.surprise-me", value: "baby ducklings", comment: "Browser Search query for baby ducklings") + static let onboardingTryASiteNTPTitle = NSLocalizedString("contextual.onboarding.ntp.try-a-site.title", value: "Try visiting a site!", comment: "Title of a popover on the new tab page browser that invites the user to try a visiting a website") + static let onboardingTryASiteMessage = NSLocalizedString("contextual.onboarding.try-a-site.message", value: "I’ll block trackers so they can’t spy on you.", comment: "Message of a popover on the browser that invites the user to try visiting a website to explain that we block trackers") + static let onboardingTryFireButtonMessage = NSLocalizedString("contextual.onboarding.try-fire-button.message", value: "Instantly clear your browsing activity with the Fire Button.\n\nGive it a try! 🔥", comment: "Message of a popover on the browser that invites the user to try visiting the browser Fire Button. Please leave the line break") + static let onboardingGotItButton = NSLocalizedString("contextual.onboarding.got-it.button", value: "Got it!", comment: "During onboarding steps this button is shown and takes either to the next steps or closes the onboarding.") + static let onboardingFinalScreenTitle = NSLocalizedString("contextual.onboarding.final-screen.title", value: "You’ve got this!", comment: "Title of the last screen of the onboarding to the browser app") + static let onboardingFinalScreenButton = NSLocalizedString("contextual.onboarding.final-screen.button", value: "High five!", comment: "Button on the last screen of the onboarding, it will dismiss the onboarding screen.") + static let tryASearchOption1English = NSLocalizedString("contextual.onboarding.try-search.option1-English", value: "how to say “duck” in spanish", comment: "Browser Search query for how to say duck in english") + static let tryASearchOption1International = NSLocalizedString("contextual.onboarding.try-search.option1international", value: "how to say “duck” in english", comment: "Browser Search query for how to say duck in english") + static let tryASearchOption2English = NSLocalizedString("contextual.onboarding.try-search.option2-english", value: "mighty ducks cast", comment: "Search query for the cast of Mighty Ducks") + static let tryASearchOption2International = NSLocalizedString("contextual.onboarding.try-search.option2-international", value: "cast of avatar", comment: "Search query for the cast of Avatar") + static let tryASearchOptionSurpriseMeTitle = NSLocalizedString("contextual.onboarding.try-search.surprise-me-title", value: "Surprise me!", comment: "Title for a button that triggers an unknown search query for the user.") + + static let daxDialogBrowsingWithOneTracker = NSLocalizedString("contextual.onboarding.browsing.one.tracker", value: "*%1$@* was trying to track you here. I blocked them!\n\n☝️ Tap the shield for more info.", comment: "Parameter is domain name (string)") + static let daxDialogBrowsingWithMultipleTrackers = NSLocalizedString("contextual.onboarding.browsing.multiple.trackers", comment: "First parameter is a count of additional trackers, second and third are names of the tracker networks (strings)") } enum FireDialog { diff --git a/DuckDuckGo/en.lproj/Localizable.strings b/DuckDuckGo/en.lproj/Localizable.strings index f65a3bac1a..79794bf690 100644 --- a/DuckDuckGo/en.lproj/Localizable.strings +++ b/DuckDuckGo/en.lproj/Localizable.strings @@ -828,15 +828,9 @@ /* Button on the last screen of the onboarding, it will dismiss the onboarding screen. */ "contextual.onboarding.final-screen.button" = "High five!"; -/* Message of the last screen of the onboarding to the browser app. */ -"contextual.onboarding.final-screen.message" = "Remember: every time you browse with me a creepy ad loses its wings. 👌"; - /* Title of the last screen of the onboarding to the browser app */ "contextual.onboarding.final-screen.title" = "You’ve got this!"; -/* After the user performs their first search using the browser, this dialog explains the advantages of using DuckDuckGo */ -"contextual.onboarding.first-search-done.message" = "That’s DuckDuckGo Search. Private. Fast. Fewer ads."; - /* During onboarding steps this button is shown and takes either to the next steps or closes the onboarding. */ "contextual.onboarding.got-it.button" = "Got it!"; @@ -855,9 +849,6 @@ /* Title of a popover on the new tab page browser that invites the user to try a visiting a website */ "contextual.onboarding.ntp.try-a-site.title" = "Try visiting a site!"; -/* Message of a popover on the browser that invites the user to try a search explaining that their searches are anonymous */ -"contextual.onboarding.try-a-search.message" = "Your DuckDuckGo searches are always anonymous."; - /* Title of a popover on the browser that invites the user to try a search */ "contextual.onboarding.try-a-search.title" = "Ready to get started?\nTry a search!"; @@ -882,15 +873,6 @@ /* Search query for the cast of Avatar */ "contextual.onboarding.try-search.option2-international" = "cast of avatar"; -/* Browser Search query for local weather */ -"contextual.onboarding.try-search.option3" = "local weather"; - -/* Browser Search query for chocolate chip cookie recipes */ -"contextual.onboarding.try-search.surprise-me-english" = "chocolate chip cookie recipes"; - -/* Browser Search query for dinner recipes */ -"contextual.onboarding.try-search.surprise-me-international" = "dinner recipes"; - /* Title for a button that triggers an unknown search query for the user. */ "contextual.onboarding.try-search.surprise-me-title" = "Surprise me!"; @@ -1899,24 +1881,9 @@ https://duckduckgo.com/mac"; /* Button to change the default browser */ "onboarding.browsers.cta" = "Choose Your Browser"; -/* Message to highlight how the browser allows you to block cookie pop-ups */ -"onboarding.browsers.features.cookiePopups.title" = "Block cookie pop-ups"; - -/* Message to highlight browser capability of blocking creepy ads */ -"onboarding.browsers.features.creepyAds.title" = "Block creepy ads"; - -/* Message to highlight browser capability of swiftly erase browsing data */ -"onboarding.browsers.features.eraseBrowsingData.title" = "Swiftly erase browsing data"; - /* Message to highlight browser capability of private searches */ "onboarding.browsers.features.privateSearch.title" = "Search privately by default"; -/* Message to highlight browser capability ofblocking 3rd party trackers */ -"onboarding.browsers.features.trackerBlocker.title" = "Block 3rd-party trackers"; - -/* The title of the dialog to show the privacy features that DuckDuckGo offers */ -"onboarding.browsers.title" = "Privacy protections activated!"; - /* The message of the option to set the address bar to the bottom. */ "onboarding.highlights.addressBarPosition.bottom.message" = "Easy to reach"; @@ -1971,9 +1938,6 @@ https://duckduckgo.com/mac"; /* Button to continue the onboarding process */ "onboarding.intro.cta" = "Let’s do it!"; -/* The title of the onboarding dialog popup */ -"onboarding.intro.title" = "Hi there.\n\nReady for a better, more private internet?"; - /* No comment provided by engineer. */ "onboarding.widgets.continueButton" = "Add Widget"; diff --git a/DuckDuckGoTests/BrowserComparisonModelTests.swift b/DuckDuckGoTests/BrowserComparisonModelTests.swift index 846c986f20..5dcbc51631 100644 --- a/DuckDuckGoTests/BrowserComparisonModelTests.swift +++ b/DuckDuckGoTests/BrowserComparisonModelTests.swift @@ -21,126 +21,46 @@ import XCTest @testable import DuckDuckGo final class BrowserComparisonModelTests: XCTestCase { - private var onboardingManager: OnboardingManagerMock! - - override func setUpWithError() throws { - try super.setUpWithError() - onboardingManager = OnboardingManagerMock() - } - - override func tearDownWithError() throws { - onboardingManager = nil - try super.tearDownWithError() - } - - func testWhenIsNotHighlightsThenBrowserComparisonFeaturePrivateSearchIsCorrect() throws { - // GIVEN - try [false, true].forEach { isOnboardingHighlightsEnabled in - onboardingManager.isOnboardingHighlightsEnabled = isOnboardingHighlightsEnabled - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - - // WHEN - let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .privateSearch })?.type.title) - - // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.BrowsersComparison.Features.privateSearch) - } - } - - func testWhenIsNotHighlightsThenBrowserComparisonFeatureBlockThirdPartyTrackersIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = false - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager + func testBrowserComparisonFeaturePrivateSearchIsCorrect() throws { // WHEN - let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockThirdPartyTrackers })?.type.title) + let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .privateSearch })?.type.title) // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.BrowsersComparison.Features.trackerBlockers) - } - - func testWhenIsHighlightsThenBrowserComparisonFeatureBlockThirdPartyTrackersIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager + XCTAssertEqual(result, UserText.Onboarding.BrowsersComparison.Features.privateSearch) - // WHEN - let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockThirdPartyTrackers })?.type.title) - - // THEN - XCTAssertEqual(result, UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.trackerBlockers) } - func testWhenIsNotHighlightsThenBrowserComparisonFeatureBlockCookiePopupsIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = false - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - + func testBrowserComparisonFeatureBlockThirdPartyTrackersIsCorrect() throws { // WHEN - let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockCookiePopups })?.type.title) + let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockThirdPartyTrackers })?.type.title) // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.BrowsersComparison.Features.cookiePopups) + XCTAssertEqual(result, UserText.Onboarding.BrowsersComparison.Features.trackerBlockers) } - func testWhenIsHighlightsThenBrowserComparisonFeatureBlockCookiePopupsIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - + func testBrowserComparisonFeatureBlockCookiePopupsIsCorrect() throws { // WHEN let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockCookiePopups })?.type.title) // THEN - XCTAssertEqual(result, UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.cookiePopups) - } - - func testWhenIsNotHighlightsThenBrowserComparisonFeatureBlockCreepyAdsIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = false - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - - // WHEN - let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockCreepyAds })?.type.title) - - // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.BrowsersComparison.Features.creepyAds) + XCTAssertEqual(result, UserText.Onboarding.BrowsersComparison.Features.cookiePopups) } - func testWhenIsHighlightsThenBrowserComparisonFeatureBlockCreepyAdsIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - + func testBrowserComparisonFeatureBlockCreepyAdsIsCorrect() throws { // WHEN let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .blockCreepyAds })?.type.title) // THEN - XCTAssertEqual(result, UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.creepyAds) + XCTAssertEqual(result, UserText.Onboarding.BrowsersComparison.Features.creepyAds) } func testWhenIsNotHighlightsThenBrowserComparisonFeatureEraseBrowsingDataIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = false - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - - // WHEN - let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .eraseBrowsingData })?.type.title) - - // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.BrowsersComparison.Features.eraseBrowsingData) - } - - func testWhenIsHighlightsThenBrowserComparisonFeatureEraseBrowsingDataIsCorrect() throws { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true - BrowsersComparisonModel.PrivacyFeature.FeatureType.onboardingManager = onboardingManager - // WHEN let result = try XCTUnwrap(BrowsersComparisonModel.privacyFeatures.first(where: { $0.type == .eraseBrowsingData })?.type.title) // THEN - XCTAssertEqual(result, UserText.HighlightsOnboardingExperiment.BrowsersComparison.Features.eraseBrowsingData) + XCTAssertEqual(result, UserText.Onboarding.BrowsersComparison.Features.eraseBrowsingData) } } diff --git a/DuckDuckGoTests/ContextualOnboardingPresenterTests.swift b/DuckDuckGoTests/ContextualOnboardingPresenterTests.swift index 5220b6dff9..c27f8caa2d 100644 --- a/DuckDuckGoTests/ContextualOnboardingPresenterTests.swift +++ b/DuckDuckGoTests/ContextualOnboardingPresenterTests.swift @@ -34,36 +34,9 @@ final class ContextualOnboardingPresenterTests: XCTestCase { try super.tearDownWithError() } - - func testWhenPresentContextualOnboardingAndVariantDoesNotSupportContextualDaxDialogsThenOldContextualOnboardingIsPresented() throws { + func testWhenPresentContextualOnboardingThenNewContextualOnboardingIsPresented() { // GIVEN - var variantManagerMock = MockVariantManager() - variantManagerMock.isSupportedBlock = { feature in - feature != .contextualDaxDialogs - } - let sut = ContextualOnboardingPresenter(variantManager: variantManagerMock, daxDialogsFactory: contextualDaxDialogsFactory) - let parent = TabViewControllerMock() - XCTAssertFalse(parent.didCallPerformSegue) - XCTAssertNil(parent.capturedSegueIdentifier) - XCTAssertNil(parent.capturedSender) - - // WHEN - sut.presentContextualOnboarding(for: .afterSearch, in: parent) - - // THEN - XCTAssertTrue(parent.didCallPerformSegue) - XCTAssertEqual(parent.capturedSegueIdentifier, "DaxDialog") - let sender = try XCTUnwrap(parent.capturedSender as? DaxDialogs.BrowsingSpec) - XCTAssertEqual(sender, DaxDialogs.BrowsingSpec.afterSearch) - } - - func testWhenPresentContextualOnboardingAndVariantSupportsContextualDaxDialogsThenThenNewContextualOnboardingIsPresented() { - // GIVEN - var variantManagerMock = MockVariantManager() - variantManagerMock.isSupportedBlock = { feature in - feature == .contextualDaxDialogs - } - let sut = ContextualOnboardingPresenter(variantManager: variantManagerMock, daxDialogsFactory: contextualDaxDialogsFactory) + let sut = ContextualOnboardingPresenter(variantManager: MockVariantManager(), daxDialogsFactory: contextualDaxDialogsFactory) let parent = TabViewControllerMock() XCTAssertFalse(parent.didCallAddChild) XCTAssertNil(parent.capturedChild) @@ -78,12 +51,8 @@ final class ContextualOnboardingPresenterTests: XCTestCase { func testWhenPresentContextualOnboardingForFireEducational_andBarAtTheTop_TheMessageHandPointsInTheRightDirection() throws { // GIVEN - var variantManagerMock = MockVariantManager() - variantManagerMock.isSupportedBlock = { feature in - feature == .contextualDaxDialogs - } let appSettings = AppSettingsMock() - let sut = ContextualOnboardingPresenter(variantManager: variantManagerMock, daxDialogsFactory: contextualDaxDialogsFactory, appSettings: appSettings) + let sut = ContextualOnboardingPresenter(variantManager: MockVariantManager(), daxDialogsFactory: contextualDaxDialogsFactory, appSettings: appSettings) let parent = TabViewControllerMock() // WHEN @@ -96,13 +65,9 @@ final class ContextualOnboardingPresenterTests: XCTestCase { func testWhenPresentContextualOnboardingForFireEducational_andBarAtTheBottom_TheMessageHandPointsInTheRightDirection() throws { // GIVEN - var variantManagerMock = MockVariantManager() - variantManagerMock.isSupportedBlock = { feature in - feature == .contextualDaxDialogs - } let appSettings = AppSettingsMock() appSettings.currentAddressBarPosition = .bottom - let sut = ContextualOnboardingPresenter(variantManager: variantManagerMock, daxDialogsFactory: contextualDaxDialogsFactory, appSettings: appSettings) + let sut = ContextualOnboardingPresenter(variantManager: MockVariantManager(), daxDialogsFactory: contextualDaxDialogsFactory, appSettings: appSettings) let parent = TabViewControllerMock() // WHEN @@ -113,14 +78,10 @@ final class ContextualOnboardingPresenterTests: XCTestCase { XCTAssertTrue(view.message.string.contains("👇")) } - func testWhenDismissContextualOnboardingAndVariantSupportsContextualDaxDialogsThenContextualOnboardingIsDismissed() { + func testWhenDismissContextualOnboardingThenContextualOnboardingIsDismissed() { // GIVEN let expectation = self.expectation(description: #function) - var variantManagerMock = MockVariantManager() - variantManagerMock.isSupportedBlock = { feature in - feature == .contextualDaxDialogs - } - let sut = ContextualOnboardingPresenter(variantManager: variantManagerMock, daxDialogsFactory: contextualDaxDialogsFactory) + let sut = ContextualOnboardingPresenter(variantManager: MockVariantManager(), daxDialogsFactory: contextualDaxDialogsFactory) let parent = TabViewControllerMock() let daxController = DaxContextualOnboardingControllerMock() daxController.removeFromParentExpectation = expectation @@ -140,29 +101,6 @@ final class ContextualOnboardingPresenterTests: XCTestCase { XCTAssertFalse(parent.daxDialogsStackView.arrangedSubviews.contains(daxController.view)) } - func testWhenDismissContextualOnboardingAndVariantDoesNotSupportsContextualDaxDialogsThenNothingHappens() { - // GIVEN - let expectation = self.expectation(description: #function) - expectation.isInverted = true - var variantManagerMock = MockVariantManager() - variantManagerMock.isSupportedBlock = { feature in - feature != .contextualDaxDialogs - } - let sut = ContextualOnboardingPresenter(variantManager: variantManagerMock, daxDialogsFactory: contextualDaxDialogsFactory) - let parent = TabViewControllerMock() - let daxController = DaxContextualOnboardingControllerMock() - daxController.removeFromParentExpectation = expectation - parent.daxContextualOnboardingController = daxController - XCTAssertFalse(daxController.didCallRemoveFromParent) - - // WHEN - sut.dismissContextualOnboardingIfNeeded(from: parent) - - // THEN - waitForExpectations(timeout: 0.4) - XCTAssertFalse(daxController.didCallRemoveFromParent) - } - } final class TabViewControllerMock: UIViewController, TabViewOnboardingDelegate { diff --git a/DuckDuckGoTests/DaxDialogTests.swift b/DuckDuckGoTests/DaxDialogTests.swift index 7a512f5cae..dab3924ac5 100644 --- a/DuckDuckGoTests/DaxDialogTests.swift +++ b/DuckDuckGoTests/DaxDialogTests.swift @@ -71,34 +71,17 @@ final class DaxDialog: XCTestCase { setupUserDefault(with: #file) entityProvider = MockEntityProvider() } - - func testWhenResumingRegularFlowThenNextHomeMessageIsBlankUntilBrowsingMessagesShown() { - mockVariantManager.isSupportedReturns = false - onboarding.enableAddFavoriteFlow() - onboarding.resumeRegularFlow() - XCTAssertNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.google))) - XCTAssertEqual(onboarding.nextHomeScreenMessage(), .final) - XCTAssertEqual(settings.homeScreenMessagesSeen, 2) - } func testWhenStartingAddFavoriteFlowThenNextMessageIsAddFavorite() { + // WHEN onboarding.enableAddFavoriteFlow() - XCTAssertEqual(onboarding.nextHomeScreenMessage(), .addFavorite) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - XCTAssertTrue(onboarding.isAddFavoriteFlow) - } - func testWhenStartingNextMessageAndAddFavoriteFlowThenNextHomeScreenMessagesSeenDoesNotIncrement() { - XCTAssertNotNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - onboarding.enableAddFavoriteFlow() - XCTAssertEqual(onboarding.nextHomeScreenMessage(), .addFavorite) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) + // THEN + XCTAssertEqual(onboarding.nextHomeScreenMessageNew(), .addFavorite) + XCTAssertTrue(onboarding.isAddFavoriteFlow) } - func testWhenEachVersionOfTrackersMessageIsShownThenFormattedCorrectlyAndNotShownAgain() { + func testWhenEachVersionOfTrackersMessageIsShownThenFormattedCorrectly() { let testCases = [ (urls: [ URLs.google ], expected: DaxDialogs.BrowsingSpec.withOneTracker.format(args: "Google"), line: #line), (urls: [ URLs.google, URLs.amazon ], expected: DaxDialogs.BrowsingSpec.withMultipleTrackers.format(args: 0, "Google", "Amazon.com"), line: #line), @@ -124,172 +107,9 @@ final class DaxDialog: XCTestCase { // Assert the expected case XCTAssertEqual(testCase.expected, onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo), line: UInt(testCase.line)) - - // Also assert the we don't see the message on subsequent calls - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo), line: UInt(testCase.line)) } } - - func testWhenTrackersShownThenFireEducationShown() { - let privacyInfo = makePrivacyInfo(url: URLs.example) - privacyInfo.trackerInfo.addDetectedTracker(detectedTrackerFrom(URLs.google, pageUrl: URLs.example.absoluteString), - onPageWithURL: URLs.example) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - } - - func testWhenMajorTrackerShownThenFireEducationShown() { - let privacyInfo = makePrivacyInfo(url: URLs.google) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - } - - func testWhenSearchShownThenNoTrackersIsShown() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg))) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - } - - func testWhenMajorTrackerShownThenNoTrackersIsNotShown() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.facebook))) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - } - - func testWhenTrackersShownThenNoTrackersIsNotShown() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.amazon))) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - } - - func testWhenMajorTrackerShownThenOwnedByIsNotShown() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.facebook))) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ownedByFacebook))) - } - - func testWhenSecondTimeOnSiteThatIsOwnedByFacebookThenShowNothingAfterFireEducation() { - let privacyInfo = makePrivacyInfo(url: URLs.ownedByFacebook) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenFirstTimeOnSiteThatIsOwnedByFacebookThenShowOwnedByMajorTrackingMessage() { - let privacyInfo = makePrivacyInfo(url: URLs.ownedByFacebook) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.BrowsingSpec.siteOwnedByMajorTracker.format(args: "instagram.com", "Facebook", 39.0), - onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenSecondTimeOnSiteThatIsMajorTrackerThenShowNothingAfterFireEducation() { - let privacyInfo = makePrivacyInfo(url: URLs.facebook) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenFirstTimeOnFacebookThenShowMajorTrackingMessage() { - let privacyInfo = makePrivacyInfo(url: URLs.facebook) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.BrowsingSpec.siteIsMajorTracker.format(args: "Facebook", URLs.facebook.host ?? ""), - onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenFirstTimeOnGoogleThenShowMajorTrackingMessage() { - let privacyInfo = makePrivacyInfo(url: URLs.google) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.BrowsingSpec.siteIsMajorTracker.format(args: "Google", URLs.google.host ?? ""), - onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenSecondTimeOnPageWithNoTrackersThenTrackersThenShowFireEducation() { - let privacyInfo = makePrivacyInfo(url: URLs.example) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenFirstTimeOnPageWithNoTrackersThenTrackersThenShowNoTrackersMessage() { - let privacyInfo = makePrivacyInfo(url: URLs.example) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.BrowsingSpec.withoutTrackers, onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenSecondTimeOnSearchPageThenShowNothing() { - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg))) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg))) - } - - func testWhenFirstTimeOnSearchPageThenShowSearchPageMessage() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.BrowsingSpec.afterSearch, onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg))) - } - - func testWhenOnSamePageAndPresenceOfTrackersChangesThenShowOnlyOneMessage() { - let privacyInfo = makePrivacyInfo(url: URLs.example) - XCTAssertEqual(DaxDialogs.BrowsingSpec.withoutTrackers, onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - - let privacyInfoWithTrackers = makePrivacyInfo(url: URLs.google) - privacyInfo.trackerInfo = privacyInfoWithTrackers.trackerInfo - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: privacyInfo)) - } - - func testWhenDimissedThenShowNothing() { - onboarding.dismiss() - XCTAssertNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 0) - XCTAssertNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - } - - func testWhenThirdTimeOnHomeScreenAndFireEducationSeenThenShowNothing() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.HomeScreenSpec.final, onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 2) - XCTAssertNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 2) - } - - func testWhenSecondTimeOnHomeScreenAndFireEducationSeenThenShowSubsequentDialog() { - XCTAssertFalse(onboarding.shouldShowFireButtonPulse) - XCTAssertNotNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - XCTAssertNotNil(onboarding.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) - XCTAssertTrue(onboarding.shouldShowFireButtonPulse) - XCTAssertEqual(DaxDialogs.HomeScreenSpec.final, onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 2) - } - - func testWhenSecondTimeOnHomeScreenAndNoOtherDialogsSeenThenShowNothing() { - XCTAssertNotNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - XCTAssertNil(onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - } - - func testWhenFirstTimeOnHomeScreenThenShowFirstDialog() { - XCTAssertEqual(DaxDialogs.HomeScreenSpec.initial, onboarding.nextHomeScreenMessage()) - XCTAssertEqual(settings.homeScreenMessagesSeen, 1) - } func testWhenPrimingDaxDialogForUseThenDismissedIsFalse() { let settings = InMemoryDaxDialogsSettings() @@ -304,12 +124,9 @@ final class DaxDialog: XCTestCase { XCTAssertTrue(DefaultDaxDialogsSettings().isDismissed) } - // MARK: - Experiment - - func testWhenExperimentAndBrowsingSpecIsWithOneTrackerThenHighlightAddressBarIsFalse() throws { + func testWhenBrowsingSpecIsWithOneTrackerThenHighlightAddressBarIsFalse() throws { // GIVEN - mockVariantManager.isSupportedReturns = true - let sut = makeExperimentSUT(settings: InMemoryDaxDialogsSettings()) + let sut = makeSUT(settings: InMemoryDaxDialogsSettings()) let privacyInfo = makePrivacyInfo(url: URLs.example) let detectedTracker = detectedTrackerFrom(URLs.google, pageUrl: URLs.example.absoluteString) privacyInfo.trackerInfo.addDetectedTracker(detectedTracker, onPageWithURL: URLs.example) @@ -322,10 +139,9 @@ final class DaxDialog: XCTestCase { XCTAssertFalse(result.highlightAddressBar) } - func testWhenExperimentAndBrowsingSpecIsWithMultipleTrackerThenHighlightAddressBarIsFalse() throws { + func testWhenBrowsingSpecIsWithMultipleTrackerThenHighlightAddressBarIsFalse() throws { // GIVEN - mockVariantManager.isSupportedReturns = true - let sut = makeExperimentSUT(settings: InMemoryDaxDialogsSettings()) + let sut = makeSUT(settings: InMemoryDaxDialogsSettings()) let privacyInfo = makePrivacyInfo(url: URLs.example) [URLs.google, URLs.amazon].forEach { tracker in let detectedTracker = detectedTrackerFrom(tracker, pageUrl: URLs.example.absoluteString) @@ -340,11 +156,11 @@ final class DaxDialog: XCTestCase { XCTAssertFalse(result.highlightAddressBar) } - func testWhenExperimentGroupAndURLIsDuckDuckGoSearchAndSearchDialogHasNotBeenSeenThenReturnSpecTypeAfterSearch() { + func testWhenURLIsDuckDuckGoSearchAndSearchDialogHasNotBeenSeenThenReturnSpecTypeAfterSearch() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingAfterSearchShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg)) @@ -353,11 +169,11 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .afterSearch) } - func testWhenExperimentGroupAndURLIsMajorTrackerWebsiteAndMajorTrackerDialogHasNotBeenSeenThenReturnSpecTypeSiteIsMajorTracker() { + func testWhenURLIsMajorTrackerWebsiteAndMajorTrackerDialogHasNotBeenSeenThenReturnSpecTypeSiteIsMajorTracker() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingMajorTrackingSiteShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.facebook) // WHEN @@ -367,11 +183,11 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .siteIsMajorTracker) } - func testWhenExperimentGroupAndURLIsOwnedByMajorTrackerAndMajorTrackerDialogHasNotBeenSeenThenReturnSpecTypeSiteOwnedByMajorTracker() { + func testWhenURLIsOwnedByMajorTrackerAndMajorTrackerDialogHasNotBeenSeenThenReturnSpecTypeSiteOwnedByMajorTracker() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingMajorTrackingSiteShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.ownedByFacebook) // WHEN @@ -381,11 +197,11 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .siteOwnedByMajorTracker) } - func testWhenExperimentGroupAndURLHasTrackersAndMultipleTrackersDialogHasNotBeenSeenThenReturnSpecTypeWithMultipleTrackers() { + func testWhenURLHasTrackersAndMultipleTrackersDialogHasNotBeenSeenThenReturnSpecTypeWithMultipleTrackers() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.example) [URLs.google, URLs.amazon].forEach { url in let detectedTracker = detectedTrackerFrom(url, pageUrl: URLs.example.absoluteString) @@ -399,11 +215,11 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .withMultipleTrackers) } - func testWhenExperimentGroupAndURLHasNoTrackersAndIsNotSERPAndNoTrakcersDialogHasNotBeenSeenThenReturnSpecTypeWithoutTrackers() { + func testWhenURLHasNoTrackersAndIsNotSERPAndNoTrakcersDialogHasNotBeenSeenThenReturnSpecTypeWithoutTrackers() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithoutTrackersShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example)) @@ -412,13 +228,11 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .withoutTrackers) } - func testWhenExperimentGroupAndURLIsDuckDuckGoSearchAndHasVisitedWebsiteThenSpecTypeSearchIsReturned() throws { + func testWhenURLIsDuckDuckGoSearchAndHasVisitedWebsiteThenSpecTypeSearchIsReturned() throws { try [DaxDialogs.BrowsingSpec.withoutTrackers, .siteIsMajorTracker, .siteOwnedByMajorTracker, .withOneTracker, .withMultipleTrackers].forEach { spec in // GIVEN - let isExperiment = true - let mockVariantManager = MockVariantManager(isSupportedReturns: isExperiment) let settings = InMemoryDaxDialogsSettings() - let sut = DaxDialogs(settings: settings, entityProviding: entityProvider, variantManager: mockVariantManager) + let sut = DaxDialogs(settings: settings, entityProviding: entityProvider) sut.overrideShownFlagFor(spec, flag: true) // WHEN @@ -429,12 +243,12 @@ final class DaxDialog: XCTestCase { } } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogNotSeen_AndSearchDone_ThenFinalBrowsingSpecIsReturned() throws { + func testWhenFireButtonSeen_AndFinalDialogNotSeen_AndSearchDone_ThenFinalBrowsingSpecIsReturned() throws { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingAfterSearchShown = true settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = try XCTUnwrap(sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg))) @@ -443,12 +257,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result, .final) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogNotSeen_AndWebsiteWithoutTracker_ThenFinalBrowsingSpecIsReturned() throws { + func testWhenFireButtonSeen_AndFinalDialogNotSeen_AndWebsiteWithoutTracker_ThenFinalBrowsingSpecIsReturned() throws { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithoutTrackersShown = true settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = try XCTUnwrap(sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example))) @@ -457,12 +271,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result, .final) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogNotSeen_AndWebsiteWithTracker_ThenFinalBrowsingSpecIsReturned() throws { + func testWhenFireButtonSeen_AndFinalDialogNotSeen_AndWebsiteWithTracker_ThenFinalBrowsingSpecIsReturned() throws { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.example) let detectedTracker = detectedTrackerFrom(URLs.google, pageUrl: URLs.example.absoluteString) privacyInfo.trackerInfo.addDetectedTracker(detectedTracker, onPageWithURL: URLs.example) @@ -474,12 +288,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result, .final) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogNotSeen_AndWebsiteMajorTracker_ThenFinalBrowsingSpecIsReturned() throws { + func testWhenFireButtonSeen_AndFinalDialogNotSeen_AndWebsiteMajorTracker_ThenFinalBrowsingSpecIsReturned() throws { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingMajorTrackingSiteShown = true settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.ownedByFacebook) // WHEN @@ -489,13 +303,13 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result, .final) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogSeen_AndSearchDone_ThenBrowsingSpecIsNil() { + func testWhenFireButtonSeen_AndFinalDialogSeen_AndSearchDone_ThenBrowsingSpecIsNil() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingAfterSearchShown = true settings.fireMessageExperimentShown = true settings.browsingFinalDialogShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg)) @@ -504,13 +318,13 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogSeen_AndWebsiteWithoutTracker_ThenBrowsingSpecIsNotFinal() { + func testWhenFireButtonSeen_AndFinalDialogSeen_AndWebsiteWithoutTracker_ThenBrowsingSpecIsNotFinal() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithoutTrackersShown = true settings.fireMessageExperimentShown = true settings.browsingFinalDialogShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example)) @@ -519,13 +333,13 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogSeen_AndWebsiteWithTracker_ThenBrowsingSpecIsNil() { + func testWhenFireButtonSeen_AndFinalDialogSeen_AndWebsiteWithTracker_ThenBrowsingSpecIsNil() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.fireMessageExperimentShown = true settings.browsingFinalDialogShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.example) let detectedTracker = detectedTrackerFrom(URLs.google, pageUrl: URLs.example.absoluteString) privacyInfo.trackerInfo.addDetectedTracker(detectedTracker, onPageWithURL: URLs.example) @@ -537,13 +351,13 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogSeen_AndWebsiteMajorTracker_ThenFinalBrowsingSpecIsReturned() { + func testWhenFireButtonSeen_AndFinalDialogSeen_AndWebsiteMajorTracker_ThenFinalBrowsingSpecIsReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingMajorTrackingSiteShown = true settings.fireMessageExperimentShown = true settings.browsingFinalDialogShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) let privacyInfo = makePrivacyInfo(url: URLs.ownedByFacebook) // WHEN @@ -553,7 +367,7 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result) } - func testWhenExperimentGroup_AndFireButtonSeen_AndFinalDialogSeen_AndSearchNotSeen_ThenAfterSearchSpecIsReturned() { + func testWhenFireButtonSeen_AndFinalDialogSeen_AndSearchNotSeen_ThenAfterSearchSpecIsReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithoutTrackersShown = true @@ -561,7 +375,7 @@ final class DaxDialog: XCTestCase { settings.browsingMajorTrackingSiteShown = true settings.fireMessageExperimentShown = true settings.browsingFinalDialogShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg)) @@ -570,10 +384,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result, .afterSearch) } - func testWhenExperimentGroup_AndSearchDialogSeen_OnReload_SearchDialogReturned() { + func testWhenSearchDialogSeen_OnReload_SearchDialogReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg)) @@ -584,10 +398,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result1, result2) } - func testWhenExperimentGroup_AndSearchDialogSeen_OnLoadingAnotherSearch_NilReturned() { + func testWhenSearchDialogSeen_OnLoadingAnotherSearch_NilReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ddg)) @@ -598,10 +412,10 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result2) } - func testWhenExperimentGroup_AndMajorTrackerDialogSeen_OnReload_MajorTrackerDialogReturned() { + func testWhenMajorTrackerDialogSeen_OnReload_MajorTrackerDialogReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.facebook)) @@ -612,10 +426,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result1, result2) } - func testWhenExperimentGroup_AndMajorTrackerDialogSeen_OnLoadingAnotherSearch_NilReturned() { + func testWhenMajorTrackerDialogSeen_OnLoadingAnotherSearch_NilReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.facebook)) @@ -626,10 +440,10 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result2) } - func testWhenExperimentGroup_AndMajorTrackerOwnerMessageSeen_OnReload_MajorTrackerOwnerDialogReturned() { + func testWhenMajorTrackerOwnerMessageSeen_OnReload_MajorTrackerOwnerDialogReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ownedByFacebook)) @@ -640,10 +454,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result1, result2) } - func testWhenExperimentGroup_AndMajorTrackerOwnerMessageSeen_OnLoadingAnotherSearch_NilReturned() { + func testWhenMajorTrackerOwnerMessageSeen_OnLoadingAnotherSearch_NilReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ownedByFacebook)) @@ -654,10 +468,10 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result2) } - func testWhenExperimentGroup_AndWithoutTrackersMessageSeen_OnReload_WithoutTrackersDialogReturned() { + func testWhenWithoutTrackersMessageSeen_OnReload_WithoutTrackersDialogReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.tracker)) @@ -668,10 +482,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result1, result2) } - func testWhenExperimentGroup_AndWithoutTrackersMessageSeen_OnLoadingAnotherSearch_NilReturned() { + func testWhenWithoutTrackersMessageSeen_OnLoadingAnotherSearch_NilReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.tracker)) @@ -682,12 +496,12 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result2) } - func testWhenExperimentGroup_AndFinalMessageSeen_OnReload_NilReturned() { + func testWhenFinalMessageSeen_OnReload_NilReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithoutTrackersShown = true settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result1 = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.example)) @@ -698,10 +512,10 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result2) } - func testWhenExperimentGroup_AndVisitWebsiteSeen_OnReload_VisitWebsiteReturned() { + func testWhenVisitWebsiteSeen_OnReload_VisitWebsiteReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.setSearchMessageSeen() // WHEN @@ -716,10 +530,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result2, result3) } - func testWhenExperimentGroup_AndVisitWebsiteSeen_OnLoadingAnotherSearch_NilIseturned() { + func testWhenVisitWebsiteSeen_OnLoadingAnotherSearch_NilIseturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.setSearchMessageSeen() // WHEN @@ -734,10 +548,10 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result3) } - func testWhenExperimentGroup_AndFireMessageSeen_OnReload_FireMessageReturned() { + func testWhenFireMessageSeen_OnReload_FireMessageReturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.setSearchMessageSeen() // WHEN @@ -752,10 +566,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result2, result3) } - func testWhenExperimentGroup_AndSearchNotSeen_AndFireMessageSeen_OnLoadingAnotherSearch_ExpectedDialogIseturned() { + func testWhenSearchNotSeen_AndFireMessageSeen_OnLoadingAnotherSearch_ExpectedDialogIseturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.setSearchMessageSeen() // WHEN @@ -770,10 +584,10 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result3?.type, .afterSearch) } - func testWhenExperimentGroup_AndSearchSeen_AndFireMessageSeen_OnLoadingAnotherSearch_ExpectedDialogIseturned() { + func testWhenSearchSeen_AndFireMessageSeen_OnLoadingAnotherSearch_ExpectedDialogIseturned() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.setSearchMessageSeen() // WHEN @@ -791,12 +605,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result4?.type, .final) } - func testWhenExperimentGroup_AndBrowserWithTrackersShown_AndPrivacyAnimationNotShown_ThenShowPrivacyAnimationPulse() { + func testWhenBrowserWithTrackersShown_AndPrivacyAnimationNotShown_ThenShowPrivacyAnimationPulse() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.privacyButtonPulseShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.shouldShowPrivacyButtonPulse @@ -805,12 +619,12 @@ final class DaxDialog: XCTestCase { XCTAssertTrue(result) } - func testWhenExperimentGroup_AndBrowserWithTrackersShown_AndPrivacyAnimationShown_ThenDoNotShowPrivacyAnimationPulse() { + func testWhenBrowserWithTrackersShown_AndPrivacyAnimationShown_ThenDoNotShowPrivacyAnimationPulse() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.privacyButtonPulseShown = true - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.shouldShowPrivacyButtonPulse @@ -819,12 +633,12 @@ final class DaxDialog: XCTestCase { XCTAssertFalse(result) } - func testWhenExperimentGroup_AndBrowserWithTrackersShown_AndFireButtonPulseActive_ThenDoNotShowPrivacyAnimationPulse() { + func testWhenBrowserWithTrackersShown_AndFireButtonPulseActive_ThenDoNotShowPrivacyAnimationPulse() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.privacyButtonPulseShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.fireButtonPulseStarted() // WHEN @@ -834,10 +648,10 @@ final class DaxDialog: XCTestCase { XCTAssertFalse(result) } - func testWhenExperimentGroup_AndCallSetPrivacyButtonPulseSeen_ThenSetPrivacyButtonPulseShownFlagToTrue() { + func testWhenCallSetPrivacyButtonPulseSeen_ThenSetPrivacyButtonPulseShownFlagToTrue() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) XCTAssertFalse(settings.privacyButtonPulseShown) // WHEN @@ -847,10 +661,10 @@ final class DaxDialog: XCTestCase { XCTAssertTrue(settings.privacyButtonPulseShown) } - func testWhenExperimentGroup_AndSetFireEducationMessageSeenIsCalled_ThenSetPrivacyButtonPulseShownToTrue() { + func testWhenSetFireEducationMessageSeenIsCalled_ThenSetPrivacyButtonPulseShownToTrue() { // GIVEN let settings = InMemoryDaxDialogsSettings() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) XCTAssertFalse(settings.privacyButtonPulseShown) // WHEN @@ -860,13 +674,13 @@ final class DaxDialog: XCTestCase { XCTAssertTrue(settings.privacyButtonPulseShown) } - func testWhenExperimentGroup_AndFireButtonAnimationPulseNotShown__AndShouldShowFireButtonPulseIsCalled_ThenReturnTrue() { + func testWhenFireButtonAnimationPulseNotShown__AndShouldShowFireButtonPulseIsCalled_ThenReturnTrue() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.privacyButtonPulseShown = true settings.browsingWithTrackersShown = true settings.fireButtonPulseDateShown = nil - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.shouldShowFireButtonPulse @@ -875,13 +689,13 @@ final class DaxDialog: XCTestCase { XCTAssertTrue(result) } - func testWhenExperimentGroup_AndFireButtonAnimationPulseShown_AndShouldShowFireButtonPulseIsCalled_ThenReturnFalse() { + func testWhenFireButtonAnimationPulseShown_AndShouldShowFireButtonPulseIsCalled_ThenReturnFalse() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.privacyButtonPulseShown = true settings.browsingWithTrackersShown = true settings.fireButtonPulseDateShown = Date() - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.shouldShowFireButtonPulse @@ -890,12 +704,12 @@ final class DaxDialog: XCTestCase { XCTAssertFalse(result) } - func testWhenExperimentGroup_AndFireEducationMessageSeen_AndFinalMessageNotSeen_ThenShowFinalMessage() { + func testWhenFireEducationMessageSeen_AndFinalMessageNotSeen_ThenShowFinalMessage() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.fireMessageExperimentShown = true settings.browsingFinalDialogShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextHomeScreenMessageNew() @@ -904,12 +718,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result, .final) } - func testWhenExperimentGroup_AndNextHomeScreenMessageNewIsCalled_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() { + func testWhenNextHomeScreenMessageNewIsCalled_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.lastShownContextualOnboardingDialogType = DaxDialogs.BrowsingSpec.fire.type.rawValue settings.lastVisitedOnboardingWebsiteURLPath = "https://www.example.com" - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) XCTAssertNotNil(settings.lastShownContextualOnboardingDialogType) XCTAssertNotNil(settings.lastVisitedOnboardingWebsiteURLPath) @@ -921,54 +735,24 @@ final class DaxDialog: XCTestCase { XCTAssertNil(settings.lastVisitedOnboardingWebsiteURLPath) } - func testWhenExperimentGroup_AndCanEnableAddFavoritesFlowIsCalled_ThenReturnFalse() { + func testWhenEnableAddFavoritesFlowIsCalled_ThenIsAddFavoriteFlowIsTrue() { // GIVEN - let sut = makeExperimentSUT(settings: InMemoryDaxDialogsSettings()) - - // WHEN - let result = sut.canEnableAddFavoriteFlow() - - // THEN - XCTAssertFalse(result) - } - - func testWhenControlGroup_AndCanEnableAddFavoritesFlowIsCalled_ThenReturnTrue() { - // WHEN - let result = onboarding.canEnableAddFavoriteFlow() - - // THEN - XCTAssertTrue(result) - } - - func testWhenControlGroup_AndEnableAddFavoritesFlowIsCalled_ThenIsAddFavoriteFlowIsTrue() { - // GIVEN - XCTAssertFalse(onboarding.isAddFavoriteFlow) - - // WHEN - onboarding.enableAddFavoriteFlow() - - // THEN - XCTAssertTrue(onboarding.isAddFavoriteFlow) - } - - func testWhenExperimentGroup_AndEnableAddFavoritesFlowIsCalled_ThenIsAddFavoriteFlowIsFalse() { - // GIVEN - let sut = makeExperimentSUT(settings: InMemoryDaxDialogsSettings()) + let sut = makeSUT(settings: InMemoryDaxDialogsSettings()) XCTAssertFalse(sut.isAddFavoriteFlow) // WHEN sut.enableAddFavoriteFlow() // THEN - XCTAssertFalse(sut.isAddFavoriteFlow) + XCTAssertTrue(sut.isAddFavoriteFlow) } - func testWhenExperimentGroup_AndBlockedTrackersDialogSeen_AndMajorTrackerNotSeen_ThenReturnNilSpec() { + func testWhenBlockedTrackersDialogSeen_AndMajorTrackerNotSeen_ThenReturnNilSpec() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.browsingMajorTrackingSiteShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.facebook)) @@ -977,12 +761,12 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result) } - func testWhenExperimentGroup_AndBlockedTrackersDialogNotSeen_AndMajorTrackerNotSeen_ThenReturnMajorNetworkSpec() { + func testWhenBlockedTrackersDialogNotSeen_AndMajorTrackerNotSeen_ThenReturnMajorNetworkSpec() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = false settings.browsingMajorTrackingSiteShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.facebook)) @@ -991,12 +775,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .siteIsMajorTracker) } - func testWhenExperimentGroup_AndBlockedTrackersDialogSeen_AndOwnedByMajorTrackerNotSeen_ThenReturnNilSpec() { + func testWhenBlockedTrackersDialogSeen_AndOwnedByMajorTrackerNotSeen_ThenReturnNilSpec() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = true settings.browsingMajorTrackingSiteShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ownedByFacebook)) @@ -1005,12 +789,12 @@ final class DaxDialog: XCTestCase { XCTAssertNil(result) } - func testWhenExperimentGroup_AndBlockedTrackersDialogNotSeen_AndOwnedByMajorTrackerNotSeen_ThenReturnOwnedByMajorNetworkSpec() { + func testWhenBlockedTrackersDialogNotSeen_AndOwnedByMajorTrackerNotSeen_ThenReturnOwnedByMajorNetworkSpec() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.browsingWithTrackersShown = false settings.browsingMajorTrackingSiteShown = false - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) // WHEN let result = sut.nextBrowsingMessageIfShouldShow(for: makePrivacyInfo(url: URLs.ownedByFacebook)) @@ -1019,12 +803,12 @@ final class DaxDialog: XCTestCase { XCTAssertEqual(result?.type, .siteOwnedByMajorTracker) } - func testWhenExperimentGroup_AndDismissIsCalled_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() { + func testWhenDismissIsCalled_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.lastShownContextualOnboardingDialogType = DaxDialogs.BrowsingSpec.fire.type.rawValue settings.lastVisitedOnboardingWebsiteURLPath = "https://www.example.com" - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) XCTAssertNotNil(settings.lastShownContextualOnboardingDialogType) XCTAssertNotNil(settings.lastVisitedOnboardingWebsiteURLPath) @@ -1036,12 +820,12 @@ final class DaxDialog: XCTestCase { XCTAssertNil(settings.lastVisitedOnboardingWebsiteURLPath) } - func testWhenExperimentGroup_AndSetDaxDialogDismiss_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() { + func testWhenSetDaxDialogDismiss_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.lastShownContextualOnboardingDialogType = DaxDialogs.BrowsingSpec.fire.type.rawValue settings.lastVisitedOnboardingWebsiteURLPath = "https://www.example.com" - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) XCTAssertNotNil(settings.lastShownContextualOnboardingDialogType) XCTAssertNotNil(settings.lastVisitedOnboardingWebsiteURLPath) @@ -1053,12 +837,12 @@ final class DaxDialog: XCTestCase { XCTAssertNil(settings.lastVisitedOnboardingWebsiteURLPath) } - func testWhenExperimentGroup_AndClearedBrowserDataIsCalled_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() throws { + func testWhenClearedBrowserDataIsCalled_ThenLastVisitedOnboardingWebsiteAndLastShownDaxDialogAreSetToNil() throws { // GIVEN let settings = InMemoryDaxDialogsSettings() settings.lastShownContextualOnboardingDialogType = DaxDialogs.BrowsingSpec.fire.type.rawValue settings.lastVisitedOnboardingWebsiteURLPath = "https://www.example.com" - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) XCTAssertNotNil(settings.lastShownContextualOnboardingDialogType) XCTAssertNotNil(settings.lastVisitedOnboardingWebsiteURLPath) @@ -1070,14 +854,14 @@ final class DaxDialog: XCTestCase { XCTAssertNil(settings.lastVisitedOnboardingWebsiteURLPath) } - func testWhenExperimentGroup_AndIsEnabledIsFalse_AndReloadWebsite_ThenReturnNilBrowsingSpec() throws { + func testWhenIsEnabledIsFalse_AndReloadWebsite_ThenReturnNilBrowsingSpec() throws { // GIVEN let lastVisitedWebsitePath = "https://www.example.com" let lastVisitedWebsiteURL = try XCTUnwrap(URL(string: lastVisitedWebsitePath)) let settings = InMemoryDaxDialogsSettings() settings.lastShownContextualOnboardingDialogType = DaxDialogs.BrowsingSpec.fire.type.rawValue settings.lastVisitedOnboardingWebsiteURLPath = lastVisitedWebsitePath - let sut = makeExperimentSUT(settings: settings) + let sut = makeSUT(settings: settings) sut.dismiss() // WHEN @@ -1089,9 +873,7 @@ final class DaxDialog: XCTestCase { func testWhenIsEnabledIsCalled_AndShouldShowDaxDialogsIsTrue_ThenReturnTrue() { // GIVEN - var mockVariantManager = MockVariantManager() - mockVariantManager.currentVariant = MockVariant(features: [.newOnboardingIntro, .contextualDaxDialogs]) - let sut = DaxDialogs(settings: settings, entityProviding: entityProvider, variantManager: mockVariantManager) + let sut = DaxDialogs(settings: settings, entityProviding: entityProvider) // WHEN let result = sut.isEnabled @@ -1107,7 +889,7 @@ final class DaxDialog: XCTestCase { let onboardingManagerMock = OnboardingManagerMock() onboardingManagerMock.addToDockEnabledState = .contextual settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings, onboardingManager: onboardingManagerMock) + let sut = makeSUT(settings: settings, onboardingManager: onboardingManagerMock) _ = sut.nextHomeScreenMessageNew() // WHEN @@ -1121,7 +903,7 @@ final class DaxDialog: XCTestCase { // GIVEN let onboardingManagerMock = OnboardingManagerMock() onboardingManagerMock.addToDockEnabledState = .contextual - let sut = makeExperimentSUT(settings: settings, onboardingManager: onboardingManagerMock) + let sut = makeSUT(settings: settings, onboardingManager: onboardingManagerMock) _ = sut.nextHomeScreenMessageNew() // WHEN @@ -1136,7 +918,7 @@ final class DaxDialog: XCTestCase { let onboardingManagerMock = OnboardingManagerMock() onboardingManagerMock.addToDockEnabledState = .disabled settings.fireMessageExperimentShown = true - let sut = makeExperimentSUT(settings: settings, onboardingManager: onboardingManagerMock) + let sut = makeSUT(settings: settings, onboardingManager: onboardingManagerMock) _ = sut.nextHomeScreenMessageNew() // WHEN @@ -1169,11 +951,7 @@ final class DaxDialog: XCTestCase { protectionStatus: protectionStatus) } - private func makeExperimentSUT(settings: DaxDialogsSettings, onboardingManager: OnboardingAddToDockManaging = OnboardingManagerMock()) -> DaxDialogs { - var mockVariantManager = MockVariantManager() - mockVariantManager.isSupportedBlock = { feature in - feature == .contextualDaxDialogs - } - return DaxDialogs(settings: settings, entityProviding: entityProvider, variantManager: mockVariantManager, onboardingManager: onboardingManager) + private func makeSUT(settings: DaxDialogsSettings, onboardingManager: OnboardingAddToDockManaging = OnboardingManagerMock()) -> DaxDialogs { + DaxDialogs(settings: settings, entityProviding: entityProvider, variantManager: MockVariantManager(), onboardingManager: onboardingManager) } } diff --git a/DuckDuckGoTests/DaxDialogsNewTabTests.swift b/DuckDuckGoTests/DaxDialogsNewTabTests.swift index 23f3617765..d99af3291e 100644 --- a/DuckDuckGoTests/DaxDialogsNewTabTests.swift +++ b/DuckDuckGoTests/DaxDialogsNewTabTests.swift @@ -38,7 +38,6 @@ final class DaxDialogsNewTabTests: XCTestCase { } func testIfIsAddFavoriteFlow_OnNextHomeScreenMessageNew_ReturnsAddFavorite() { - XCTExpectFailure("Add Favrite flow, is currenty disabled for new onboarding. Remove failure expectation once we support it.") // GIVEN daxDialogs.enableAddFavoriteFlow() diff --git a/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift b/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift deleted file mode 100644 index f9641c8fd1..0000000000 --- a/DuckDuckGoTests/DefaultVariantManagerOnboardingTests.swift +++ /dev/null @@ -1,117 +0,0 @@ -// -// DefaultVariantManagerOnboardingTests.swift -// DuckDuckGo -// -// Copyright © 2024 DuckDuckGo. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import XCTest -import BrowserServicesKit -@testable import Core -@testable import DuckDuckGo - -final class DefaultVariantManagerOnboardingTests: XCTestCase { - - // MARK: - Is Onboarding Highlights - - func testWhenIsOnboardingHighlights_AndFeaturesContainOnboardingHighlights_ThenReturnTrue() { - // GIVEN - let sut = makeVariantManager(features: [.newOnboardingIntroHighlights]) - - // WHEN - let result = sut.isOnboardingHighlightsExperiment - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsOnboardingHighlights_AndFeaturesDoNotContainOnboardingHighlights_ThenReturnFalse() { - // GIVEN - let sut = makeVariantManager(features: [.newOnboardingIntro, .contextualDaxDialogs]) - - // WHEN - let result = sut.isOnboardingHighlightsExperiment - - // THEN - XCTAssertFalse(result) - } - - func testWhenIsOnboardingHighlights_AndFeaturesIsEmpty_ThenReturnFalse() { - // GIVEN - let sut = makeVariantManager(features: []) - - // WHEN - let result = sut.isOnboardingHighlightsExperiment - - // THEN - XCTAssertFalse(result) - } - - // MARK: - Is Contextual Dax Dialogs Enabled - - func testWhenIsContextualDaxDialogsEnabled_AndFeaturesContainContextualDaxDialogs_ThenReturnTrue() { - // GIVEN - let sut = makeVariantManager(features: [.contextualDaxDialogs]) - - // WHEN - let result = sut.isContextualDaxDialogsEnabled - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsContextualDaxDialogsEnabled_AndFeaturesDoNotContainContextualDaxDialogs_ThenReturnFalse() { - // GIVEN - let sut = makeVariantManager(features: [.newOnboardingIntro, .newOnboardingIntroHighlights]) - - // WHEN - let result = sut.isContextualDaxDialogsEnabled - - // THEN - XCTAssertFalse(result) - } - - func testWhenIsContextualDaxDialogsEnabled_AndFeaturesIsEmpty_ThenReturnFalse() { - // GIVEN - let sut = makeVariantManager(features: []) - - // WHEN - let result = sut.isContextualDaxDialogsEnabled - - // THEN - XCTAssertFalse(result) - } - -} - -// MARK: Helpers - -private extension DefaultVariantManagerOnboardingTests { - - func makeVariantManager(features: [FeatureName]) -> DefaultVariantManager { - let mockStatisticStore = MockStatisticsStore() - mockStatisticStore.variant = #function - let variantManager = DefaultVariantManager( - variants: [VariantIOS(name: #function, weight: 1, isIncluded: VariantIOS.When.always, features: features)], - storage: mockStatisticStore, - rng: MockVariantRNG(returnValue: 500), - returningUserMeasurement: MockReturningUserMeasurement(), - variantNameOverride: MockVariantNameOverride() - ) - variantManager.assignVariantIfNeeded { _ in } - return variantManager - } - -} diff --git a/DuckDuckGoTests/HomeRowReminderTests.swift b/DuckDuckGoTests/HomeRowReminderTests.swift index c0e44358f5..33c310d1e7 100644 --- a/DuckDuckGoTests/HomeRowReminderTests.swift +++ b/DuckDuckGoTests/HomeRowReminderTests.swift @@ -60,6 +60,40 @@ class HomeRowReminderTests: XCTestCase { XCTAssertFalse(feature.showNow()) } + // MARK: - Add To Dock - Onboarding + + func testWhenAddToDockHasShownInOboardingIntroThenDoNotShowAddToDockReminder() { + // GIVEN + var variantManager = MockVariantManager() + variantManager.isSupportedBlock = { feature in + feature == .addToDockIntro + } + let sut = HomeRowReminder(storage: storage, variantManager: variantManager) + + // WHEN + let result = sut.showNow() + + // THEN + XCTAssertFalse(result) + } + + func testWhenAddToDockHasShownInContextualOboardingThenDoNotShowAddToDockReminder() { + // GIVEN + var variantManager = MockVariantManager() + variantManager.isSupportedBlock = { feature in + feature == .addToDockContextual + } + let sut = HomeRowReminder(storage: storage, variantManager: variantManager) + + // WHEN + let result = sut.showNow() + + // THEN + XCTAssertFalse(result) + } + + // MARK: - Helper functions + private func setReminderTimeElapsed() { let threeAndABitDaysAgo = -(60 * 60 * 24 * HomeRowReminder.Constants.reminderTimeInDays * 1.1) storage.firstAccessDate = Date(timeIntervalSinceNow: threeAndABitDaysAgo) @@ -67,6 +101,8 @@ class HomeRowReminderTests: XCTestCase { } +// MARK: - Mocks + class MockHomeRowReminderStorage: HomeRowReminderStorage { var firstAccessDate: Date? diff --git a/DuckDuckGoTests/NewTabPageControllerDaxDialogTests.swift b/DuckDuckGoTests/NewTabPageControllerDaxDialogTests.swift index 1c6322925e..1928a28e03 100644 --- a/DuckDuckGoTests/NewTabPageControllerDaxDialogTests.swift +++ b/DuckDuckGoTests/NewTabPageControllerDaxDialogTests.swift @@ -82,9 +82,8 @@ final class NewTabPageControllerDaxDialogTests: XCTestCase { hvc = nil } - func testWhenContextualDaxDialogsSupported_OnDidAppear_CorrectTypePassedToDialogFactory() throws { + func testWhenViewDidAppear_CorrectTypePassedToDialogFactory() throws { // GIVEN - variantManager.supportedFeatures = [.contextualDaxDialogs] let expectedSpec = randomDialogType() specProvider.specToReturn = expectedSpec @@ -92,30 +91,14 @@ final class NewTabPageControllerDaxDialogTests: XCTestCase { hvc.viewDidAppear(false) // THEN - XCTAssertEqual(self.variantManager.capturedFeatureName?.rawValue, FeatureName.contextualDaxDialogs.rawValue) XCTAssertFalse(self.specProvider.nextHomeScreenMessageCalled) XCTAssertTrue(self.specProvider.nextHomeScreenMessageNewCalled) XCTAssertEqual(self.dialogFactory.homeDialog, expectedSpec) XCTAssertNotNil(self.dialogFactory.onDismiss) } - func testWhenOldOnboarding_OnDidAppear_NothingPassedDialogFactory() throws { + func testWhenOnboardingComplete_CorrectTypePassedToDialogFactory() throws { // GIVEN - variantManager.supportedFeatures = [] - - // WHEN - hvc.viewDidAppear(false) - - // THEN - XCTAssertTrue(specProvider.nextHomeScreenMessageCalled) - XCTAssertFalse(specProvider.nextHomeScreenMessageNewCalled) - XCTAssertNil(dialogFactory.homeDialog) - XCTAssertNil(dialogFactory.onDismiss) - } - - func testWhenContextualDaxDialogsSupported_OnOnboardingComplete_CorrectTypePassedToDialogFactory() throws { - // GIVEN - variantManager.supportedFeatures = [.contextualDaxDialogs] let expectedSpec = randomDialogType() specProvider.specToReturn = expectedSpec @@ -123,51 +106,18 @@ final class NewTabPageControllerDaxDialogTests: XCTestCase { hvc.onboardingCompleted() // THEN - XCTAssertEqual(self.variantManager.capturedFeatureName?.rawValue, FeatureName.contextualDaxDialogs.rawValue) XCTAssertFalse(self.specProvider.nextHomeScreenMessageCalled) XCTAssertTrue(self.specProvider.nextHomeScreenMessageNewCalled) XCTAssertEqual(self.dialogFactory.homeDialog, expectedSpec) XCTAssertNotNil(self.dialogFactory.onDismiss) } - func testWhenOldOnboarding_OnOnboardingComplete_NothingPassedDialogFactory() throws { - // GIVEN - variantManager.supportedFeatures = [] - - // WHEN - hvc.onboardingCompleted() - - // THEN - XCTAssertTrue(specProvider.nextHomeScreenMessageCalled) - XCTAssertFalse(specProvider.nextHomeScreenMessageNewCalled) - XCTAssertNil(dialogFactory.homeDialog) - XCTAssertNil(dialogFactory.onDismiss) - } - - func testWhenOldOnboarding_OnOpenedAsNewTab_NothingPassedDialogFactory() throws { - // GIVEN - variantManager.supportedFeatures = [] - - // WHEN - hvc.openedAsNewTab(allowingKeyboard: true) - - // THEN - XCTAssertTrue(specProvider.nextHomeScreenMessageCalled) - XCTAssertFalse(specProvider.nextHomeScreenMessageNewCalled) - XCTAssertNil(dialogFactory.homeDialog) - XCTAssertNil(dialogFactory.onDismiss) - } - func testWhenShowNextDaxDialog_AndShouldShowDaxDialogs_ThenReturnTrue() { - // GIVEN - variantManager.supportedFeatures = [] - // WHEN hvc.showNextDaxDialog() // THEN - XCTAssertTrue(specProvider.nextHomeScreenMessageCalled) - XCTAssertFalse(specProvider.nextHomeScreenMessageNewCalled) + XCTAssertTrue(specProvider.nextHomeScreenMessageNewCalled) } private func randomDialogType() -> DaxDialogs.HomeScreenSpec { diff --git a/DuckDuckGoTests/OnboardingAddressBarPositionPickerViewModelTests.swift b/DuckDuckGoTests/OnboardingAddressBarPositionPickerViewModelTests.swift index 5708195ae5..f11b62c610 100644 --- a/DuckDuckGoTests/OnboardingAddressBarPositionPickerViewModelTests.swift +++ b/DuckDuckGoTests/OnboardingAddressBarPositionPickerViewModelTests.swift @@ -44,15 +44,15 @@ final class OnboardingAddressBarPositionPickerViewModelTests: XCTestCase { // THEN let firstItem = try XCTUnwrap(items.first) XCTAssertEqual(firstItem.type, .top) - XCTAssertEqual(firstItem.title.string, UserText.HighlightsOnboardingExperiment.AddressBarPosition.topTitle + " " + UserText.HighlightsOnboardingExperiment.AddressBarPosition.defaultOption) - XCTAssertEqual(firstItem.message, UserText.HighlightsOnboardingExperiment.AddressBarPosition.topMessage) + XCTAssertEqual(firstItem.title.string, UserText.Onboarding.AddressBarPosition.topTitle + " " + UserText.Onboarding.AddressBarPosition.defaultOption) + XCTAssertEqual(firstItem.message, UserText.Onboarding.AddressBarPosition.topMessage) XCTAssertEqual(firstItem.icon, .addressBarTop) XCTAssertTrue(firstItem.isSelected) let secondItem = try XCTUnwrap(items.last) XCTAssertEqual(secondItem.type, .bottom) - XCTAssertEqual(secondItem.title.string, UserText.HighlightsOnboardingExperiment.AddressBarPosition.bottomTitle) - XCTAssertEqual(secondItem.message, UserText.HighlightsOnboardingExperiment.AddressBarPosition.bottomMessage) + XCTAssertEqual(secondItem.title.string, UserText.Onboarding.AddressBarPosition.bottomTitle) + XCTAssertEqual(secondItem.message, UserText.Onboarding.AddressBarPosition.bottomMessage) XCTAssertEqual(secondItem.icon, .addressBarBottom) XCTAssertFalse(secondItem.isSelected) } @@ -73,15 +73,15 @@ final class OnboardingAddressBarPositionPickerViewModelTests: XCTestCase { let items = sut.items let firstItem = try XCTUnwrap(items.first) XCTAssertEqual(firstItem.type, .top) - XCTAssertEqual(firstItem.title.string, UserText.HighlightsOnboardingExperiment.AddressBarPosition.topTitle + " " + UserText.HighlightsOnboardingExperiment.AddressBarPosition.defaultOption) - XCTAssertEqual(firstItem.message, UserText.HighlightsOnboardingExperiment.AddressBarPosition.topMessage) + XCTAssertEqual(firstItem.title.string, UserText.Onboarding.AddressBarPosition.topTitle + " " + UserText.Onboarding.AddressBarPosition.defaultOption) + XCTAssertEqual(firstItem.message, UserText.Onboarding.AddressBarPosition.topMessage) XCTAssertEqual(firstItem.icon, .addressBarTop) XCTAssertFalse(firstItem.isSelected) let secondItem = try XCTUnwrap(items.last) XCTAssertEqual(secondItem.type, .bottom) - XCTAssertEqual(secondItem.title.string, UserText.HighlightsOnboardingExperiment.AddressBarPosition.bottomTitle) - XCTAssertEqual(secondItem.message, UserText.HighlightsOnboardingExperiment.AddressBarPosition.bottomMessage) + XCTAssertEqual(secondItem.title.string, UserText.Onboarding.AddressBarPosition.bottomTitle) + XCTAssertEqual(secondItem.message, UserText.Onboarding.AddressBarPosition.bottomMessage) XCTAssertEqual(secondItem.icon, .addressBarBottom) XCTAssertTrue(secondItem.isSelected) } diff --git a/DuckDuckGoTests/OnboardingDaxFavouritesTests.swift b/DuckDuckGoTests/OnboardingDaxFavouritesTests.swift index 3cbcc0c9e7..f7f47e4602 100644 --- a/DuckDuckGoTests/OnboardingDaxFavouritesTests.swift +++ b/DuckDuckGoTests/OnboardingDaxFavouritesTests.swift @@ -134,18 +134,7 @@ final class OnboardingDaxFavouritesTests: XCTestCase { XCTAssertTrue(result) } - func testWhenAddFavouriteIsCalled_ThenItShouldAskContextualOnboardingLogicIfAddFavoriteFlowCanStart() { - // GIVEN - XCTAssertFalse(contextualOnboardingLogicMock.didCallCanEnableAddFavoriteFlow) - - // WHEN - sut.startAddFavoriteFlow() - - // THEN - XCTAssertTrue(contextualOnboardingLogicMock.didCallCanEnableAddFavoriteFlow) - } - - func testWhenAddFavouriteIsCalled_AndCanStartAddFavouriteFlow_ThenItShouldEnableAddFavouriteFlowOnContextualOnboardingLogic() { + func testWhenAddFavouriteIsCalled_ThenItShouldEnableAddFavouriteFlowOnContextualOnboardingLogic() { // GIVEN contextualOnboardingLogicMock.canStartFavoriteFlow = true XCTAssertFalse(contextualOnboardingLogicMock.didCallEnableAddFavoriteFlow) @@ -157,27 +146,4 @@ final class OnboardingDaxFavouritesTests: XCTestCase { XCTAssertTrue(contextualOnboardingLogicMock.didCallEnableAddFavoriteFlow) } - func testWhenAddFavouriteIsCalled_AndCannotStartAddFavouriteFlow_ThenItShouldNotEnableAddFavouriteFlowOnContextualOnboardingLogic() { - // GIVEN - contextualOnboardingLogicMock.canStartFavoriteFlow = false - XCTAssertFalse(contextualOnboardingLogicMock.didCallEnableAddFavoriteFlow) - - // WHEN - sut.startAddFavoriteFlow() - - // THEN - XCTAssertFalse(contextualOnboardingLogicMock.didCallEnableAddFavoriteFlow) - } - - func testWhenAddFavouriteIsCalled_AndCannotStartAddFavouriteFlow_ThenOpenANewTab() { - // GIVEN - contextualOnboardingLogicMock.canStartFavoriteFlow = false - XCTAssertEqual(sut.tabManager.model.tabs.count, 1) - - // WHEN - sut.startAddFavoriteFlow() - - // THEN - XCTAssertEqual(sut.tabManager.model.tabs.count, 2) - } } diff --git a/DuckDuckGoTests/OnboardingIntroViewModelTests.swift b/DuckDuckGoTests/OnboardingIntroViewModelTests.swift index 8d4f854401..37c3654281 100644 --- a/DuckDuckGoTests/OnboardingIntroViewModelTests.swift +++ b/DuckDuckGoTests/OnboardingIntroViewModelTests.swift @@ -58,18 +58,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .startOnboardingDialog, step: .hidden))) } - func testWhenStartOnboardingActionIsCalledThenViewStateChangesToBrowsersComparisonDialog() { - // GIVEN - let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager) - XCTAssertEqual(sut.state, .landing) - - // WHEN - sut.startOnboardingAction() - - // THEN - XCTAssertEqual(sut.state, .onboarding(.init(type: .browsersComparisonDialog, step: .hidden))) - } - func testWhenSetDefaultBrowserActionIsCalledThenURLOpenerOpensSettingsURL() { // GIVEN let urlOpenerMock = MockURLOpener() @@ -85,45 +73,10 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(urlOpenerMock.capturedURL?.absoluteString, UIApplication.openSettingsURLString) } - func testWhenSetDefaultBrowserActionIsCalledThenOnCompletingOnboardingIntroIsCalled() { - // GIVEN - var didCallOnCompletingOnboardingIntro = false - let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, urlOpener: MockURLOpener()) - sut.onCompletingOnboardingIntro = { - didCallOnCompletingOnboardingIntro = true - } - XCTAssertFalse(didCallOnCompletingOnboardingIntro) - - // WHEN - sut.setDefaultBrowserAction() - - // THEN - XCTAssertTrue(didCallOnCompletingOnboardingIntro) - } - - func testWhenCancelSetDefaultBrowserActionIsCalledThenOnCompletingOnboardingIntroIsCalled() { - // GIVEN - var didCallOnCompletingOnboardingIntro = false - let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) - sut.onCompletingOnboardingIntro = { - didCallOnCompletingOnboardingIntro = true - } - XCTAssertFalse(didCallOnCompletingOnboardingIntro) - - // WHEN - sut.cancelSetDefaultBrowserAction() - - // THEN - XCTAssertTrue(didCallOnCompletingOnboardingIntro) - } - - // MARK: - Highlights State + Actions iPhone + // MARK: iPhone Flow - // MARK: iPhone - - func testWhenSubscribeToViewStateAndIsHighlightsIphoneFlowThenShouldSendLanding() { + func testWhenSubscribeToViewStateAndIsIphoneFlowThenShouldSendLanding() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) // WHEN @@ -133,9 +86,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(result, .landing) } - func testWhenOnAppearIsCalledAndAndIsHighlightsIphoneFlowThenViewStateChangesToStartOnboardingDialogAndProgressIsHidden() { + func testWhenOnAppearIsCalledAndAndIsIphoneFlowThenViewStateChangesToStartOnboardingDialogAndProgressIsHidden() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -146,22 +98,9 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .startOnboardingDialog, step: .hidden))) } - func testWhenStartOnboardingActionIsCalledAndIsHighlightsIphoneFlowThenViewStateChangesToBrowsersComparisonDialogAndProgressIs1Of3() { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true - let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false) - XCTAssertEqual(sut.state, .landing) - // WHEN - sut.startOnboardingAction() - - // THEN - XCTAssertEqual(sut.state, .onboarding(.init(type: .browsersComparisonDialog, step: .init(currentStep: 1, totalSteps: 3)))) - } - - func testWhenSetDefaultBrowserActionIsCalledAndIsHighlightsIphoneFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { + func testWhenSetDefaultBrowserActionIsCalledAndIsIphoneFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -172,9 +111,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .chooseAppIconDialog, step: .init(currentStep: 2, totalSteps: 3)))) } - func testWhenCancelSetDefaultBrowserActionIsCalledAndIsHighlightsIphoneFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { + func testWhenCancelSetDefaultBrowserActionIsCalledAndIsIphoneFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -185,9 +123,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .chooseAppIconDialog, step: .init(currentStep: 2, totalSteps: 3)))) } - func testWhenAppIconPickerContinueActionIsCalledAndIsHighlightsIphoneFlowThenViewStateChangesToChooseAddressBarPositionDialogAndProgressIs3Of3() { + func testWhenAppIconPickerContinueActionIsCalledAndIsIphoneFlowThenViewStateChangesToChooseAddressBarPositionDialogAndProgressIs3Of3() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false) XCTAssertEqual(sut.state, .landing) @@ -198,9 +135,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .chooseAddressBarPositionDialog, step: .init(currentStep: 3, totalSteps: 3)))) } - func testWhenSelectAddressBarPositionActionIsCalledAndIsHighlightsIphoneFlowThenOnCompletingOnboardingIntroIsCalled() { + func testWhenSelectAddressBarPositionActionIsCalledAndIsIphoneFlowThenOnCompletingOnboardingIntroIsCalled() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true var didCallOnCompletingOnboardingIntro = false let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) sut.onCompletingOnboardingIntro = { @@ -217,9 +153,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { // MARK: iPad - func testWhenSubscribeToViewStateAndIsHighlightsIpadFlowThenShouldSendLanding() { + func testWhenSubscribeToViewStateAndIsIpadFlowThenShouldSendLanding() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: true, urlOpener: MockURLOpener()) // WHEN @@ -229,9 +164,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(result, .landing) } - func testWhenOnAppearIsCalledAndAndIsHighlightsIpadFlowThenViewStateChangesToStartOnboardingDialogAndProgressIsHidden() { + func testWhenOnAppearIsCalledAndAndIsIpadFlowThenViewStateChangesToStartOnboardingDialogAndProgressIsHidden() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: true, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -242,9 +176,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .startOnboardingDialog, step: .hidden))) } - func testWhenStartOnboardingActionIsCalledAndIsHighlightsIpadFlowThenViewStateChangesToBrowsersComparisonDialogAndProgressIs1Of3() { + func testWhenStartOnboardingActionIsCalledAndIsIpadFlowThenViewStateChangesToBrowsersComparisonDialogAndProgressIs1Of3() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: true) XCTAssertEqual(sut.state, .landing) @@ -255,9 +188,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .browsersComparisonDialog, step: .init(currentStep: 1, totalSteps: 2)))) } - func testWhenSetDefaultBrowserActionIsCalledAndIsHighlightsIpadFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { + func testWhenSetDefaultBrowserActionIsCalledAndIsIpadFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: true, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -268,9 +200,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .chooseAppIconDialog, step: .init(currentStep: 2, totalSteps: 2)))) } - func testWhenCancelSetDefaultBrowserActionIsCalledAndIsHighlightsIpadFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { + func testWhenCancelSetDefaultBrowserActionIsCalledAndIsIpadFlowThenViewStateChangesToChooseAppIconDialogAndProgressIs2Of3() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: true, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -281,9 +212,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .chooseAppIconDialog, step: .init(currentStep: 2, totalSteps: 2)))) } - func testWhenAppIconPickerContinueActionIsCalledAndIsHighlightsIphoneFlowThenOnCompletingOnboardingIntroIsCalled() { + func testWhenAppIconPickerContinueActionIsCalledAndIsIphoneFlowThenOnCompletingOnboardingIntroIsCalled() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true var didCallOnCompletingOnboardingIntro = false let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: true, urlOpener: MockURLOpener()) sut.onCompletingOnboardingIntro = { @@ -339,11 +269,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertTrue(pixelReporterMock.didCallTrackChooseBrowserCTAAction) } - // MARK: - Pixel "Highlights" - func testWhenStateChangesToChooseAppIconThenPixelReporterTrackAppIconImpression() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener()) XCTAssertFalse(pixelReporterMock.didCallTrackBrowserComparisonImpression) @@ -357,7 +284,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenAppIconPickerContinueActionIsCalledAndIconIsCustomColorThenPixelReporterTrackCustomAppIconColor() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener(), appIconProvider: { .purple }) XCTAssertFalse(pixelReporterMock.didCallTrackChooseCustomAppIconColor) @@ -371,7 +297,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenAppIconPickerContinueActionIsCalledAndIconIsDefaultColorThenPixelReporterDoNotTrackCustomAppIconColor() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener(), appIconProvider: { .defaultAppIcon }) XCTAssertFalse(pixelReporterMock.didCallTrackChooseCustomAppIconColor) @@ -385,7 +310,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenStateChangesToChooseAddressBarPositionThenPixelReporterTrackAddressBarSelectionImpression() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) XCTAssertFalse(pixelReporterMock.didCallTrackAddressBarPositionSelectionImpression) @@ -399,7 +323,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenSelectAddressBarPositionActionIsCalledAndAddressBarPositionIsBottomThenPixelReporterTrackChooseBottomAddressBarPosition() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener(), addressBarPositionProvider: { .bottom }) XCTAssertFalse(pixelReporterMock.didCallTrackChooseBottomAddressBarPosition) @@ -413,7 +336,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenSelectAddressBarPositionActionIsCalledAndAddressBarPositionIsTopThenPixelReporterDoNotTrackChooseBottomAddressBarPosition() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener(), addressBarPositionProvider: { .top }) XCTAssertFalse(pixelReporterMock.didCallTrackChooseBottomAddressBarPosition) @@ -427,59 +349,32 @@ final class OnboardingIntroViewModelTests: XCTestCase { // MARK: - Copy - func testWhenIsNotHighlightsThenIntroTitleIsCorrect() { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = false - let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, urlOpener: MockURLOpener()) - - // WHEN - let result = sut.copy.introTitle - - // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.Intro.title) - } - - func testWhenIsHighlightsThenIntroTitleIsCorrect() { + func testIntroTitleIsCorrect() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, urlOpener: MockURLOpener()) // WHEN let result = sut.copy.introTitle // THEN - XCTAssertEqual(result, UserText.HighlightsOnboardingExperiment.Intro.title) - } - - func testWhenIsNotHighlightsThenBrowserComparisonTitleIsCorrect() { - // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = false - let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, urlOpener: MockURLOpener()) - - // WHEN - let result = sut.copy.browserComparisonTitle - - // THEN - XCTAssertEqual(result, UserText.DaxOnboardingExperiment.BrowsersComparison.title) + XCTAssertEqual(result, UserText.Onboarding.Intro.title) } - func testWhenIsHighlightsThenBrowserComparisonTitleIsCorrect() { + func testBrowserComparisonTitleIsCorrect() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, urlOpener: MockURLOpener()) // WHEN let result = sut.copy.browserComparisonTitle // THEN - XCTAssertEqual(result, UserText.HighlightsOnboardingExperiment.BrowsersComparison.title) + XCTAssertEqual(result, UserText.Onboarding.BrowsersComparison.title) } // MARK: - Add To Dock - func testWhenSetDefaultBrowserActionIsCalledAndIsHighlightsIphoneFlowThenViewStateChangesToAddToDockPromoDialogAndProgressIs2Of4() { + func testWhenSetDefaultBrowserActionIsCalledAndIsIphoneFlowThenViewStateChangesToAddToDockPromoDialogAndProgressIs2Of4() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true onboardingManager.addToDockEnabledState = .intro let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false, urlOpener: MockURLOpener()) XCTAssertEqual(sut.state, .landing) @@ -491,9 +386,8 @@ final class OnboardingIntroViewModelTests: XCTestCase { XCTAssertEqual(sut.state, .onboarding(.init(type: .addToDockPromoDialog, step: .init(currentStep: 2, totalSteps: 4)))) } - func testWhenAddtoDockContinueActionIsCalledAndIsHighlightsIphoneFlowThenThenViewStateChangesToChooseAppIconAndProgressIs3of4() { + func testWhenAddtoDockContinueActionIsCalledAndIsIphoneFlowThenThenViewStateChangesToChooseAppIconAndProgressIs3of4() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true onboardingManager.addToDockEnabledState = .intro let sut = OnboardingIntroViewModel(pixelReporter: OnboardingPixelReporterMock(), onboardingManager: onboardingManager, isIpad: false) XCTAssertEqual(sut.state, .landing) @@ -509,7 +403,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenStateChangesToAddToDockPromoThenPixelReporterTrackAddToDockPromoImpression() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true onboardingManager.addToDockEnabledState = .intro let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener()) @@ -524,7 +417,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenAddToDockShowTutorialActionIsCalledThenPixelReporterTrackAddToDockPromoShowTutorialCTA() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true onboardingManager.addToDockEnabledState = .intro let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener()) @@ -539,7 +431,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenAddToDockContinueActionIsCalledAndIsShowingFromAddToDockTutorialIsTrueThenPixelReporterTrackAddToDockTutorialDismissCTA() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true onboardingManager.addToDockEnabledState = .intro let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener()) @@ -554,7 +445,6 @@ final class OnboardingIntroViewModelTests: XCTestCase { func testWhenAddToDockContinueActionIsCalledAndIsShowingFromAddToDockTutorialIsFalseThenPixelReporterTrackAddToDockTutorialDismissCTA() { // GIVEN - onboardingManager.isOnboardingHighlightsEnabled = true onboardingManager.addToDockEnabledState = .intro let pixelReporterMock = OnboardingPixelReporterMock() let sut = OnboardingIntroViewModel(pixelReporter: pixelReporterMock, onboardingManager: onboardingManager, urlOpener: MockURLOpener()) diff --git a/DuckDuckGoTests/OnboardingManagerMock.swift b/DuckDuckGoTests/OnboardingManagerMock.swift index dcd8473b60..ad6d3cae1b 100644 --- a/DuckDuckGoTests/OnboardingManagerMock.swift +++ b/DuckDuckGoTests/OnboardingManagerMock.swift @@ -20,7 +20,6 @@ import Foundation @testable import DuckDuckGo -final class OnboardingManagerMock: OnboardingHighlightsManaging, OnboardingAddToDockManaging { - var isOnboardingHighlightsEnabled: Bool = false +final class OnboardingManagerMock: OnboardingAddToDockManaging { var addToDockEnabledState: OnboardingAddToDockState = .disabled } diff --git a/DuckDuckGoTests/OnboardingManagerTests.swift b/DuckDuckGoTests/OnboardingManagerTests.swift index ef7d174fc0..201d577a45 100644 --- a/DuckDuckGoTests/OnboardingManagerTests.swift +++ b/DuckDuckGoTests/OnboardingManagerTests.swift @@ -43,173 +43,105 @@ final class OnboardingManagerTests: XCTestCase { try super.tearDownWithError() } - // MARK: - Onboarding Highlights - - func testWhenIsOnboardingHighlightsLocalFlagEnabledCalledAndAppDefaultsOnboardingHiglightsEnabledIsTrueThenReturnTrue() { - // GIVEN - appSettingsMock.onboardingHighlightsEnabled = true - - // WHEN - let result = sut.isOnboardingHighlightsLocalFlagEnabled - - // THEN - XCTAssertTrue(result) - } + // MARK: - Add to Dock - func testWhenIsOnboardingHighlightsLocalFlagEnabledCalledAndAppDefaultsOnboardingHiglightsEnabledIsFalseThenReturnFalse() { + func testWhenAddToDockLocalFlagStateCalledAndAppDefaultsOnboardingAddToDockStateIsIntroThenReturnIntro() { // GIVEN - appSettingsMock.onboardingHighlightsEnabled = false + appSettingsMock.onboardingAddToDockState = .intro // WHEN - let result = sut.isOnboardingHighlightsLocalFlagEnabled + let result = sut.addToDockLocalFlagState // THEN - XCTAssertFalse(result) + XCTAssertEqual(result, .intro) } - func testWhenIsOnboardingHighlightsFeatureFlagEnabledCalledAndFeaturFlaggerFeatureIsOnThenReturnTrue() { + func testWhenAddToDockLocalFlagStateCalledAndAppDefaultsOnboardingAddToDockStateIsContextualThenReturnContextual() { // GIVEN - featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingHighlights] + appSettingsMock.onboardingAddToDockState = .contextual // WHEN - let result = sut.isOnboardingHighlightsFeatureFlagEnabled + let result = sut.addToDockLocalFlagState // THEN - XCTAssertTrue(result) + XCTAssertEqual(result, .contextual) } - func testWhenIsOnboardingHighlightsFeatureFlagEnabledCalledAndFeaturFlaggerFeatureIsOffThenReturnFalse() { + func testWhenAddToDockLocalFlagStateCalledAndAppDefaultsOnboardingAddToDockStateIsDisabledThenReturnDisabled() { // GIVEN - featureFlaggerMock.enabledFeatureFlags = [] + appSettingsMock.onboardingAddToDockState = .disabled // WHEN - let result = sut.isOnboardingHighlightsFeatureFlagEnabled + let result = sut.addToDockLocalFlagState // THEN - XCTAssertFalse(result) + XCTAssertEqual(result, .disabled) } - func testWhenIsOnboardingHiglightsEnabledAndIsLocalFlagEnabledIsFalseReturnFalse() { + func testWhenIsAddToDockFeatureFlagEnabledCalledAndFeaturFlaggerFeatureIsOnThenReturnTrue() { // GIVEN - appSettingsMock.onboardingHighlightsEnabled = false - featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingHighlights] + featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingAddToDock] // WHEN - let result = sut.isOnboardingHighlightsEnabled + let result = sut.isAddToDockFeatureFlagEnabled // THEN - XCTAssertFalse(result) + XCTAssertTrue(result) } - func testWhenIsOnboardingHiglightsEnabledAndIsFeatureFlagEnabledIsFalseReturnFalse() { + func testWhenIsAddToDockFeatureFlagEnabledCalledAndFeaturFlaggerFeatureIsOffThenReturnFalse() { // GIVEN - appSettingsMock.onboardingHighlightsEnabled = true featureFlaggerMock.enabledFeatureFlags = [] // WHEN - let result = sut.isOnboardingHighlightsEnabled + let result = sut.isAddToDockFeatureFlagEnabled // THEN XCTAssertFalse(result) } - func testWhenIsOnboardingHiglightsEnabledAndIsLocalFlagEnabledIsTrueAndIsFeatureFlagEnabledIsTrueThenReturnTrue() { + func testWhenAddToDockStateCalledAndVariantManagerSupportsAddToDockIntroThenReturnIntro() { // GIVEN - appSettingsMock.onboardingHighlightsEnabled = true - featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingHighlights] - - // WHEN - let result = sut.isOnboardingHighlightsEnabled - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsOnboardingHiglightsEnabledAndVariantManagerSupportOnboardingHighlightsReturnTrue() { - // GIVEN - variantManagerMock.isSupportedBlock = { _ in true } - appSettingsMock.onboardingHighlightsEnabled = false - featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingHighlights] - sut = OnboardingManager(appDefaults: appSettingsMock, featureFlagger: featureFlaggerMock, variantManager: variantManagerMock) - - // WHEN - let result = sut.isOnboardingHighlightsEnabled - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsOnboardingHiglightsEnabledAndVariantManagerSupportOnboardingHighlightsReturnFalse() { - // GIVEN - variantManagerMock.isSupportedBlock = { _ in false } - appSettingsMock.onboardingHighlightsEnabled = false - featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingHighlights] - sut = OnboardingManager(appDefaults: appSettingsMock, featureFlagger: featureFlaggerMock, variantManager: variantManagerMock) - - // WHEN - let result = sut.isOnboardingHighlightsEnabled - - // THEN - XCTAssertFalse(result) - } + variantManagerMock.isSupportedBlock = { feature in + feature == .addToDockIntro + } + sut = OnboardingManager(appDefaults: appSettingsMock, featureFlagger: featureFlaggerMock, variantManager: variantManagerMock, isIphone: true) - // MARK: - Add to Dock - - func testWhenAddToDockLocalFlagStateCalledAndAppDefaultsOnboardingAddToDockStateIsIntroThenReturnIntro() { - // GIVEN - appSettingsMock.onboardingAddToDockState = .intro // WHEN - let result = sut.addToDockLocalFlagState + let result = sut.addToDockEnabledState // THEN XCTAssertEqual(result, .intro) } - func testWhenAddToDockLocalFlagStateCalledAndAppDefaultsOnboardingAddToDockStateIsContextualThenReturnContextual() { + func testWhenAddToDockStateCalledAndVariantManagerSupportsAddToDockContextualThenReturnContextual() { // GIVEN - appSettingsMock.onboardingAddToDockState = .contextual + variantManagerMock.isSupportedBlock = { feature in + feature == .addToDockContextual + } + sut = OnboardingManager(appDefaults: appSettingsMock, featureFlagger: featureFlaggerMock, variantManager: variantManagerMock, isIphone: true) // WHEN - let result = sut.addToDockLocalFlagState + let result = sut.addToDockEnabledState // THEN XCTAssertEqual(result, .contextual) } - func testWhenAddToDockLocalFlagStateCalledAndAppDefaultsOnboardingAddToDockStateIsDisabledThenReturnDisabled() { + func testWhenAddToDockStateCalledAndVariantManagerDoesNotSupportAddToDockThenReturnDisabled() { // GIVEN - appSettingsMock.onboardingAddToDockState = .disabled + variantManagerMock.isSupportedBlock = { _ in + false + } // WHEN - let result = sut.addToDockLocalFlagState + let result = sut.addToDockEnabledState // THEN XCTAssertEqual(result, .disabled) } - func testWhenIsAddToDockFeatureFlagEnabledCalledAndFeaturFlaggerFeatureIsOnThenReturnTrue() { - // GIVEN - featureFlaggerMock.enabledFeatureFlags = [FeatureFlag.onboardingAddToDock] - - // WHEN - let result = sut.isAddToDockFeatureFlagEnabled - - // THEN - XCTAssertTrue(result) - } - - func testWhenIsAddToDockFeatureFlagEnabledCalledAndFeaturFlaggerFeatureIsOffThenReturnFalse() { - // GIVEN - featureFlaggerMock.enabledFeatureFlags = [] - - // WHEN - let result = sut.isAddToDockFeatureFlagEnabled - - // THEN - XCTAssertFalse(result) - } - func testWhenAddToDockStateCalledAndLocalFlagStateIsDisabledAndFeatureFlagIsFalseThenReturnDisabled() { // GIVEN appSettingsMock.onboardingAddToDockState = .disabled diff --git a/DuckDuckGoTests/OnboardingSuggestedSearchesProviderTests.swift b/DuckDuckGoTests/OnboardingSuggestedSearchesProviderTests.swift index ced3c4b449..1444ef350a 100644 --- a/DuckDuckGoTests/OnboardingSuggestedSearchesProviderTests.swift +++ b/DuckDuckGoTests/OnboardingSuggestedSearchesProviderTests.swift @@ -23,8 +23,7 @@ import Onboarding class OnboardingSuggestedSearchesProviderTests: XCTestCase { private var onboardingManagerMock: OnboardingManagerMock! - let userText = UserText.DaxOnboardingExperiment.ContextualOnboarding.self - let highlightsUserText = UserText.HighlightsOnboardingExperiment.ContextualOnboarding.self + let userText = UserText.Onboarding.ContextualOnboarding.self static let imageSearch = "!image " override func setUpWithError() throws { @@ -39,13 +38,12 @@ class OnboardingSuggestedSearchesProviderTests: XCTestCase { func testSearchesListForEnglishLanguageAndUsRegion() { let mockProvider = MockOnboardingRegionAndLanguageProvider(regionCode: "US", languageCode: "en") - let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider, onboardingManager: onboardingManagerMock) + let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider) let expectedSearches = [ ContextualOnboardingListItem.search(title: userText.tryASearchOption1English), ContextualOnboardingListItem.search(title: userText.tryASearchOption2English), - ContextualOnboardingListItem.search(title: userText.tryASearchOption3), - ContextualOnboardingListItem.surprise(title: userText.tryASearchOptionSurpriseMeEnglish, visibleTitle: "Surprise me!") + ContextualOnboardingListItem.surprise(title: Self.imageSearch + userText.tryASearchOptionSurpriseMe, visibleTitle: "Surprise me!") ] XCTAssertEqual(provider.list, expectedSearches) @@ -53,13 +51,12 @@ class OnboardingSuggestedSearchesProviderTests: XCTestCase { func testSearchesListForNonEnglishLanguageAndNonUSRegion() { let mockProvider = MockOnboardingRegionAndLanguageProvider(regionCode: "FR", languageCode: "fr") - let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider, onboardingManager: onboardingManagerMock) + let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider) let expectedSearches = [ ContextualOnboardingListItem.search(title: userText.tryASearchOption1International), ContextualOnboardingListItem.search(title: userText.tryASearchOption2International), - ContextualOnboardingListItem.search(title: userText.tryASearchOption3), - ContextualOnboardingListItem.surprise(title: userText.tryASearchOptionSurpriseMeInternational, visibleTitle: "Surprise me!") + ContextualOnboardingListItem.surprise(title: Self.imageSearch + userText.tryASearchOptionSurpriseMe, visibleTitle: "Surprise me!") ] XCTAssertEqual(provider.list, expectedSearches) @@ -67,57 +64,12 @@ class OnboardingSuggestedSearchesProviderTests: XCTestCase { func testSearchesListForUSRegionAndNonEnglishLanguage() { let mockProvider = MockOnboardingRegionAndLanguageProvider(regionCode: "US", languageCode: "es") - let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider, onboardingManager: onboardingManagerMock) + let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider) let expectedSearches = [ ContextualOnboardingListItem.search(title: userText.tryASearchOption1International), ContextualOnboardingListItem.search(title: userText.tryASearchOption2English), - ContextualOnboardingListItem.search(title: userText.tryASearchOption3), - ContextualOnboardingListItem.surprise(title: userText.tryASearchOptionSurpriseMeEnglish, visibleTitle: "Surprise me!") - ] - - XCTAssertEqual(provider.list, expectedSearches) - } - - // MARK: - Higlights Experiment - - func testWhenHighlightsOnboardingAndSearchesListForEnglishLanguageAndUsRegionThenDoNotReturnOption3() { - onboardingManagerMock.isOnboardingHighlightsEnabled = true - let mockProvider = MockOnboardingRegionAndLanguageProvider(regionCode: "US", languageCode: "en") - let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider, onboardingManager: onboardingManagerMock) - - let expectedSearches = [ - ContextualOnboardingListItem.search(title: userText.tryASearchOption1English), - ContextualOnboardingListItem.search(title: userText.tryASearchOption2English), - ContextualOnboardingListItem.surprise(title: Self.imageSearch + highlightsUserText.tryASearchOptionSurpriseMe, visibleTitle: "Surprise me!") - ] - - XCTAssertEqual(provider.list, expectedSearches) - } - - func testWhenHighlightsOnboardingAndSearchesListForNonEnglishLanguageAndNonUSRegionThenDoNotReturnOption3() { - onboardingManagerMock.isOnboardingHighlightsEnabled = true - let mockProvider = MockOnboardingRegionAndLanguageProvider(regionCode: "FR", languageCode: "fr") - let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider, onboardingManager: onboardingManagerMock) - - let expectedSearches = [ - ContextualOnboardingListItem.search(title: userText.tryASearchOption1International), - ContextualOnboardingListItem.search(title: userText.tryASearchOption2International), - ContextualOnboardingListItem.surprise(title: Self.imageSearch + highlightsUserText.tryASearchOptionSurpriseMe, visibleTitle: "Surprise me!") - ] - - XCTAssertEqual(provider.list, expectedSearches) - } - - func testWhenHighlightsOnboardingAndSearchesListForUSRegionAndNonEnglishLanguageThenDoNotReturnOption3() { - onboardingManagerMock.isOnboardingHighlightsEnabled = true - let mockProvider = MockOnboardingRegionAndLanguageProvider(regionCode: "US", languageCode: "es") - let provider = OnboardingSuggestedSearchesProvider(countryAndLanguageProvider: mockProvider, onboardingManager: onboardingManagerMock) - - let expectedSearches = [ - ContextualOnboardingListItem.search(title: userText.tryASearchOption1International), - ContextualOnboardingListItem.search(title: userText.tryASearchOption2English), - ContextualOnboardingListItem.surprise(title: Self.imageSearch + highlightsUserText.tryASearchOptionSurpriseMe, visibleTitle: "Surprise me!") + ContextualOnboardingListItem.surprise(title: Self.imageSearch + userText.tryASearchOptionSurpriseMe, visibleTitle: "Surprise me!") ] XCTAssertEqual(provider.list, expectedSearches) diff --git a/DuckDuckGoTests/TabViewControllerDaxDialogTests.swift b/DuckDuckGoTests/TabViewControllerDaxDialogTests.swift index ebb5810a83..ea943dfba3 100644 --- a/DuckDuckGoTests/TabViewControllerDaxDialogTests.swift +++ b/DuckDuckGoTests/TabViewControllerDaxDialogTests.swift @@ -233,7 +233,6 @@ final class ContextualOnboardingLogicMock: ContextualOnboardingLogic { private(set) var didCallSetFireEducationMessageSeen = false private(set) var didCallsetFinalOnboardingDialogSeen = false private(set) var didCallsetsetSearchMessageSeen = false - private(set) var didCallCanEnableAddFavoriteFlow = false private(set) var didCallEnableAddFavoriteFlow = false private(set) var didCallSetDaxDialogDismiss = false private(set) var didCallClearedBrowserData = false @@ -263,11 +262,6 @@ final class ContextualOnboardingLogicMock: ContextualOnboardingLogic { } - func canEnableAddFavoriteFlow() -> Bool { - didCallCanEnableAddFavoriteFlow = true - return canStartFavoriteFlow - } - func enableAddFavoriteFlow() { didCallEnableAddFavoriteFlow = true } From 5880851a235ddda347258ea42fb421d6953d1e9e Mon Sep 17 00:00:00 2001 From: Sabrina Tardio <44158575+SabrinaTardio@users.noreply.github.com> Date: Fri, 6 Dec 2024 18:22:17 +0100 Subject: [PATCH 11/66] add fake experiment (#3688) Task/Issue URL: https://app.asana.com/0/72649045549333/1208905776162821/f Tech Design URL: CC: **Description**: Used Fake Test feature to generate a cohort and do and A/A test run of the New experiment framework. We want to make sure cohort is assigned and pixels are fired as expected. --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 ++-- DuckDuckGo/NewTabPageViewModel.swift | 20 +++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 158ba01632..807e0a8324 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11372,7 +11372,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 218.0.0; + version = 218.0.1; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 7d8e4affb7..67a1291f05 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "e5d390c8559fbe7b1ca67fd3982c91bcc0437d60", - "version" : "218.0.0" + "revision" : "bbcb41c87c5788718a43883b5b10eb3b4f54aff3", + "version" : "218.0.1" } }, { diff --git a/DuckDuckGo/NewTabPageViewModel.swift b/DuckDuckGo/NewTabPageViewModel.swift index 6cb387b402..5f76ce83b9 100644 --- a/DuckDuckGo/NewTabPageViewModel.swift +++ b/DuckDuckGo/NewTabPageViewModel.swift @@ -19,6 +19,7 @@ import Foundation import Core +import BrowserServicesKit final class NewTabPageViewModel: ObservableObject { @@ -39,6 +40,9 @@ final class NewTabPageViewModel: ObservableObject { isIntroMessageVisible = introDataStorage.newTabPageIntroMessageEnabled ?? false isOnboarding = false isShowingSettings = false + + // This is just temporarily here to run an A/A test to check the new experiment framework works as expected + _ = AppDependencyProvider.shared.featureFlagger.getCohortIfEnabled(for: CredentialsSavingFlag()) } func introMessageDisplayed() { @@ -78,3 +82,19 @@ final class NewTabPageViewModel: ObservableObject { isDragging = false } } + +// This is just temporarily here to run an A/A test to check the new experiment framework works as expected +public struct CredentialsSavingFlag: FeatureFlagExperimentDescribing { + public init() {} + + public typealias CohortType = Cohort + + public var rawValue = "credentialSaving" + + public var source: FeatureFlagSource = .remoteReleasable(.subfeature(ExperimentTestSubfeatures.experimentTestAA)) + + public enum Cohort: String, FlagCohort { + case control + case blue + } +} From fcb4a8df2c368cbde66fab03349f0cf52e81a79b Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Fri, 6 Dec 2024 13:26:50 -0800 Subject: [PATCH 12/66] Update RMF version matching to ignore build number (#3686) Task/Issue URL: https://app.asana.com/0/1207619243206445/1208908529122506/f Tech Design URL: CC: Description: This PR updates the iOS app to pull in the BSK app version matching changes added in duckduckgo/BrowserServicesKit#1118. --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 807e0a8324..d7f122c4f2 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11372,7 +11372,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 218.0.1; + version = 218.0.2; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 67a1291f05..b267d00908 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "bbcb41c87c5788718a43883b5b10eb3b4f54aff3", - "version" : "218.0.1" + "revision" : "a404b05cc0ec6b7b3e346804c1e0970dd91c0634", + "version" : "218.0.2" } }, { From 010d7e32f9ac864aab055f030f832b870b0c82d1 Mon Sep 17 00:00:00 2001 From: Alessandro Boron Date: Mon, 9 Dec 2024 10:21:54 +0100 Subject: [PATCH 13/66] Add to Dock: Fix copy size for onboarding dialogs (#3697) Task/Issue URL: https://app.asana.com/0/0/1208923319582846/f **Description**: This PR fixes the copy size of the Dax dialogs body in the onboarding flow as per [Asana conversation](https://app.asana.com/0/0/1208577512136710/1208923319582843/f). --- .../ContextualOnboardingDialogs.swift | 8 +++++++- .../ContextualDaxDialogs/NewTabDaxDialogFactory.swift | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift index abdbbec806..ed28c452ef 100644 --- a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift +++ b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/ContextualOnboardingDialogs.swift @@ -34,6 +34,7 @@ struct OnboardingTrySearchDialog: View { title: title, titleFont: Font(UIFont.daxTitle3()), message: NSAttributedString(string: message), + messageFont: Font.system(size: 16), list: viewModel.itemsList, listAction: viewModel.listItemPressed ) @@ -67,6 +68,7 @@ struct OnboardingTryVisitingSiteDialogContent: View { title: viewModel.title, titleFont: Font(UIFont.daxTitle3()), message: message, + messageFont: Font.system(size: 16), list: viewModel.itemsList, listAction: viewModel.listItemPressed) } @@ -90,7 +92,9 @@ struct OnboardingFireButtonDialogContent: View { var body: some View { ContextualDaxDialogContent( - message: attributedMessage) + message: attributedMessage, + messageFont: Font.system(size: 16) + ) } } @@ -113,6 +117,7 @@ struct OnboardingFirstSearchDoneDialog: View { } else { ContextualDaxDialogContent( message: message, + messageFont: Font.system(size: 16), customActionView: AnyView( OnboardingCTAButton(title: cta) { gotItAction() @@ -164,6 +169,7 @@ struct OnboardingTrackersDoneDialog: View { } else { ContextualDaxDialogContent( message: message, + messageFont: Font.system(size: 16), customActionView: AnyView( OnboardingCTAButton(title: cta) { blockedTrackersCTAAction() diff --git a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift index 994078c2d7..00d70662ae 100644 --- a/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift +++ b/DuckDuckGo/OnboardingExperiment/ContextualDaxDialogs/NewTabDaxDialogFactory.swift @@ -89,7 +89,7 @@ final class NewTabDaxDialogFactory: NewTabDaxDialogProvider { FadeInView { ScrollView(.vertical) { DaxDialogView(logoPosition: .top) { - ContextualDaxDialogContent(message: NSAttributedString(string: message)) + ContextualDaxDialogContent(message: NSAttributedString(string: message), messageFont: Font.system(size: 16)) } .padding() } From f565fd55746cad04ba10203ea77809f5d5baa959 Mon Sep 17 00:00:00 2001 From: Dax Mobile <44842493+daxmobile@users.noreply.github.com> Date: Mon, 9 Dec 2024 20:22:35 +1100 Subject: [PATCH 14/66] Update BSK with autofill 16.0.0 (#3693) Task/Issue URL: https://app.asana.com/0/1208923931185505/1208923931185505 Autofill Release: https://github.com/duckduckgo/duckduckgo-autofill/releases/tag/16.0.0 BSK PR: https://github.com/duckduckgo/BrowserServicesKit/pull/1122 ## Description Updates Autofill to version [16.0.0](https://github.com/duckduckgo/duckduckgo-autofill/releases/tag/16.0.0). ### Autofill 16.0.0 release notes ## What's Changed This PR introduces breaking changes for Android/Windows causing save autofill prompt to get triggered in username only fields. * Upgrade to shared eslint config + Adopt Prettier by @muodov in https://github.com/duckduckgo/duckduckgo-autofill/pull/695 * Ignore lint PR in git blame by @muodov in https://github.com/duckduckgo/duckduckgo-autofill/pull/699 * Update password-related json files (2024-11-18) by @daxmobile in https://github.com/duckduckgo/duckduckgo-autofill/pull/706 * [Form] Always scan shadow elements when categorizing the form inputs by @dbajpeyi in https://github.com/duckduckgo/duckduckgo-autofill/pull/703 * Bump ts-to-zod from 3.1.3 to 3.14.0 by @dependabot in https://github.com/duckduckgo/duckduckgo-autofill/pull/710 * [FormAnalyzer] Fix paperlesspost.com login form by @dbajpeyi in https://github.com/duckduckgo/duckduckgo-autofill/pull/711 * [FormAnalyzer] Tweak regex to match forgot password attribute by @dbajpeyi in https://github.com/duckduckgo/duckduckgo-autofill/pull/712 * [Form] Trigger partialSave on username/email only form submit by @dbajpeyi in https://github.com/duckduckgo/duckduckgo-autofill/pull/702 **Full Changelog**: https://github.com/duckduckgo/duckduckgo-autofill/compare/15.1.0...16.0.0 ## Steps to test This release has been tested during autofill development. For smoke test steps see [this task](https://app.asana.com/0/1198964220583541/1200583647142330/f). --------- Co-authored-by: dbajpeyi <3018923+dbajpeyi@users.noreply.github.com> Co-authored-by: Graeme Arthur --- DuckDuckGo.xcodeproj/project.pbxproj | 6 +++--- .../xcshareddata/swiftpm/Package.resolved | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index d7f122c4f2..54319a1cd2 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11363,8 +11363,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { - kind = exactVersion; - version = 210.0.1; + kind = revision; + revision = 6a5642a07acc85af9e1b165066e5b9d9716b7a09; }; }; 98A16C2928A11BDE00A6C003 /* XCRemoteSwiftPackageReference "BrowserServicesKit" */ = { @@ -11372,7 +11372,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 218.0.2; + version = 218.1.0; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b267d00908..3c92013c76 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "a404b05cc0ec6b7b3e346804c1e0970dd91c0634", - "version" : "218.0.2" + "revision" : "a82c14b991f8cbef46d4b7d8e613762f1592fcd2", + "version" : "218.1.0" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/duckduckgo/duckduckgo-autofill.git", "state" : { - "revision" : "c992041d16ec10d790e6204dce9abf9966d1363c", - "version" : "15.1.0" + "revision" : "88982a3802ac504e2f1a118a73bfdf2d8f4a7735", + "version" : "16.0.0" } }, { From e110da82fa33c427583a8aa198a42650efbaac86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20=C5=9Apiewak?= Date: Mon, 9 Dec 2024 11:10:27 +0100 Subject: [PATCH 15/66] Fix showing bars on tapping bottom of the screen (#3684) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/1206226850447395/1208832461871070/f Tech Design URL: CC: **Description**: Updated the way how "bottom of screen" is calculated. I think this was broken for some time already but nobody noticed. Changed to show the bars with animation. **Steps to test this PR**: 1. Open a website which allows to scroll and hide the bars. 2. Try tapping on top/bottom to reveal bars. 3. Try with top and bottom bar setting. **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? **Copy Testing**: * [ ] Use of correct apostrophes in new copy, ie `’` rather than `'` **Orientation Testing**: * [ ] Portrait * [ ] Landscape **Device Testing**: * [ ] iPhone SE (1st Gen) * [ ] iPhone 8 * [ ] iPhone X * [ ] iPhone 14 Pro * [ ] iPad **OS Testing**: * [ ] iOS 15 * [ ] iOS 16 * [ ] iOS 17 **Theme Testing**: * [ ] Light theme * [ ] Dark theme --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- DuckDuckGo/TabViewController.swift | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/DuckDuckGo/TabViewController.swift b/DuckDuckGo/TabViewController.swift index bc248cd104..5263815bf0 100644 --- a/DuckDuckGo/TabViewController.swift +++ b/DuckDuckGo/TabViewController.swift @@ -1007,7 +1007,7 @@ class TabViewController: UIViewController { } @IBAction func onBottomOfScreenTapped(_ sender: UITapGestureRecognizer) { - showBars(animated: false) + showBars() } private func showBars(animated: Bool = true) { @@ -2476,13 +2476,15 @@ extension TabViewController: UIGestureRecognizerDelegate { } private func isShowBarsTap(_ gestureRecognizer: UIGestureRecognizer) -> Bool { - let y = gestureRecognizer.location(in: webView).y + let y = gestureRecognizer.location(in: self.view).y return gestureRecognizer == showBarsTapGestureRecogniser && chromeDelegate?.isToolbarHidden == true && isBottom(yPosition: y) } private func isBottom(yPosition y: CGFloat) -> Bool { - guard let chromeDelegate = chromeDelegate else { return false } - return y > (view.frame.size.height - chromeDelegate.toolbarHeight) + let webViewFrameInTabView = webView.convert(webView.bounds, to: view) + let bottomOfWebViewInTabView = webViewFrameInTabView.maxY - webView.scrollView.contentInset.bottom + + return y > bottomOfWebViewInTabView } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherRecognizer: UIGestureRecognizer) -> Bool { From 9527f74ee53c69752e2cd1cc15dd5954054f1eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20=C5=9Apiewak?= Date: Mon, 9 Dec 2024 16:22:03 +0100 Subject: [PATCH 16/66] Adjust app icons to support HomeScreen tinting on iOS 18 (#3680) Task/Issue URL: https://app.asana.com/0/1206226850447395/1208303061602073/f Tech Design URL: CC: **Description**: Moving app icons to assets in order to support iOS 18 tinting on Home Screen. There were a few issues, which look like a bug or inconsistency in iOS: 1. It wasn't possible to load app icon asset as `UIImage`, thus I needed additional separate images for display on UI. I tried out [Apple's sample project](https://developer.apple.com/documentation/xcode/configuring_your_app_to_use_alternate_app_icons) and it also failed to display app icons. 2. I left updated icons definitions in `Info.plist` even though the functionality did work without them. It seems those values are included by compiler, but without having those predefined, the Alpha build app icon was used throughout Xcode UI. I removed multiple variants for each AppIcon asset and left only a single image of 1024px size. Starting from Xcode 14 asset catalog can use this size to autogenerate all other required sizes. **Steps to test this PR**: 1. Run the app 2. Test each icon color is displayed properly on Home Screen, task switcher, folder in app library 4. Turn on tinted mode in Home Screen customization menu, verify icons are properly tinted 5. Check if switching icon variants works on iPad. **Definition of Done (Internal Only)**: * [x] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? **Device Testing**: * [x] iPhone SE (1st Gen) * [ ] iPhone 8 * [ ] iPhone X * [x] iPhone 14 Pro * [x] iPad **OS Testing**: * [x] iOS 15 * [ ] iOS 16 * [x] iOS 18 **Theme Testing**: * [x] Light theme * [x] Dark theme --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- DuckDuckGo.xcodeproj/project.pbxproj | 236 +------------ .../AppIcon-black.appiconset/Contents.json | 38 ++ .../Icon-Color-Black-1024x1024.png | Bin 0 -> 18809 bytes .../Icon-Color-Black-Dark-1024x1024.png | Bin 0 -> 18897 bytes .../Icon-Tinted-1024x1024.png | Bin 0 -> 41976 bytes .../AppIcon-blue.appiconset/Contents.json | 38 ++ .../Icon-Color-Blue-1024x1024.png | Bin 0 -> 19039 bytes .../Icon-Color-Blue-Dark-1024x1024.png | Bin 0 -> 19058 bytes .../Icon-Tinted-1024x1024.png | Bin 0 -> 41976 bytes .../AppIcon-green.appiconset/Contents.json | 38 ++ .../Icon-Color-Green-1024x1024.png | Bin 0 -> 18103 bytes .../Icon-Color-Green-Dark-1024x1024.png | Bin 0 -> 18846 bytes .../Icon-Tinted-1024x1024.png | Bin 0 -> 41976 bytes .../AppIcon-purple.appiconset/Contents.json | 38 ++ .../Icon-Color-Purple-1024x1024.png | Bin 0 -> 18983 bytes .../Icon-Color-Purple-Dark-1024x1024.png | Bin 0 -> 19171 bytes .../Icon-Tinted-1024x1024.png | Bin 0 -> 41976 bytes .../AppIcon-yellow.appiconset/Contents.json | 38 ++ .../Icon-Color-Yellow-1024x1024.png | Bin 0 -> 19127 bytes .../Icon-Color-Yellow-Dark-1024x1024.png | Bin 0 -> 19081 bytes .../Icon-Tinted-1024x1024.png | Bin 0 -> 41976 bytes .../AlternateAppIcons.xcassets/Contents.json | 6 + .../AppIconBlack60x60@2x.png | Bin .../AppIconBlack60x60@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Black-Dark-120x120.png | Bin 0 -> 12885 bytes .../Icon-Color-Black-Dark-180x180.png | Bin 0 -> 19959 bytes .../AppIconBlack29x29@2x.png | Bin .../AppIconBlack29x29@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Black-Dark-29x29.png | Bin 0 -> 8157 bytes .../Icon-Color-Black-Dark-58x58.png | Bin 0 -> 5000 bytes .../AppIconBlue60x60@2x.png | Bin .../AppIconBlue60x60@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Blue-Dark-120x120.png | Bin 0 -> 16764 bytes .../Icon-Color-Blue-Dark-180x180.png | Bin 0 -> 25941 bytes .../AppIconBlue29x29@2x.png | Bin .../AppIconBlue29x29@3x.png | Bin .../AppIcon-blue-small.imageset/Contents.json | 54 +++ .../Icon-Color-Blue-Dark-29x29.png | Bin 0 -> 10298 bytes .../Icon-Color-Blue-Dark-58x58.png | Bin 0 -> 6592 bytes .../AppIconGreen60x60@2x.png | Bin .../AppIconGreen60x60@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Green-Dark-120x120.png | Bin 0 -> 17228 bytes .../Icon-Color-Green-Dark-180x180.png | Bin 0 -> 26379 bytes .../AppIconGreen29x29@2x.png | Bin .../AppIconGreen29x29@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Green-Dark-58x58.png | Bin 0 -> 6702 bytes .../Icon-Color-Green-Dark-87x87.png | Bin 0 -> 10535 bytes .../AppIconPurple60x60@2x.png | Bin .../AppIconPurple60x60@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Purple-Dark-120x120.png | Bin 0 -> 16921 bytes .../Icon-Color-Purple-Dark-180x180.png | Bin 0 -> 26096 bytes .../AppIconPurple29x29@2x.png | Bin .../AppIconPurple29x29@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Purple-Dark-58x58.png | Bin 0 -> 6635 bytes .../Icon-Color-Purple-Dark-87x87.png | Bin 0 -> 10384 bytes .../AppIconRed60x60@2x.png | Bin .../AppIconRed60x60@3x.png | Bin .../AppIcon-red-medium.imageset/Contents.json | 54 +++ .../Icon-Dark-120x120.png | Bin 0 -> 11861 bytes .../Icon-Dark-180x180.png | Bin 0 -> 18866 bytes .../AppIconRed29x29@2x.png | Bin .../AppIconRed29x29@3x.png | Bin .../AppIcon-red-small.imageset/Contents.json | 54 +++ .../Icon-Dark-58x58.png | Bin 0 -> 4579 bytes .../Icon-Dark-87x87.png | Bin 0 -> 7619 bytes .../AppIconYellow60x60@2x.png | Bin .../AppIconYellow60x60@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Yellow-Dark-120x120.png | Bin 0 -> 17009 bytes .../Icon-Color-Yellow-Dark-180x180.png | Bin 0 -> 26174 bytes .../AppIconYellow29x29@2x.png | Bin .../AppIconYellow29x29@3x.png | Bin .../Contents.json | 54 +++ .../Icon-Color-Yellow-Dark-58x58.png | Bin 0 -> 6632 bytes .../Icon-Color-Yellow-Dark-87x87.png | Bin 0 -> 10406 bytes .../UIAssets/Contents.json | 6 + DuckDuckGo/AppIcon.swift | 46 +-- DuckDuckGo/AppIconBlack40x40@2x.png | Bin 3592 -> 0 bytes DuckDuckGo/AppIconBlack40x40@3x.png | Bin 5107 -> 0 bytes DuckDuckGo/AppIconBlack76x76@2x.png | Bin 6437 -> 0 bytes DuckDuckGo/AppIconBlack83.5x83.5@2x.png | Bin 7657 -> 0 bytes DuckDuckGo/AppIconBlue40x40@2x.png | Bin 3527 -> 0 bytes DuckDuckGo/AppIconBlue40x40@3x.png | Bin 5300 -> 0 bytes DuckDuckGo/AppIconBlue76x76@2x.png | Bin 6621 -> 0 bytes DuckDuckGo/AppIconBlue83.5x83.5@2x.png | Bin 8013 -> 0 bytes DuckDuckGo/AppIconGreen40x40@2x.png | Bin 3676 -> 0 bytes DuckDuckGo/AppIconGreen40x40@3x.png | Bin 5340 -> 0 bytes DuckDuckGo/AppIconGreen76x76@2x.png | Bin 6701 -> 0 bytes DuckDuckGo/AppIconGreen83.5x83.5@2x.png | Bin 7948 -> 0 bytes DuckDuckGo/AppIconPurple40x40@2x.png | Bin 3777 -> 0 bytes DuckDuckGo/AppIconPurple40x40@3x.png | Bin 5609 -> 0 bytes DuckDuckGo/AppIconPurple76x76@2x.png | Bin 7088 -> 0 bytes DuckDuckGo/AppIconPurple83.5x83.5@2x.png | Bin 8380 -> 0 bytes DuckDuckGo/AppIconSettingsCell.swift | 2 +- DuckDuckGo/AppIconYellow40x40@2x.png | Bin 3644 -> 0 bytes DuckDuckGo/AppIconYellow40x40@3x.png | Bin 5387 -> 0 bytes DuckDuckGo/AppIconYellow76x76@2x.png | Bin 6722 -> 0 bytes DuckDuckGo/AppIconYellow83.5x83.5@2x.png | Bin 7974 -> 0 bytes .../AppIcon.appiconset/1024pt.png | Bin 50090 -> 0 bytes .../AppIcon.appiconset/20pt@2x.png | Bin 1641 -> 0 bytes .../AppIcon.appiconset/29pt-1.png | Bin 1297 -> 0 bytes .../AppIcon.appiconset/29pt.png | Bin 1297 -> 0 bytes .../AppIcon.appiconset/29pt@2x-1.png | Bin 2572 -> 0 bytes .../AppIcon.appiconset/29pt@2x.png | Bin 2572 -> 0 bytes .../AppIcon.appiconset/29pt@3x.png | Bin 4062 -> 0 bytes .../AppIcon.appiconset/40pt@2x-1.png | Bin 3498 -> 0 bytes .../AppIcon.appiconset/40pt@2x.png | Bin 3498 -> 0 bytes .../AppIcon.appiconset/40pt@3x.png | Bin 5254 -> 0 bytes .../AppIcon.appiconset/50pt.png | Bin 2326 -> 0 bytes .../AppIcon.appiconset/50pt@2x.png | Bin 4660 -> 0 bytes .../AppIcon.appiconset/60pt@2x-1.png | Bin 5254 -> 0 bytes .../AppIcon.appiconset/60pt@2x.png | Bin 5254 -> 0 bytes .../AppIcon.appiconset/60pt@3x-1.png | Bin 8163 -> 0 bytes .../AppIcon.appiconset/60pt@3x.png | Bin 8163 -> 0 bytes .../AppIcon.appiconset/76pt.png | Bin 3307 -> 0 bytes .../AppIcon.appiconset/76pt@2x.png | Bin 6712 -> 0 bytes .../AppIcon.appiconset/83,5pt@2x.png | Bin 7822 -> 0 bytes .../AppIcon.appiconset/Contents.json | 333 ++---------------- .../Icon-Dark-1024x1024.png | Bin 0 -> 19203 bytes .../Icon-Light-1024x1024.png | Bin 0 -> 49288 bytes .../Icon-Tinted-1024x1024.png | Bin 0 -> 41976 bytes .../DDG-AppIcon-Alpha.appiconset/29 1.png | Bin 832 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/29.png | Bin 832 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/29@2x 1.png | Bin 1618 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/29@2x.png | Bin 1618 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/29@3x.png | Bin 2258 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/40 1.png | Bin 1094 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/40@2x 1.png | Bin 2399 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/40@2x.png | Bin 2399 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/40@3x.png | Bin 3536 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/50.png | Bin 1443 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/50@2x.png | Bin 2993 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/60@2x 1.png | Bin 3539 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/60@2x.png | Bin 3539 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/60@3x 1.png | Bin 5247 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/60@3x.png | Bin 5247 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/76.png | Bin 2101 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/76@2x.png | Bin 4460 -> 0 bytes .../DDG-AppIcon-Alpha.appiconset/83-5@2x.png | Bin 5051 -> 0 bytes .../Contents.json | 317 +---------------- DuckDuckGo/Info.plist | 55 ++- 148 files changed, 924 insertions(+), 915 deletions(-) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Color-Black-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Color-Black-Dark-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Tinted-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Color-Blue-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Color-Blue-Dark-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Tinted-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Color-Green-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Color-Green-Dark-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Tinted-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Color-Purple-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Color-Purple-Dark-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Tinted-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Color-Yellow-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Color-Yellow-Dark-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Tinted-1024x1024.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/Contents.json rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset}/AppIconBlack60x60@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset}/AppIconBlack60x60@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Icon-Color-Black-Dark-120x120.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Icon-Color-Black-Dark-180x180.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset}/AppIconBlack29x29@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset}/AppIconBlack29x29@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Icon-Color-Black-Dark-29x29.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Icon-Color-Black-Dark-58x58.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset}/AppIconBlue60x60@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset}/AppIconBlue60x60@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Icon-Color-Blue-Dark-120x120.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Icon-Color-Blue-Dark-180x180.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset}/AppIconBlue29x29@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset}/AppIconBlue29x29@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Icon-Color-Blue-Dark-29x29.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Icon-Color-Blue-Dark-58x58.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset}/AppIconGreen60x60@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset}/AppIconGreen60x60@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset/Icon-Color-Green-Dark-120x120.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset/Icon-Color-Green-Dark-180x180.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-green-small.imageset}/AppIconGreen29x29@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-green-small.imageset}/AppIconGreen29x29@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-small.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-small.imageset/Icon-Color-Green-Dark-58x58.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-small.imageset/Icon-Color-Green-Dark-87x87.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset}/AppIconPurple60x60@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset}/AppIconPurple60x60@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Icon-Color-Purple-Dark-120x120.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Icon-Color-Purple-Dark-180x180.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset}/AppIconPurple29x29@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset}/AppIconPurple29x29@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Icon-Color-Purple-Dark-58x58.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Icon-Color-Purple-Dark-87x87.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset}/AppIconRed60x60@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset}/AppIconRed60x60@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Icon-Dark-120x120.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Icon-Dark-180x180.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset}/AppIconRed29x29@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset}/AppIconRed29x29@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Icon-Dark-58x58.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Icon-Dark-87x87.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-medium.imageset}/AppIconYellow60x60@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-medium.imageset}/AppIconYellow60x60@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-medium.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-medium.imageset/Icon-Color-Yellow-Dark-120x120.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-medium.imageset/Icon-Color-Yellow-Dark-180x180.png rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset}/AppIconYellow29x29@2x.png (100%) rename DuckDuckGo/{ => AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset}/AppIconYellow29x29@3x.png (100%) create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset/Contents.json create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset/Icon-Color-Yellow-Dark-58x58.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset/Icon-Color-Yellow-Dark-87x87.png create mode 100644 DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/Contents.json delete mode 100644 DuckDuckGo/AppIconBlack40x40@2x.png delete mode 100644 DuckDuckGo/AppIconBlack40x40@3x.png delete mode 100644 DuckDuckGo/AppIconBlack76x76@2x.png delete mode 100644 DuckDuckGo/AppIconBlack83.5x83.5@2x.png delete mode 100644 DuckDuckGo/AppIconBlue40x40@2x.png delete mode 100644 DuckDuckGo/AppIconBlue40x40@3x.png delete mode 100644 DuckDuckGo/AppIconBlue76x76@2x.png delete mode 100644 DuckDuckGo/AppIconBlue83.5x83.5@2x.png delete mode 100644 DuckDuckGo/AppIconGreen40x40@2x.png delete mode 100644 DuckDuckGo/AppIconGreen40x40@3x.png delete mode 100644 DuckDuckGo/AppIconGreen76x76@2x.png delete mode 100644 DuckDuckGo/AppIconGreen83.5x83.5@2x.png delete mode 100644 DuckDuckGo/AppIconPurple40x40@2x.png delete mode 100644 DuckDuckGo/AppIconPurple40x40@3x.png delete mode 100644 DuckDuckGo/AppIconPurple76x76@2x.png delete mode 100644 DuckDuckGo/AppIconPurple83.5x83.5@2x.png delete mode 100644 DuckDuckGo/AppIconYellow40x40@2x.png delete mode 100644 DuckDuckGo/AppIconYellow40x40@3x.png delete mode 100644 DuckDuckGo/AppIconYellow76x76@2x.png delete mode 100644 DuckDuckGo/AppIconYellow83.5x83.5@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/1024pt.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/20pt@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt-1.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt@2x-1.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt@3x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@2x-1.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@3x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/50pt.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/50pt@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/60pt@2x-1.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/60pt@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/60pt@3x-1.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/60pt@3x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/76pt.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/76pt@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/83,5pt@2x.png create mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/Icon-Dark-1024x1024.png create mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/Icon-Light-1024x1024.png create mode 100644 DuckDuckGo/Assets.xcassets/AppIcon.appiconset/Icon-Tinted-1024x1024.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29 1.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@2x 1.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@3x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/40 1.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/40@2x 1.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/40@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/40@3x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/50.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/50@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/60@2x 1.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/60@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/60@3x 1.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/60@3x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/76.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/76@2x.png delete mode 100644 DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/83-5@2x.png diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 54319a1cd2..95347ae79f 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -330,6 +330,7 @@ 6F7FB8E32C660BF300867DA7 /* DailyPixelFiring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7FB8E22C660BF300867DA7 /* DailyPixelFiring.swift */; }; 6F7FB8E52C66158D00867DA7 /* NewTabPageShortcutsSettingsModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7FB8E42C66158D00867DA7 /* NewTabPageShortcutsSettingsModelTests.swift */; }; 6F7FB8E72C66197E00867DA7 /* NewTabPageSectionsSettingsModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7FB8E62C66197E00867DA7 /* NewTabPageSectionsSettingsModelTests.swift */; }; + 6F8348E32D01E401005872E3 /* AlternateAppIcons.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6F8348E22D01E401005872E3 /* AlternateAppIcons.xcassets */; }; 6F8496412BC3D8EE00ADA54E /* OnboardingButtonsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8496402BC3D8EE00ADA54E /* OnboardingButtonsView.swift */; }; 6F934F862C58DB00008364E4 /* NewTabPageSettingsPersistentStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F934F852C58DB00008364E4 /* NewTabPageSettingsPersistentStorageTests.swift */; }; 6F96FF102C2B128500162692 /* NewTabPageCustomizeButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F96FF0F2C2B128500162692 /* NewTabPageCustomizeButtonView.swift */; }; @@ -824,50 +825,6 @@ AA3D854723D9E88E00788410 /* AppIconSettingsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3D854623D9E88E00788410 /* AppIconSettingsCell.swift */; }; AA3D854923DA1DFB00788410 /* AppIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA3D854823DA1DFB00788410 /* AppIcon.swift */; }; AA4D6A6A23DB87B1007E8790 /* AppIconManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA4D6A6923DB87B1007E8790 /* AppIconManager.swift */; }; - AA4D6A8C23DE49A5007E8790 /* AppIconBlack40x40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8223DE49A4007E8790 /* AppIconBlack40x40@2x.png */; }; - AA4D6A8D23DE49A5007E8790 /* AppIconBlack40x40@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8323DE49A4007E8790 /* AppIconBlack40x40@3x.png */; }; - AA4D6A8E23DE49A5007E8790 /* AppIconBlack60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8423DE49A4007E8790 /* AppIconBlack60x60@2x.png */; }; - AA4D6A8F23DE49A5007E8790 /* AppIconBlack29x29@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8523DE49A4007E8790 /* AppIconBlack29x29@3x.png */; }; - AA4D6A9123DE49A5007E8790 /* AppIconBlack60x60@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8723DE49A5007E8790 /* AppIconBlack60x60@3x.png */; }; - AA4D6A9323DE49A5007E8790 /* AppIconBlack76x76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8923DE49A5007E8790 /* AppIconBlack76x76@2x.png */; }; - AA4D6A9423DE49A5007E8790 /* AppIconBlack29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A8A23DE49A5007E8790 /* AppIconBlack29x29@2x.png */; }; - AA4D6AA123DE4CC4007E8790 /* AppIconBlue60x60@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9723DE4CC3007E8790 /* AppIconBlue60x60@3x.png */; }; - AA4D6AA223DE4CC4007E8790 /* AppIconBlue76x76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9823DE4CC3007E8790 /* AppIconBlue76x76@2x.png */; }; - AA4D6AA323DE4CC4007E8790 /* AppIconBlue40x40@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9923DE4CC3007E8790 /* AppIconBlue40x40@3x.png */; }; - AA4D6AA423DE4CC4007E8790 /* AppIconBlue29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9A23DE4CC3007E8790 /* AppIconBlue29x29@2x.png */; }; - AA4D6AA523DE4CC4007E8790 /* AppIconBlue29x29@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9B23DE4CC3007E8790 /* AppIconBlue29x29@3x.png */; }; - AA4D6AA723DE4CC4007E8790 /* AppIconBlue60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9D23DE4CC4007E8790 /* AppIconBlue60x60@2x.png */; }; - AA4D6AA823DE4CC4007E8790 /* AppIconBlue40x40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6A9E23DE4CC4007E8790 /* AppIconBlue40x40@2x.png */; }; - AA4D6AB823DE4D15007E8790 /* AppIconYellow29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AAE23DE4D14007E8790 /* AppIconYellow29x29@2x.png */; }; - AA4D6AB923DE4D15007E8790 /* AppIconYellow29x29@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AAF23DE4D14007E8790 /* AppIconYellow29x29@3x.png */; }; - AA4D6ABB23DE4D15007E8790 /* AppIconYellow40x40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AB123DE4D14007E8790 /* AppIconYellow40x40@2x.png */; }; - AA4D6ABC23DE4D15007E8790 /* AppIconYellow60x60@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AB223DE4D14007E8790 /* AppIconYellow60x60@3x.png */; }; - AA4D6ABD23DE4D15007E8790 /* AppIconYellow60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AB323DE4D15007E8790 /* AppIconYellow60x60@2x.png */; }; - AA4D6ABF23DE4D15007E8790 /* AppIconYellow40x40@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AB523DE4D15007E8790 /* AppIconYellow40x40@3x.png */; }; - AA4D6AC023DE4D15007E8790 /* AppIconYellow76x76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AB623DE4D15007E8790 /* AppIconYellow76x76@2x.png */; }; - AA4D6ACC23DE4D27007E8790 /* AppIconPurple60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AC223DE4D26007E8790 /* AppIconPurple60x60@2x.png */; }; - AA4D6ACD23DE4D27007E8790 /* AppIconPurple29x29@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AC323DE4D26007E8790 /* AppIconPurple29x29@3x.png */; }; - AA4D6ACE23DE4D27007E8790 /* AppIconPurple60x60@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AC423DE4D26007E8790 /* AppIconPurple60x60@3x.png */; }; - AA4D6ACF23DE4D27007E8790 /* AppIconPurple76x76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AC523DE4D26007E8790 /* AppIconPurple76x76@2x.png */; }; - AA4D6AD123DE4D27007E8790 /* AppIconPurple40x40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AC723DE4D26007E8790 /* AppIconPurple40x40@2x.png */; }; - AA4D6AD323DE4D27007E8790 /* AppIconPurple29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AC923DE4D26007E8790 /* AppIconPurple29x29@2x.png */; }; - AA4D6AD423DE4D27007E8790 /* AppIconPurple40x40@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6ACA23DE4D26007E8790 /* AppIconPurple40x40@3x.png */; }; - AA4D6AE123DE4D33007E8790 /* AppIconGreen76x76@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AD723DE4D32007E8790 /* AppIconGreen76x76@2x.png */; }; - AA4D6AE223DE4D33007E8790 /* AppIconGreen40x40@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AD823DE4D32007E8790 /* AppIconGreen40x40@2x.png */; }; - AA4D6AE323DE4D33007E8790 /* AppIconGreen60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AD923DE4D32007E8790 /* AppIconGreen60x60@2x.png */; }; - AA4D6AE423DE4D33007E8790 /* AppIconGreen40x40@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6ADA23DE4D32007E8790 /* AppIconGreen40x40@3x.png */; }; - AA4D6AE623DE4D33007E8790 /* AppIconGreen60x60@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6ADC23DE4D33007E8790 /* AppIconGreen60x60@3x.png */; }; - AA4D6AE723DE4D33007E8790 /* AppIconGreen29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6ADD23DE4D33007E8790 /* AppIconGreen29x29@2x.png */; }; - AA4D6AE923DE4D33007E8790 /* AppIconGreen29x29@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6ADF23DE4D33007E8790 /* AppIconGreen29x29@3x.png */; }; - AA4D6AF623DF0312007E8790 /* AppIconRed60x60@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AF423DF0312007E8790 /* AppIconRed60x60@3x.png */; }; - AA4D6AF723DF0312007E8790 /* AppIconRed60x60@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AF523DF0312007E8790 /* AppIconRed60x60@2x.png */; }; - AA4D6AFA23DF0CF6007E8790 /* AppIconRed29x29@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AF823DF0CF5007E8790 /* AppIconRed29x29@3x.png */; }; - AA4D6AFB23DF0CF6007E8790 /* AppIconRed29x29@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AA4D6AF923DF0CF6007E8790 /* AppIconRed29x29@2x.png */; }; - AAF2E28123E0495400962AF8 /* AppIconBlack83.5x83.5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AAF2E28023E0495400962AF8 /* AppIconBlack83.5x83.5@2x.png */; }; - AAF2E28323E0495E00962AF8 /* AppIconBlue83.5x83.5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AAF2E28223E0495E00962AF8 /* AppIconBlue83.5x83.5@2x.png */; }; - AAF2E28523E0496F00962AF8 /* AppIconGreen83.5x83.5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AAF2E28423E0496F00962AF8 /* AppIconGreen83.5x83.5@2x.png */; }; - AAF2E28723E0498200962AF8 /* AppIconPurple83.5x83.5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AAF2E28623E0498100962AF8 /* AppIconPurple83.5x83.5@2x.png */; }; - AAF2E28B23E049DF00962AF8 /* AppIconYellow83.5x83.5@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AAF2E28A23E049DF00962AF8 /* AppIconYellow83.5x83.5@2x.png */; }; B603974929C19F6F00902A34 /* Assertions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B603974829C19F6F00902A34 /* Assertions.swift */; }; B609D5522862EAFF0088CAC2 /* InlineWKDownloadDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B609D5512862EAFF0088CAC2 /* InlineWKDownloadDelegate.swift */; }; B60DFF072872B64B0061E7C2 /* JSAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B60DFF062872B64B0061E7C2 /* JSAlertController.swift */; }; @@ -1678,6 +1635,7 @@ 6F7FB8E22C660BF300867DA7 /* DailyPixelFiring.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DailyPixelFiring.swift; sourceTree = ""; }; 6F7FB8E42C66158D00867DA7 /* NewTabPageShortcutsSettingsModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTabPageShortcutsSettingsModelTests.swift; sourceTree = ""; }; 6F7FB8E62C66197E00867DA7 /* NewTabPageSectionsSettingsModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTabPageSectionsSettingsModelTests.swift; sourceTree = ""; }; + 6F8348E22D01E401005872E3 /* AlternateAppIcons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = AlternateAppIcons.xcassets; sourceTree = ""; }; 6F8496402BC3D8EE00ADA54E /* OnboardingButtonsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingButtonsView.swift; sourceTree = ""; }; 6F934F852C58DB00008364E4 /* NewTabPageSettingsPersistentStorageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTabPageSettingsPersistentStorageTests.swift; sourceTree = ""; }; 6F96FF0F2C2B128500162692 /* NewTabPageCustomizeButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTabPageCustomizeButtonView.swift; sourceTree = ""; }; @@ -2665,50 +2623,6 @@ AA3D854623D9E88E00788410 /* AppIconSettingsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconSettingsCell.swift; sourceTree = ""; }; AA3D854823DA1DFB00788410 /* AppIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIcon.swift; sourceTree = ""; }; AA4D6A6923DB87B1007E8790 /* AppIconManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconManager.swift; sourceTree = ""; }; - AA4D6A8223DE49A4007E8790 /* AppIconBlack40x40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack40x40@2x.png"; sourceTree = ""; }; - AA4D6A8323DE49A4007E8790 /* AppIconBlack40x40@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack40x40@3x.png"; sourceTree = ""; }; - AA4D6A8423DE49A4007E8790 /* AppIconBlack60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack60x60@2x.png"; sourceTree = ""; }; - AA4D6A8523DE49A4007E8790 /* AppIconBlack29x29@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack29x29@3x.png"; sourceTree = ""; }; - AA4D6A8723DE49A5007E8790 /* AppIconBlack60x60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack60x60@3x.png"; sourceTree = ""; }; - AA4D6A8923DE49A5007E8790 /* AppIconBlack76x76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack76x76@2x.png"; sourceTree = ""; }; - AA4D6A8A23DE49A5007E8790 /* AppIconBlack29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack29x29@2x.png"; sourceTree = ""; }; - AA4D6A9723DE4CC3007E8790 /* AppIconBlue60x60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue60x60@3x.png"; sourceTree = ""; }; - AA4D6A9823DE4CC3007E8790 /* AppIconBlue76x76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue76x76@2x.png"; sourceTree = ""; }; - AA4D6A9923DE4CC3007E8790 /* AppIconBlue40x40@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue40x40@3x.png"; sourceTree = ""; }; - AA4D6A9A23DE4CC3007E8790 /* AppIconBlue29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue29x29@2x.png"; sourceTree = ""; }; - AA4D6A9B23DE4CC3007E8790 /* AppIconBlue29x29@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue29x29@3x.png"; sourceTree = ""; }; - AA4D6A9D23DE4CC4007E8790 /* AppIconBlue60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue60x60@2x.png"; sourceTree = ""; }; - AA4D6A9E23DE4CC4007E8790 /* AppIconBlue40x40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue40x40@2x.png"; sourceTree = ""; }; - AA4D6AAE23DE4D14007E8790 /* AppIconYellow29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow29x29@2x.png"; sourceTree = ""; }; - AA4D6AAF23DE4D14007E8790 /* AppIconYellow29x29@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow29x29@3x.png"; sourceTree = ""; }; - AA4D6AB123DE4D14007E8790 /* AppIconYellow40x40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow40x40@2x.png"; sourceTree = ""; }; - AA4D6AB223DE4D14007E8790 /* AppIconYellow60x60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow60x60@3x.png"; sourceTree = ""; }; - AA4D6AB323DE4D15007E8790 /* AppIconYellow60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow60x60@2x.png"; sourceTree = ""; }; - AA4D6AB523DE4D15007E8790 /* AppIconYellow40x40@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow40x40@3x.png"; sourceTree = ""; }; - AA4D6AB623DE4D15007E8790 /* AppIconYellow76x76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow76x76@2x.png"; sourceTree = ""; }; - AA4D6AC223DE4D26007E8790 /* AppIconPurple60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple60x60@2x.png"; sourceTree = ""; }; - AA4D6AC323DE4D26007E8790 /* AppIconPurple29x29@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple29x29@3x.png"; sourceTree = ""; }; - AA4D6AC423DE4D26007E8790 /* AppIconPurple60x60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple60x60@3x.png"; sourceTree = ""; }; - AA4D6AC523DE4D26007E8790 /* AppIconPurple76x76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple76x76@2x.png"; sourceTree = ""; }; - AA4D6AC723DE4D26007E8790 /* AppIconPurple40x40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple40x40@2x.png"; sourceTree = ""; }; - AA4D6AC923DE4D26007E8790 /* AppIconPurple29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple29x29@2x.png"; sourceTree = ""; }; - AA4D6ACA23DE4D26007E8790 /* AppIconPurple40x40@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple40x40@3x.png"; sourceTree = ""; }; - AA4D6AD723DE4D32007E8790 /* AppIconGreen76x76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen76x76@2x.png"; sourceTree = ""; }; - AA4D6AD823DE4D32007E8790 /* AppIconGreen40x40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen40x40@2x.png"; sourceTree = ""; }; - AA4D6AD923DE4D32007E8790 /* AppIconGreen60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen60x60@2x.png"; sourceTree = ""; }; - AA4D6ADA23DE4D32007E8790 /* AppIconGreen40x40@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen40x40@3x.png"; sourceTree = ""; }; - AA4D6ADC23DE4D33007E8790 /* AppIconGreen60x60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen60x60@3x.png"; sourceTree = ""; }; - AA4D6ADD23DE4D33007E8790 /* AppIconGreen29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen29x29@2x.png"; sourceTree = ""; }; - AA4D6ADF23DE4D33007E8790 /* AppIconGreen29x29@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen29x29@3x.png"; sourceTree = ""; }; - AA4D6AF423DF0312007E8790 /* AppIconRed60x60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconRed60x60@3x.png"; sourceTree = ""; }; - AA4D6AF523DF0312007E8790 /* AppIconRed60x60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconRed60x60@2x.png"; sourceTree = ""; }; - AA4D6AF823DF0CF5007E8790 /* AppIconRed29x29@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconRed29x29@3x.png"; sourceTree = ""; }; - AA4D6AF923DF0CF6007E8790 /* AppIconRed29x29@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconRed29x29@2x.png"; sourceTree = ""; }; - AAF2E28023E0495400962AF8 /* AppIconBlack83.5x83.5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlack83.5x83.5@2x.png"; sourceTree = ""; }; - AAF2E28223E0495E00962AF8 /* AppIconBlue83.5x83.5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconBlue83.5x83.5@2x.png"; sourceTree = ""; }; - AAF2E28423E0496F00962AF8 /* AppIconGreen83.5x83.5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconGreen83.5x83.5@2x.png"; sourceTree = ""; }; - AAF2E28623E0498100962AF8 /* AppIconPurple83.5x83.5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconPurple83.5x83.5@2x.png"; sourceTree = ""; }; - AAF2E28A23E049DF00962AF8 /* AppIconYellow83.5x83.5@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "AppIconYellow83.5x83.5@2x.png"; sourceTree = ""; }; B603974829C19F6F00902A34 /* Assertions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assertions.swift; sourceTree = ""; }; B609D5512862EAFF0088CAC2 /* InlineWKDownloadDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InlineWKDownloadDelegate.swift; sourceTree = ""; }; B60DFF062872B64B0061E7C2 /* JSAlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSAlertController.swift; sourceTree = ""; }; @@ -5133,102 +5047,11 @@ children = ( AA4D6A6923DB87B1007E8790 /* AppIconManager.swift */, AA3D854823DA1DFB00788410 /* AppIcon.swift */, - AA4D6A8123DE4981007E8790 /* Black */, - AA4D6A9623DE4BB3007E8790 /* Blue */, - AA4D6AAB23DE4CC9007E8790 /* Green */, - AA4D6AAC23DE4CE5007E8790 /* Purple */, - AA4D6AF323DF0282007E8790 /* Red */, - AA4D6AAD23DE4D01007E8790 /* Yellow */, + 6F8348E22D01E401005872E3 /* AlternateAppIcons.xcassets */, ); name = AppIcon; sourceTree = ""; }; - AA4D6A8123DE4981007E8790 /* Black */ = { - isa = PBXGroup; - children = ( - AA4D6A8A23DE49A5007E8790 /* AppIconBlack29x29@2x.png */, - AA4D6A8523DE49A4007E8790 /* AppIconBlack29x29@3x.png */, - AA4D6A8223DE49A4007E8790 /* AppIconBlack40x40@2x.png */, - AA4D6A8323DE49A4007E8790 /* AppIconBlack40x40@3x.png */, - AA4D6A8423DE49A4007E8790 /* AppIconBlack60x60@2x.png */, - AA4D6A8723DE49A5007E8790 /* AppIconBlack60x60@3x.png */, - AA4D6A8923DE49A5007E8790 /* AppIconBlack76x76@2x.png */, - AAF2E28023E0495400962AF8 /* AppIconBlack83.5x83.5@2x.png */, - ); - name = Black; - sourceTree = ""; - }; - AA4D6A9623DE4BB3007E8790 /* Blue */ = { - isa = PBXGroup; - children = ( - AA4D6A9A23DE4CC3007E8790 /* AppIconBlue29x29@2x.png */, - AA4D6A9B23DE4CC3007E8790 /* AppIconBlue29x29@3x.png */, - AA4D6A9E23DE4CC4007E8790 /* AppIconBlue40x40@2x.png */, - AA4D6A9923DE4CC3007E8790 /* AppIconBlue40x40@3x.png */, - AA4D6A9D23DE4CC4007E8790 /* AppIconBlue60x60@2x.png */, - AA4D6A9723DE4CC3007E8790 /* AppIconBlue60x60@3x.png */, - AA4D6A9823DE4CC3007E8790 /* AppIconBlue76x76@2x.png */, - AAF2E28223E0495E00962AF8 /* AppIconBlue83.5x83.5@2x.png */, - ); - name = Blue; - sourceTree = ""; - }; - AA4D6AAB23DE4CC9007E8790 /* Green */ = { - isa = PBXGroup; - children = ( - AA4D6ADD23DE4D33007E8790 /* AppIconGreen29x29@2x.png */, - AA4D6ADF23DE4D33007E8790 /* AppIconGreen29x29@3x.png */, - AA4D6AD823DE4D32007E8790 /* AppIconGreen40x40@2x.png */, - AA4D6ADA23DE4D32007E8790 /* AppIconGreen40x40@3x.png */, - AA4D6AD923DE4D32007E8790 /* AppIconGreen60x60@2x.png */, - AA4D6ADC23DE4D33007E8790 /* AppIconGreen60x60@3x.png */, - AA4D6AD723DE4D32007E8790 /* AppIconGreen76x76@2x.png */, - AAF2E28423E0496F00962AF8 /* AppIconGreen83.5x83.5@2x.png */, - ); - name = Green; - sourceTree = ""; - }; - AA4D6AAC23DE4CE5007E8790 /* Purple */ = { - isa = PBXGroup; - children = ( - AA4D6AC923DE4D26007E8790 /* AppIconPurple29x29@2x.png */, - AA4D6AC323DE4D26007E8790 /* AppIconPurple29x29@3x.png */, - AA4D6AC723DE4D26007E8790 /* AppIconPurple40x40@2x.png */, - AA4D6ACA23DE4D26007E8790 /* AppIconPurple40x40@3x.png */, - AA4D6AC223DE4D26007E8790 /* AppIconPurple60x60@2x.png */, - AA4D6AC423DE4D26007E8790 /* AppIconPurple60x60@3x.png */, - AA4D6AC523DE4D26007E8790 /* AppIconPurple76x76@2x.png */, - AAF2E28623E0498100962AF8 /* AppIconPurple83.5x83.5@2x.png */, - ); - name = Purple; - sourceTree = ""; - }; - AA4D6AAD23DE4D01007E8790 /* Yellow */ = { - isa = PBXGroup; - children = ( - AA4D6AAE23DE4D14007E8790 /* AppIconYellow29x29@2x.png */, - AA4D6AAF23DE4D14007E8790 /* AppIconYellow29x29@3x.png */, - AA4D6AB123DE4D14007E8790 /* AppIconYellow40x40@2x.png */, - AA4D6AB523DE4D15007E8790 /* AppIconYellow40x40@3x.png */, - AA4D6AB323DE4D15007E8790 /* AppIconYellow60x60@2x.png */, - AA4D6AB223DE4D14007E8790 /* AppIconYellow60x60@3x.png */, - AA4D6AB623DE4D15007E8790 /* AppIconYellow76x76@2x.png */, - AAF2E28A23E049DF00962AF8 /* AppIconYellow83.5x83.5@2x.png */, - ); - name = Yellow; - sourceTree = ""; - }; - AA4D6AF323DF0282007E8790 /* Red */ = { - isa = PBXGroup; - children = ( - AA4D6AF923DF0CF6007E8790 /* AppIconRed29x29@2x.png */, - AA4D6AF823DF0CF5007E8790 /* AppIconRed29x29@3x.png */, - AA4D6AF523DF0312007E8790 /* AppIconRed60x60@2x.png */, - AA4D6AF423DF0312007E8790 /* AppIconRed60x60@3x.png */, - ); - name = Red; - sourceTree = ""; - }; B652DF02287C01EE00C12A9C /* ContentBlocking */ = { isa = PBXGroup; children = ( @@ -7210,21 +7033,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - AA4D6A8D23DE49A5007E8790 /* AppIconBlack40x40@3x.png in Resources */, F47E53DB250A9A1C0037C686 /* Onboarding.xcassets in Resources */, - AA4D6ACC23DE4D27007E8790 /* AppIconPurple60x60@2x.png in Resources */, 1E242960293F585300584836 /* cookie-icon-animated-40-light.json in Resources */, - AA4D6AA223DE4CC4007E8790 /* AppIconBlue76x76@2x.png in Resources */, - AA4D6AB823DE4D15007E8790 /* AppIconYellow29x29@2x.png in Resources */, 984147C024F026A300362052 /* Tab.storyboard in Resources */, 4B6ED9452B992FE4007F5CAA /* vpn-dark-mode.json in Resources */, 02F880642AB206740020C2DF /* PrivacyInfo.xcprivacy in Resources */, - AA4D6AE123DE4D33007E8790 /* AppIconGreen76x76@2x.png in Resources */, - AA4D6A9123DE49A5007E8790 /* AppIconBlack60x60@3x.png in Resources */, - AA4D6A8E23DE49A5007E8790 /* AppIconBlack60x60@2x.png in Resources */, - AA4D6AC023DE4D15007E8790 /* AppIconYellow76x76@2x.png in Resources */, - AA4D6AA423DE4CC4007E8790 /* AppIconBlue29x29@2x.png in Resources */, - AA4D6AE323DE4D33007E8790 /* AppIconGreen60x60@2x.png in Resources */, F41610BC29E5DF66001F709D /* DeprecatedColors.xcassets in Resources */, 9F8E0F2A2CCA5C9D001EA7C5 /* add-to-dock-demo.mp4 in Resources */, F4F7F10B25813FE200045D62 /* 02_Water_swirl_really_small.json in Resources */, @@ -7234,65 +7047,44 @@ 1EEF12452850A923003DDE57 /* shield.json in Resources */, 85DFEDF724CB1CAB00973FE7 /* ShareSheet.xcassets in Resources */, 98DA6B3322243CC3006EA9EB /* Feedback.xcassets in Resources */, - AA4D6ABD23DE4D15007E8790 /* AppIconYellow60x60@2x.png in Resources */, 1EE411F728587AC50003FE64 /* PrivacyIcon.xcassets in Resources */, 8548D96825262C33005AAE49 /* view_highlight.json in Resources */, - AA4D6AD423DE4D27007E8790 /* AppIconPurple40x40@3x.png in Resources */, 85F0E97329952D7A003D5181 /* DuckDuckGo Recovery Document.pdf in Resources */, - AA4D6AD123DE4D27007E8790 /* AppIconPurple40x40@2x.png in Resources */, 9880723725FA4E450039EF4B /* menu_dark.json in Resources */, - AAF2E28B23E049DF00962AF8 /* AppIconYellow83.5x83.5@2x.png in Resources */, 1E162615296D910F0004127F /* cookie-icon-animated-40-dark.json in Resources */, 85514FFD2372DA0100DBC528 /* ios13-home-row.mp4 in Resources */, 85F98F98296F4CB100742F4A /* SyncAssets.xcassets in Resources */, 31BC5F412C2B0B540004DF37 /* DuckPlayer.xcassets in Resources */, - AA4D6A9423DE49A5007E8790 /* AppIconBlack29x29@2x.png in Resources */, 7BDBAD0E2CBFB3F1000379B7 /* VPN.xcassets in Resources */, 98B001B3251EABB40090EC07 /* InfoPlist.strings in Resources */, - AA4D6ACE23DE4D27007E8790 /* AppIconPurple60x60@3x.png in Resources */, D65CEA702B6AC6C9008A759B /* Subscription.xcassets in Resources */, F1E4A4451EE89460006F2EAE /* Bookmarks.storyboard in Resources */, - AA4D6ABB23DE4D15007E8790 /* AppIconYellow40x40@2x.png in Resources */, 84E341A01E2F7EFB00BDBA6F /* LaunchScreen.storyboard in Resources */, 98D16973250CE707009513CC /* OmniBar.xib in Resources */, - AAF2E28523E0496F00962AF8 /* AppIconGreen83.5x83.5@2x.png in Resources */, F4F7F10C25813FE200045D62 /* 03_Airstream_divided_by_four.json in Resources */, - AAF2E28723E0498200962AF8 /* AppIconPurple83.5x83.5@2x.png in Resources */, - AA4D6AB923DE4D15007E8790 /* AppIconYellow29x29@3x.png in Resources */, 6F64AA5B2C481AAA00CF4489 /* Shortcuts.xcassets in Resources */, 984147B424F0264B00362052 /* Authentication.storyboard in Resources */, 1EE411FD2858B9300003FE64 /* dark-trackers-2.json in Resources */, - AA4D6ABC23DE4D15007E8790 /* AppIconYellow60x60@3x.png in Resources */, 98D98A9B25ED954100D8E3DF /* BrowsingMenuButton.xib in Resources */, D664C7B72B289AA200CBFA76 /* Subscription.storekit in Resources */, - AA4D6AA823DE4CC4007E8790 /* AppIconBlue40x40@2x.png in Resources */, - AA4D6AE723DE4D33007E8790 /* AppIconGreen29x29@2x.png in Resources */, 1EE412002858B9300003FE64 /* dark-shield-dot.json in Resources */, 1EE412012858B9300003FE64 /* dark-trackers-3.json in Resources */, - AA4D6ACD23DE4D27007E8790 /* AppIconPurple29x29@3x.png in Resources */, - AA4D6A8C23DE49A5007E8790 /* AppIconBlack40x40@2x.png in Resources */, 1EEF12462850A923003DDE57 /* trackers-3.json in Resources */, 85AE668E2097206E0014CF04 /* NotificationView.xib in Resources */, - AA4D6AFA23DF0CF6007E8790 /* AppIconRed29x29@3x.png in Resources */, 85A313972028E78A00327D00 /* release_notes.txt in Resources */, 9865DFFD22A84CF300D27829 /* FavoriteHomeCell.xib in Resources */, 1EE411FE2858B9300003FE64 /* dark-shield.json in Resources */, - AA4D6AD323DE4D27007E8790 /* AppIconPurple29x29@2x.png in Resources */, - AA4D6AA123DE4CC4007E8790 /* AppIconBlue60x60@3x.png in Resources */, 1DDF402B2BA05A65006850D9 /* Settings.xcassets in Resources */, 984147A824F0259000362052 /* Onboarding.storyboard in Resources */, - AA4D6AF723DF0312007E8790 /* AppIconRed60x60@2x.png in Resources */, - AA4D6AE923DE4D33007E8790 /* AppIconGreen29x29@3x.png in Resources */, 984147AE24F0261A00362052 /* Feedback.storyboard in Resources */, 984147B724F0268D00362052 /* PrivacyDashboard.storyboard in Resources */, - AA4D6AA723DE4CC4007E8790 /* AppIconBlue60x60@2x.png in Resources */, 1EEF12532851D32B003DDE57 /* trackers-2.json in Resources */, F176699F1E40BC86003D3222 /* Settings.storyboard in Resources */, 854A012F2A5563A400FCC628 /* FindInPage.xib in Resources */, 1E8AD1DD27C653F800ABA377 /* Downloads.xcassets in Resources */, F1F533841F26ABAC00D80D4F /* Localizable.strings in Resources */, 1EEF12472850A923003DDE57 /* shield-dot.json in Resources */, - AA4D6AFB23DF0CF6007E8790 /* AppIconRed29x29@2x.png in Resources */, + 6F8348E32D01E401005872E3 /* AlternateAppIcons.xcassets in Resources */, F1ED309D1EDC2EA400651986 /* TabSwitcher.storyboard in Resources */, 8524AAAC2A3888FE00EEC6D2 /* Waitlist.xcassets in Resources */, 982686B92600C0960011A8D6 /* ActionMessageView.xib in Resources */, @@ -7304,29 +7096,17 @@ 858650DB246B111900C36F8A /* DaxOnboarding.xcassets in Resources */, 984147C324F026C800362052 /* HomeRow.storyboard in Resources */, B6BA95E828924730004ABA20 /* JSAlertController.storyboard in Resources */, - AA4D6AF623DF0312007E8790 /* AppIconRed60x60@3x.png in Resources */, - AA4D6AE423DE4D33007E8790 /* AppIconGreen40x40@3x.png in Resources */, - AAF2E28323E0495E00962AF8 /* AppIconBlue83.5x83.5@2x.png in Resources */, - AA4D6AE223DE4D33007E8790 /* AppIconGreen40x40@2x.png in Resources */, 85EE7F55224667DD000FE757 /* WebContainer.storyboard in Resources */, 858566E8252E4F56007501B8 /* Debug.storyboard in Resources */, 0A6CC0EF23904D5400E4F627 /* Settings.bundle in Resources */, 85A9C37920E0E00C00073340 /* HomeRow.xcassets in Resources */, B6BA95C528894A28004ABA20 /* BrowsingMenuViewController.storyboard in Resources */, - AA4D6AE623DE4D33007E8790 /* AppIconGreen60x60@3x.png in Resources */, - AA4D6A9323DE49A5007E8790 /* AppIconBlack76x76@2x.png in Resources */, 850ABD032AC4D46C00A733DF /* SuggestionTray.storyboard in Resources */, 1E908BF229827C480008C8F3 /* autoconsent-bundle.js in Resources */, F143C2B21E49D78C00CFDE3A /* Assets.xcassets in Resources */, - AA4D6AA323DE4CC4007E8790 /* AppIconBlue40x40@3x.png in Resources */, 1EEF12542851D32B003DDE57 /* trackers-1.json in Resources */, - AAF2E28123E0495400962AF8 /* AppIconBlack83.5x83.5@2x.png in Resources */, - AA4D6ABF23DE4D15007E8790 /* AppIconYellow40x40@3x.png in Resources */, - AA4D6A8F23DE49A5007E8790 /* AppIconBlack29x29@3x.png in Resources */, - AA4D6AA523DE4CC4007E8790 /* AppIconBlue29x29@3x.png in Resources */, 9F72FE272CD223A000BA35F5 /* add-to-dock-promo.json in Resources */, 1EEF124C2850A93F003DDE57 /* Trackers.xcassets in Resources */, - AA4D6ACF23DE4D27007E8790 /* AppIconPurple76x76@2x.png in Resources */, 4B37E0502B928CA6009E81CA /* vpn-light-mode.json in Resources */, 9830A06325ED0DB900DB64DE /* BrowsingMenu.xcassets in Resources */, 98EF177D21837E35006750C1 /* new_tab_dark.json in Resources */, @@ -9786,7 +9566,9 @@ 84E341BB1E2F7EFC00BDBA6F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-Yellow AppIcon-Blue AppIcon-Purple AppIcon-Green AppIcon-Black"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -9810,7 +9592,9 @@ 84E341BC1E2F7EFC00BDBA6F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-Yellow AppIcon-Blue AppIcon-Purple AppIcon-Green AppIcon-Black"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; @@ -10363,7 +10147,9 @@ D664C7DF2B28A0FD00CBFA76 /* Alpha Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-Yellow AppIcon-Blue AppIcon-Purple AppIcon-Green AppIcon-Black"; ASSETCATALOG_COMPILER_APPICON_NAME = "DDG-AppIcon-Alpha"; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -10752,7 +10538,9 @@ EE5A7C472A82BBB700387C84 /* Alpha */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_ALTERNATE_APPICON_NAMES = "AppIcon-Yellow AppIcon-Blue AppIcon-Purple AppIcon-Green AppIcon-Black"; ASSETCATALOG_COMPILER_APPICON_NAME = "DDG-AppIcon-Alpha"; + ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Contents.json new file mode 100644 index 0000000000..1d545cdbaf --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "filename" : "Icon-Color-Black-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Black-Dark-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-Tinted-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Color-Black-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Color-Black-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8ede897c9d940f381cffeade043c93eb4d904d GIT binary patch literal 18809 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%0A&+<@V5*w*i`%I!TK^l<9 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Color-Black-Dark-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Color-Black-Dark-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..2d666cd7aa14285903ab53945d1d22d4997f4cde GIT binary patch literal 18897 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Tinted-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-black.appiconset/Icon-Tinted-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..45bf7060cc7c5c653b8480997e09eb285fa8e7e3 GIT binary patch literal 41976 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 LhJ3ZGW%&O9*K7=v literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Contents.json new file mode 100644 index 0000000000..e974cd5cd3 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "filename" : "Icon-Color-Blue-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Blue-Dark-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-Tinted-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Color-Blue-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Color-Blue-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..edcac2d86840973e05ff38e66b11abe3d1b48e97 GIT binary patch literal 19039 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Color-Blue-Dark-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Color-Blue-Dark-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..7c105b714ab4c9700f4d6e63b2d37cd1903e84ea GIT binary patch literal 19058 zcmbSy^vHkq{JyP7!IOQxpjS1*DcxkPwg%kyt_j zMY?MrzR!Q~JoC%UJ@=mX`^-6WU%U6*a}$j3Xp@t$kN^NcuB)SA3IK@fM+86wzrN}8 z{(J`jAkNspT$4^B41awM-!%Amdwzai-6rRDmB{k1ZArZpBbUOyp+&E-+MT^)9;MiX z?5@zn4>{$Z(NsS&W;s-)Md$aO1v{m-8IyPG-X{paWB%GII?VK!QJS)y8r+=?Ol zho^^!hju;{V-w#WMmFFl4EOiz2851rqe+lS0t^InX`ot~a5n553(Hs^L`bQ{oxue#WE{6qo` z@uTRNflvo0x0}hzyFKz%KS~QGGVvFC)eWEUzjLL-Y&cEbUgWoiJ!^4ra!m}gmX9~b zFDKvda*_zR`|5=eexp*r-O8!eY~y$hfAj;t-PN<&A(t!jc*q++=l{6ZCwlZTe%i*e zQ(Lh_qJN|3UaxuX_td9J4MDLD6Fn&(^7QgM6{4;qZm6rFY92hh*&T5me*h}Je9ib8 z_P@vfzYBA;dAHe#DHi5_`%4<;ix%!v{S{u$PFysy)MM=TQu*4jt+?)s{|9V8hs9&b z&kDYS3GE5n3q@>@mBhhB{(TQ`L#`Y1pR)W6UcWc>Prmd63j4FpzD+x?*YcK6>J^mz z00Qr?uigG2delt&&DJxY0_#9#R%^GjEm&^(`^y@@@w(`5OYD|Ymh^NL8McG`-G`NL z|01P;c10}BxoD37oJ{YKkv$XvkzRj4E#In!M|e~u7$V1 z3-a~w?nN`jmQ{~;zo6`qn{fd2o$;)K8Q)T~nsTf^P%O5^4!i%(-eZzub{w0-w_;@h z^S}eg^loZW80Y$jlQR6v|CoU{%oi%OI!JJ(F?6+=ePbQ0%GnUEy^@m}gBw@884ddl zm>ZrK@8mVPL{@!n{V-e<3gWUGOU`_A=7|MgZU{gAr_M_xaaJer7ABY`v?Ct&fb8Nf z5Tg+KrbrUVgGWX|bW@ z4&V9ear+jlt4|HX(*z#orZb4tTwYha)@DQSnnB&G3B7b#SFfjXKU3A@aCZP^g%1~e zH}3uoc{-ac>-=-Xa#AlEtQu{l4~XZ#vGD2ghMRAGk#`vdR};YNySBP*dV2Y2cEm+X zh47GXHKMA2;n!kx1v{lkVi;Z)RmcFD|FgXsnX7ofapc^*W{R>WM(LhshTm*=KqGhB7DXejp*kb?>8uI^>uNWyN3xKWcYhL;0P5tPbxwU1qENuJQZz2y{Odzb$mLX<0zY$*lZt>_NNZB|<=Mjd)3~i@398pKn6HI%I(B^hWf^kt=J3V-f&-C?P-d-Ceyc^88V5mt4nEA^rxl~4+S zi{Dw?Ytyel?(hTmnYd1j`WZygQYW>-rn?%auRamuujlTg;*0eCsE+e54_IQCDe@p&gTPSWY(uIGtcP4^^GYBi$eztJy?wv#=wK!VXwxNBzHV{`J=L#llJnAydT zkL+w^aC)yR-I=c7kIhLitdQe~ir3Y5ourq=ZmiID)0o3Y)7BktfPe5=gVnn;&Y_~G zz|u3`AB|^@GNN=aOwB+Jdb*bGWwQkSV7G9pOW=_@7a;qvSM?zkKOMZe$xrjI&aOC} zrZyL_Liem;O6oFHo79TH88QEGP1{Pgru&==_pws^HyF$nD9RP1!u z4t-`r!++_FE%|1p@~fq9cWUj%QrNCOskyNc_KcjY?f7OY(g1Ep=J--mQgX1xM0)O= znt5K3)i830uIAc7H9{g6QG`FCtgK?(df>aY)qtm&*=>LSD&N=CD7eXOlXcgsP0Gkj zty@9#HhV1ZxYYTcOLp5mvfgbaSB!&4sdqBom{ z?_R1rF&At4v6c9{>9r{rSX%ktkvER^SIQS*Qw+^~8bDqB-<1)*u-(`vx3iqnX~7#x z{is?s0+S2BJ%8J5>%UuSSko`BRA0Oq;r@Z&*zY~BTTnKx&3(J->!D6cOjR~}BY@;d z@Sba9>+udu2u02*kn+lo2BrMoX76{=nxm}1F-M1AC)c{ar@6BQFWSrV=F-994=J2B zQTroy7&EhksWz4Ru@EmWk`D=2_{5|sS;*`AMGA54gHoo&U9wB`ay2_0x+q!-VFGH zWDi>;tfI{Vht@Ao=4Aw8FuY7liKUl(|TNR2lGbslZ>8rcO5eWyuV404sGp zRJv97yTy$G>4~YTK3A`Fv3gWqMG@uPUE8=F;c?`Uf-g1s5d8H*O>u#Y zWNbYBmCDylt&x=J;0^9U(?698N}E+* z{9AnfM_m!F1^(yxk?cEZi*@?qZrA>zsy3&e!4xwfP9VwOcAEjRo>3reBw*8>=NH2lSjAynl5Na^vXB53D4y4iyN5&7c>maMMi0FwiF_5 z$}vF@VlO??=3+FS$GnzANiEf};HS!Sw+q_$yECq7u)K&jEW-5of^5ze)Ot(_o}VmK zRl=ctjEf18p-%FI9c_5iRTB4~)|EWb<$!VzWfZ5CAzaLdW{4Mgtv4@~g#W4j4)08J z7I?>m>4u1ToIP6V-`jT^V5O9GSCU-0$z1u$fbs=%_3=zIR%U%@? zT?xNSVd)zkI(&V5Ohg&kWZdq$nZ714d0^!DuUivo}DM8%|n{Z?c!`duA2ck7E!T~efAcruxB7K5h{-|#xw z^DLGIe{^su5mreq=0T2O7H;B}>~da3@>SGRV`;8@LiyUX^NI(=c6{ZS0HDRV+R>&L zoll}nMw$I!))t?X)+>ZnDFEvO=~X|Z^5Frstg;#AO zZ(iKJDGMC&eHR12ZSDNqkt5$kO7SHB08X|~A0Z(roZc*fvTy!KG7E4e6TcQ{J83ue z{=M|+p|U;+8?kG-?y1KvLf|;>MaSs&e@{f&gm8*4Yn^Voef`r@o;!>xto(lE&UnH1 za0l)Cc!t!)+5Ia4wz$aQtjuput)fkx9%Dl;4H`@uFb|Mz$!+@(T0asLmxgKHFC)gN zlJF2f+hr>G`4-1KNV+>D(jZ$CnNHt!sR~Iy`$8(E$^;(k&am0b$?8(({AFn`+bc*DQO-jZ)_2(NC6!6s*p?) z;cK#5DVyW?i&;#2w;PYw^ro)d;el+@U?$b9Qr`K}wg~-|UC+!@v5l9zQY<%b4(h*n z`sQ+ZkuyCcxr1PZLB-^>+?5l2CO2q!HMVj!ffZ2G|6ZEkCzsTvaX5v~bY2(Sp$uJ{ zn3bi{c(8#Ae4plNWw}w&go`qypx2U>?xwP(d$P;bk5*QLNgfoc?|sRW?!M0wcQ#r( zll!>qIV#X?vHfwIFrCURVLz!m)VOh>q<=$AiYWOwNC5|I@p6E@UY9p;Dw3)CV z2OF9`=Ib%5@=rXmrjY-yR4_S>V%&=b8t;ugX55S^dOGl*CG=dO-`ul`tVJ4N{e!=0 z@|Tky7sK%c`*k2k8aTX+J$rtN<_%tAiW;4uj#(ZD@{Mv|hyT#GU)urOmLfIb#)~(Z zFS!n`^e7)=?~L7Gfu5}tMI2Ld;+UguV;D2YuGxIUesc;#Uzgx#0?uQA*Tw8PYuAdS z4|kPX(kiEB7bxHSTcvHwF%Zc#=9piS{=yf~I<_AP&zTomFy2qLoMeS=iQpARu68dz zIi3ac&WQ_5ii4D|?w^i+yX3iGXd@+wF)22ZJ`^0R2*4{0g|}AU{vdmjDCcTi@RRZe7x`*Z@{$rEFkJfnEciw+l*7Q+@^GFWUqtYA(fluF@~aTsawDGtw=6@E07uVpQ4@ ze(1udluBJ&ogIkpUuKH8TT@!)ohzfC|EhOzmF*5^LPQq$t9}RB1{d(K%Pl$@tc>l8 z0N~Shc!VsPm>8Es+o1o?^5Tjyhd}V54)Dsop&9bNTDyNETcRDt6 zhOZ9}i^oJF{NgJWVQ(3w_QTy_%BnClpfOH<)HTVEMZ@IP%`Uf>H_on#4lc#(h;_KY zd=naWa280-Iq!0ZU4xY+xI#V^9ry@-3@te^$_|($MF1Lg2P8CDV%rz(NckQ>Vu$2k z9=EpBqi*B~85J3NH|Sc?zL@@t3OK_GsNAFalXFC#3Ut4CF$_$ZF#+;_Q6O8f4u_Zo z;5V&QvSZ^y0^|Wy2QY~zSUH!R)I>T!h6dOHH^dfGi-iC$I2C;SF_tc1SDx$>i6<*y z091$vM12e<6Ve1B0_aZ70s${tK7)>to*$5CzqYwphy>!=0`C3(PuF9?g%q9$D|Wz9 zqx&3=vVcpX9V&n_jUBuD#yi_>w8^zI5)sTFBcYg)TnbQ~k({`6KJiKmZwa%nMS*0| z;}L?9Fx;y?E1-YKW{+beu63tZ?58121Bw8c23f&7n_J;=m6=axgbZMmJydkSvJ{lw zD1EA8NJuWGD*%*Jnb96mAZ;Qq3P9=&e6Xb2Bi+J>Rs|Z+-gtb$1Eza>+~#I5|vb-MHuUgMo^nI=sN07n!7n`M2(S_pzcp|Fe82 zojRA7tPH@Xz3+W*v``F`176kVgl&qb=H0fx9K_6H@n8qlSRI2LSXVKoU8{6ohk$3|q6;1F z34*T6MBip7eaYK-%aJsc61@rLqh=e+I3y1i%by;j`+2`esLecYz!|dBy^ty z&8NHCh88;}?%dOVI&ldHhcb>FlF|5HW)2n~8-8_c5@qGl_mI^V9Bz?lu1v8(R3NT+9kD>$6%wo4o$MIos912$sJed4E3XAcSF4o5lD!(eHsW zH6So0Eo@8LMW^$-9oO+4eR1pZ z8BqN9)qFB0Hcx{IqgH*SpfpM^1&| zKu0lms~vNb5i94gIt+ra1AqlFLw|0@@^r0&4TbGMKfNq*grEf!%9(Re0c{+I`OxP7 z*;woB8(7b00L+p9=`;DRWR@5+E@}Yv-@KPn((dXY@tuh(Lu+9t(uxC%PUUdkObp=t zM1i581+LLLtlMzPzzU)1{WR! z+z>xa+r3P#FI->jS|AD7PYHUWxo#JcvfPM@3Ty z4@9rRA3tLP7HDQus6WB$)IT3A5c-W;r8r^Yftnm{jt3C;W4#Lv3L>kh56(n9J3yi& z`g7I*SRn9q-=eUe3iL$eq>J%*Y{fa&gZcc6bGp0F+n#Y-Ed(S-5*c%sGQnMvd5D4| zgLyu2NhNc^GICUzxw_aFc9gc2jH%+5nVgb&fy2^fR#+N8D$k!c;`s~R2a$#_YD_=T zpiTs@2drV6jWKd6VY|_*C9D zVd+5UI=LU-Ztdr7T))tE+xwe&ay00N|wzSfvSAD!rLC zUv4y;q{5`>4lUwFjyz-PyWF3|etk061Jui4R5j$2{0iFou=j5*#gR916tDa5HZ$$S zlWK@UoD0Ow$?SMxNlRj)lEV0+)Sk5D0hv+3b04$8NDd29T!fn!&x{6I>A`17sfdss zGnn!J@VUlkt;BDZGC&F-5v_YAj!4&5EBtpoZ=e{;nenyqnJx1-HUwt#0~ff19Ejg- zji8oJ&F>V7*0>tv|50Ik;rU6x6U?E3=xnLV?vuEVMTZOD$oP5EQ2nr5GlJ>w1RFwv z4-jfn!Ka(7t1D}K(I+BlhzFjKVOv*vM-jZG@!)IJ0ic%D zh@iglRJBl8s2t8>{bvWGpN>3ng%uDMncVbnc8zc45j{2BvU&0@*5C=`TZihW5iZ_O5vkn)@?%eFJ7IL^N>Z1 zrW4^iD)z$$^A9Ew$56gBXi4rRhB?+gKwGm!0O`)r#(<$9+h8{hK-_Lnnzl)Y53!_0^qGceGuEg zt2u-<5j5>lT*||Nlf`^^!poFTfPP9Xd;Y7cDxK^2c1;>W2%c{eUWi5k)NO_hi zqhHC84r@010C|}I7=p7;Bqao&4)phO+#iAMH?bOGz1Mwus}nkFJ_@!VR=rD_6&tZ{ z^bhMrkv_-`ks?IYQ}m=|&L^Suy0jbh!mmXD#h<%A_eQ53^|5@#TQI4kZxiRgFfZ!o z!Sz4soxc>;JvGi)cGs3Nn+JnBWoV7nqTBt+W|*a}4lWM6mzI{=q8y8I2n-IvHWtKA zf+O(|Y$x8=NG+7gn4~bx_u}t-_Tnv(xl8{zp(UDKJO79lp$pYCgsDK{zfM30fnHqd zYHN&z2Pz+Uk;D9$2cn$BU35_aVI=PQ$q&h@m=W3Yw+Q8e{+#s8E>lF(cK%U=SnUZF zns~R0LCi(N`7Unj4sG~Mt6%q56mZA{od4F10{*O87U3I!b(Kr0h5CI=(aGIlb=N*; zU^9*w#O2nXT(HtYyA6BU{^45+jpmeJY`nDx-cG6p|M}@xW#9^=$?eQXD`g}qZ zSa}{dG-0FxFdb?PyHYt4?qzp0dKmH~_Uz;?sU^Q7Hf;8;H)+r_RP`dCGNx_Fp;NUd z<|EhhE0In@6N3*XP?Iq>h`FP>z~MM=ep$s_N&n8maEYX2rQ^c=!dqgGx7j3~EQBX+ zd;5m}Nb>JI2_?r|{n2J1Ft9d5JCYV*Nzc{_+5IW?iHGyBf5d|)x1URCbVv4Sci)?g zf`GpZ3dJ-vV9VVu|65eZ9Cq(GVRfA{->e?xlF1b*wWmoR^XNxiTnX}gXR(Fuy= zWZaZn3JB^wo}-A6K2hV51g-B;g-aDmLNpn_TC>BF|3X7FjaZS@bnF7}*vpFB&0u-p zb2p*ODk~7kVsh`68zM_l5*=kTCLT=W++|Gk2qjx$1(GJ}eJ#HTM1Xn=PtklR{hL-- zUzT6V!vX7z7BXx%u=jaiqMj!8lg&fr73c7Q@@5o^gPt@%(P(5uvmRA3{2fRk`Sp>V zB*y_6!*uzgC48Ceo00d54WTKFCe+~EXV9&%+>DA^d_8XY_YM_H#KnHXS5W=8irdw_ zr)fvIkAP?&xZ#k>$|4drBcVt@l-U>Mc%1Q^)8ptJ6PT<+Bn>bu=1)nYtNOMxiWKu| z{!EMl^{-={ib8h8;UAkGkx>adn#IM8+?zKV7vO-c?#XJM5THx9O}=D;ytF||*4`pFTOG4`g_9yH9cl!ZaKOZJ( zEotpXcRj^22PLx4omQM_x&N~u$AP>(M&7l~P|AwsdZ%5Wm(z{I}4sKAqi+tr2~ssh<|g6XQp zyV71?-v5eK@dP{po;w>sU_qGXOaiABJauS=Noo;2K)Vf-4T%&{VYxI4=SW)2!|2~u z{&AD=$$gX3@$|cAQEHhZReFC5A)S;d6$%SO5<=5Y<6CV}7}~%j$e;1uwoN7zFpkFcX%k zve(wEi^IVTzaY>8-)t@ph{CcXPHv#Ln1)%q;dZSrRNky}+WpTTvcJWO%Z~B)!?-#w z8qK1xMqioQS-TbSWvK8wo~b8aY_41CcHQFPmYzhr=~fVdXwx<<(0doxd48Qs%O7VI zJ;%?^yEs=P8!?)&m8h^*dq3H=0)N(kJlBfx$E7P$Vw2E(pig*-sGT>IoKbmzWo za@;lpfrcZnP8a^Vi}3lbBp{D%p_+LS3hHcqYdJlaf|zz9)4}|E$uQjlfH&dba%Y?a~LHB17bmJ{Q{&Wds5` z4r71L9tZzt7*PW9o-hF}&Ye#3bs5Ew4f1w)=7r6@(lb%#HWU4Wl=O?rIQAfoa z(-WDbQi*x#I8k|Muvi5y(M3F2Sbs~GBDqfSPqESW_jdxA>_SKD@k0C1k@6g`wA4BW z{a$q7fEO3lZ8-Gk$V?cW*rM~dk#*0OsILZ0WGq`1`Sv4jzt20ih-H;j$-xAL9R&DOG;mEC51mODKZRjmBONB(=#e23bvkU?N!>5YGR9GSiKRAd zMuF!>gn#|R!{VRrfJ2heS;b8@nh{&iLQM&`F8^f-?6>vyUe{m!8d?lZlgTKl}<^{Mg{F9{X!(Gmav?Y zf{(v+*mWs~^x%3YOj3!knqg8R@7bNGtUgj;=zR00C-Nn$n+C^}*W>6uZ_FE@23{$Q zDzZemvEU4fu6*2K755rx0dKg8+$t^dAw7Kg)Z-~)u$$rbY|@KXa*fFqT4abPOy}go z2Rxd*H`hb0(Uc9&Vd+Gd0NJ=k2Q~68~{S&jkx>D zCMZHi^xL&XE;B*x+czz$E}R8icwjj)iuh0sav{3B0vdC=RI!;&IP>52(;z+eKPG|! zJFQNQlrE-|`29FC&l%R9vIvXlz(Fm9L{=-$C!uqibgYKvjpKd!)dtF@Nk*Vc5Y4>I zutMp;7ooUxbKy#y8mB=BbP;`6no^|--M#yO8ocue*hwUq7R)c;&pLYW`9Dr~FE1&c zUz*Z{<+{b;?*2ar&s@Buxc?*Fy4)F!)?pXHkCEqQL|#b9p595cdt<$Zy2bbQ`mak) zMx;GU-a1Y3eOoDiw1(NWj663UpnL;{#EdZkCe&|eqN_$V5Y`(=9Q}V)?`PP|VQ=}% z?~9$I1wz2!z9VOV1&$KN+%_>cu z0S!XTRX;N=HBQwZ;4nen?0skqKOZ-0jlV8*dLB>rstL;xr63q_3N5PfSD-94uR|D0 zZP>Sc2R=+#&T*}0`WJn{g-z?(XGU3{L((p$Bn{t!0AF_~cd1nnGF0KbhH@r{pZCyt zlV#;cD*xt&4L?f(3XL=W!f2+ty`Vb-<#aCZCu7h??oOG`Yh?tk@G*K?YU~!Fnt&&w zrHoh>ITVK9@b@4nV9mRs^FR|7z$j4>?+S0aM((!mBEum|4S`ar8Ci685)sw#v+2ka zV2&#PIsZ%8w-s)fH3!K5k#0TqqYEvx4%ATY#$J!I|8uPR6vO$CI_EjdEbwUX_dY61 z8=(D5hKp>t9_LPJh`jB}1Dmk~hc#A!qu24W;I|^q8)ODb{3FF5w4n?h(;JNfKM^S5 zVnejLEH_$0?t@Jg6((1B_LiT6t-CO$XlPAU_5pgR&z8zHJIjj}s!9ojOVNPeo&kU7 zHmES^k^hrLSHc3-l)15$?B;PmC*6{?#3i}?E;T5tSnL2k$t9_UpXoDu6D;$>5S&?` zk>iY}2jnv(=kCHfw_Ns~jcJFm$Z4>UjCF-|z<(qGuW51d^5a=RL3q$B#4*F8?$v!1 zt7X?Sk>y*4gxgy1JK&I!BsvLJ@PG!Cm4a@%CVY%MJNWrb%32(Eoo!y5@<7F}=mw8{ zZ+id!pC+A+!4ArVvNU)mksu^k%{XL_MxQU(c!!^xPMp3wX&X1+HC0~YU2~aR8SuMp zU*X8Qq48!>?mQnq*bsp&E9E6vtxT}Q|L)cdWjo{$B~CSjv*oIy?nc-*^?{WPR9o_W za8nx8uO$CR$^tJ_sdm~=(x;syw89e;{tWutv0-FM!9YPXUwJC0oG;{T{8r{lxfxLx_2^U3`g*36>u~)9P zEZ8akS^ZDRN>(yx=%)#LtHF(4I$>b<{BYfNPeRC3XLGVQme2u#CV@2M zJ@`qz-(4^hFf;)g?TKnQ^~_=AWI|Qgr`SwLv}I6EPHa|V^50D<-{?dl>*z5F-1Tf^ zCU02*%=w_D|9}dTVwlwl2RAsjg$RD~VOS=QVv$XK!}d`N7YRlcRve(Qp$AF&4jaHa z?V_s^VL2IkoQ(oF=a~fT*GQm(Yj*D8y`eQa>VccBbo6i~gYO#H1OuLGE=K}Lgk zw~VEfE;c>d8j&7#m_f_Q2C7WwE<(0a=sPH85f7=4dgR=H-EM z&dX<(aK9G-jtg424+vR#H(jS;R!Yg?3-@@y%69M($lHwfBBT1pGTiG?CZnaG3z)O( zJUln@C}FOH3HJV{`IZ-Z0|AU6PcrV{#U4^vZ8NCSdrL>=B61!^NU`fkpO04cGH-Lc zmrenjyjV^#@CjyHq+?;xp|jc}SL+kOEvi0aSn+kpvbzF&^lAP6zkxA*z$(Fdn;W8F`y2+C&C#3U2Q7LnAQBEWlrk zd4#}t^its3i3@2gTzU|5Z}aW1B$6{1{Y@@pe&pUwV*~cEVP=O;?yI+gmxFl9HNS>7 ziNR}@aAIsPp&-L+d`7HjP{i9Zge(`53uHLi)mK)5*5ZA6Z8sYJmY^k$8+N5>q-Cw z@6_?7t4h}dyJ*wea6u|QI>`DLG&AxNv51+hG}l&idB|7l4f4|Z(V&$gO7MTZvNIWo zXhhZ5zxaPn#eO$&l!{C7ROhGB@(x`;**(}1s*_)I z%(cETr(eB!zZIyIp%E@>SWgo4IYCr6^Ett)I5@nJnphDXIQNgJ#acD33n9@gbXT5U zqBnr<4pUHloznnw!QV zv8B9NElZF)Xlt$*MUq5VtoHjIPmG|NB<{zL`5&QTYoXEOA;-f(;d8=BUwbFEnQu@V z4K5F^rt=ZNvRbXP13K_~`q1;%!lT@S=Q41s7J}OhRDpb0#yEI^xf*hS6&)-Bj2TNb zA+SQtf&xM3B`~t@5c<5kgbzsZviO?&lQIwJ*#^*=*t^6#z1>(N8hT7fY-ORLJ29|g zn`ySw^w;=f2VemU;>B7K!a2VL?wCUXIWI%xgZQqi%D`XAna&~;fkwY>XaX+8Xpt!r zT8=;^tt<*M8yLj)?%~7hQi$gzueoLF5jfIfa{hLosb2%8e10iyjLG7VB@Cd)JSBIp zVkWYN?I6csZsySY*Lv#I7+L5t&+qfM-{ytevuAA9i9j0-@Six7BQPRV1(Zn_mk>cB zpfa%s2^>wwqt5usY^DRlv{wDH$J|U`F*bHms1|{f#yHF0`K^4+(fRywP&MVTJ3 zV8{%dIlBnJhE1}gNS%Oq)Lp*oY;k^R3S$4~WOUD0S~e0MNR$|BiRBNzN$Dq%4Al7} zKeFW?z9yi%y@K#HCNq;EWGB|L`B+MG>$$IE@<_Xy2_L`;G65mw!Zq#cZt&p_44_@j zKmci6VyQ&`cA?uMVk7{KR4EvG6N%0Q-ogXhhz9l{6)i*ylAZWBp>Uc$W1smzTs+VS z{&tYa0+$Dv0VeQ<4v+;ZUWfyMV4McP6EvmpTStN~fKGv4{~Hl7W|SZdPCC|__W-H# zuytReLUIZ1$WW#4ztm6)E&v80!3}=?MmzNCkbj5+Nj(arD#F$|?cte#z&FCAe~O{M zRd)ohjgAK#PQ4Eq{CQ{eL$)|&f2e$b5yH{c<`oI1I4?+n#$NZH<=;)dyb9>S7hp`x z%&nAl9oEPyzdPmm{_B;qsP$^m59cW{3lDD75lQXHl}L;IB9%=(%<>FkM#?NYZOY;6 zwOE_R@M4tngeLXY9k9vJ;!UV!886_%RiB}8gR`*3c1;-1=x2kizF<(}IJV$FP_B3>!0imFG zqTbi~{*q@u2#yRP>0uRbFKo&wK&2JNTJ`piV}))wCV!|)#0b!WJu3pbX`Z*bkB zn%{-BW%KvdnbiduCXYyh)<;;TR~RdNJvit5uj9XY47*e)B-Q=Cn-cUMmi6O1{@(S? z4T$5uwRyng_y;@@)G+zctOa8=unsdY_F3@jQy|eKs6r|q6?66#0n}+}E_yslg-jGn@ ze!kQmSFva-`5b#et&ze!>(dI9umK{Bto`c!^;r{ULWxkHHzDu6=?ZPX&0^;}id4Q@ zLyf!7%O*O+3{95EsPfOhixJtQCcxnc;fD+}850CsVXU2X@9r}d4q@Y0sSE2jkAp(Y z0t3&ev%)+*Ve)}nN%U)JrHMg5ug?lhJ16QN2WN+FE*gARG3wHzgq?SY7abkjK$lhm z9V2Qv4wK(i{`icgDFCbLnl*XEN)WN_EH>p3r3Z7uLY?3J>$qk0F+AiM{89Wc z_YPYtz1!;=)5#hQZ(M+K4DrpBDsa9m0cUkatp7Yrm7Gn}$Ev__t9uq;O_+v}y9xjg zV)5UhnqFdB-p#9xHJIXuYeyv8X}t%tVy0n872rdzksiyK(vGKrF5LsrF%OR3n&UQR z#i^#D{07t+po>QA_?CL5pl1uj?hhD4q0v7Gs_d3kG1=#nIdq@@(p8=ph@4+kFTohT zumN<~_o`jJ3-NWxv(K-jb8dX4(4up>k5#G^BWZys{-_lC&?TT4qeYXNBPfGs;08W~ zk2WI5Ym>K0N9|e%JsGD>t_2#HJ*+R}T& zpSKv17)>AH{4^d3{@uTKOVIqR51{C_9D7u*79Td;;Ldu&dh8*&aeFnNlA=QC{d?@I zL}d|>EpM0sm088j5@B?s`#rjUgBa>>o#Z@@Bq<)!gM?rFfR)qSVII4-B=UX)#Wlwf z%khh8N%x8h3roCPU2Xo{&@gqaW&ZlhIRo=;+jIrF{6zVQ%lqOKY@zAE+H zM|4sV!6xXT>^W_RF9W2!47RI~rW8H;(9gSlv_T+J6$hP5Y&4aVVr9D?IgE1?KJwBT zvI$Mpa4+jVthA;YFr$SsAwWmTJoqIM5hZb?CxV&LLvi1bkc?PcBFidd zAw^tVnn5H=;!cW;xGMfkU@Z$+w81r2&Re(Cp*bSu;o#StnEiTI~R;E*fB8u2uJcA@4vb`vmu3;>gu$LMk2x#=O9=#aCE_tKT!3bm zA^?c)FzbS{Z>f%DXs@ySSU-@?an(QZD6~QKFwZ#rkEYW0C2UO3sb@f)9?~oi7gCS$ z6ON!nL}Ib~8Ck?LromsZ8ESzyuH922NNsS>ta+I*qRoQ@y4cqgWoN8UW!8_T7iG53 z!{~Lh?nYt3ETBHt-kIyKM{&ii&wxg+P_H2N;ba1~9+3V<1$-fhx?n>6^+2tqNCLao zD7vXIRuv+)N`8Q&XsKeiS|k{Tn{m+sz}AFPAVB0u1ILAj#{*vamv09GC0m?X;Z*6Y zf+Y1U0W$8^fF~0SB}YhCK*$h&H6l|S-(o?9v`%41a15!Kjw;^r&FH@@9*{$7H%$a>gRH<& z`g>JS*qX=B(T)mzp;>8rtpODQ?}~b2kt93B_Ys9vhZ;r5EXCoNSUwmo6ia~N-cj18 z$1vVUP)sTmC=;7ca{(pnFidYV@5SQYyCi8?TlN$5L=?b2geYDIS)qgyA|Q5= z{4MGkcDzD%{s4uZ5(9G<@W1LHftdVVk{vP+L}6_o;ag8C=nYaAJIoJh`szuNwvxx< zH94=fe(OC!=iUJaKtBNGbYTvp7X>`o)F%w1GmnA0QYpCuIi)+Rv?lU*FFYZpL>-YmuTyO;B&bt2;$Mp^9Eu{V z1xe?((LsFQBY2hS{$uPU8vQzw6keDfI5|iI zJ#zalNUC}RJSZX@eQ^2eI_75ouu6So#WO&;&L0MJqQbzKAQ((xkM}6fAyof|y~}tg ztYfInWNiqGhyGkx2@$@Vg~TbiD8b||iJrID6Wfye@TWXa{cB&+7Cu*xu`daFtt^*C zcr6e7H9_pXg)!H<$eXa^Oi@$`kje~BHCRKN8k106bQIV3@Wl91fLU8*)UPg*Ep2Nf zBkvZSI+}+{--LpSTPvI%)%fMGNI3Da!~^=4zh9TeSw2Ajsg?jvC?qU_gCNAE8Q*ec zrX@*9Pz&R16XdC{6d`3IqP7A*yfMWI4PCFI#1p2&?eQCBIfQVl2yrT{;!aVFc2x%J z(D$&J7iuLc_LhjOErc>nMR@DggpMTT?;2Q;pA+_}s9a?AJuxZ!%7eN;XQOPdrc~@Y zY1gAg5!V2E z)31wu%%-Wq7oQglH91gf@@At4F+GoP@&B$u?eRj_AHrKn%umf2(8xU-c-An64)3%( zHf1JAC39}W+v8sgyoAl|vm0gzS4m*99}!bI)Z%F)C%P6N(q%Y7m|Co9@X+Dt1si(IV6)#E^u$&`Lf31HXCvIBy`9Gap`#aPL z7aucYgwZhN9y6&1OPHD5WoB~Aoh6snL|K>A8d_E)-x;ITMaCv#wI*y~6>^<27}sRn zw!9&>+!fDK#|#j5XgCa0n;r+^p##8a*n=JZWca)y8Fhw`w(x|v8tyloFl$mmSgnaz#&_>&{^cVC^Dtrn~G_tw9qbCvULpVM|rEVqOz z)MYcK#^GT?cJPmKS|f07r?mMjvgSi!;3VkS1W8k)uaY7UCVg6=L7S-l8ga@Ih!1=6 zs^3cV7e=yDMN1PBcg?nD3GM+JkJRWL7vB>5VGo7IdCZP&(7vB4!fU+$p#|JBKBwWM zmk9>%Eiz*=yuuQyY0w(5@S)*UhPkCo%gG z6){z;3dwmkN3D(J2`0bKy9WXEIUt)Y%V$H2`*lB ziodadVS!o2PIO7cvc6uvCNsYLnKU`@(!R=wf#R;>r(POEsU9a8<1DgOiM# z?u|wY(IajprNK^EvWl!y4Vlsb%k7SjLtk0FvAU%x1a;3gMlDWV#FSZwzsR{OU@wsV zcx@Z~5!e(5yZxgz5tlTfF=MPQ^5l54d^Ie_5tqt=9@`Oq}tx*+u2@+Xc&^ zayUju-|VYv8JY(E)0wJG49|R-_=dz8Gga}kd?07=i)&cUX;I#ng}}NTUD(kEsP4P| zOFlW!?pRVv;dy945OGlgQ3M|3L#qhl$Lg`9Q z`>S>*fOnxjf;`aNe|qR?b}OI!*6E1-Yk;sFWqt+DwG2WWbCt0dpMG%oB~7l?WRJ`v zFoE*DCPWp{coFu#@^`36Og~}a11)fd4zVwjH!hBlVy`6Ix9YoJ)?M8J;2KS^5{* zLeI?GDgPJ(7ZrEWoeX)w+x0@1YmQvP_~xF=F(EJrFu5k830iiGZ!PQn0`_HW zyx7GtdDO?2p~bS`-(&xRqB+@zh$3;N!{|9QB&%TuyWTntrwwJcNFWrF{496*Rq78mKa$60Cy_VCeP_?RBZ911HsE4)W40upZL)MSR#69>9mBzN^iPiWoka-a63q{uI0khxjpcf{SDep=m)?2!yw zQe^%ZM3zrxCM*umvIP%aqPugM)T#@RBF9r?l@Mq9JR)>aq`}8(1RLc0$J`Fl2K0^=)(-gJrxlWST;TmebTXBo;|0M!L`OUxN5^|rrF=EXuks@xrm(i# z3*6rUcIJoHvaEl=<;*Ddf#ArPIgXJBJOO z+U$DrDy0;c6BsC2XH}O+LvLd2N8tH(-rg}o>OCk--ty<82#1jU) z&Btxc#5efgn*%MVJIINexHs{r2k#LKlT6n!moF+-;k@5mt*ybu=M``b1`kW literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Tinted-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-blue.appiconset/Icon-Tinted-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..45bf7060cc7c5c653b8480997e09eb285fa8e7e3 GIT binary patch literal 41976 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 LhJ3ZGW%&O9*K7=v literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Contents.json new file mode 100644 index 0000000000..9c17898573 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "filename" : "Icon-Color-Green-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Green-Dark-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-Tinted-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Color-Green-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Color-Green-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc0747ed0a94a83a5e2bb2f8f38dcfe5ce88b01 GIT binary patch literal 18103 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 UEQ9JICVuHc^z!qp+ZmbuH*?m(p#T5? literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Color-Green-Dark-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Color-Green-Dark-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..a46c1523c9c0307bbe6a29d392de86087d0fd7fa GIT binary patch literal 18846 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 l@uv@BtrqP=`lGt^U$Y!`%mP*YCBy&# literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Tinted-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-green.appiconset/Icon-Tinted-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..45bf7060cc7c5c653b8480997e09eb285fa8e7e3 GIT binary patch literal 41976 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 LhJ3ZGW%&O9*K7=v literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Contents.json new file mode 100644 index 0000000000..cf165a6885 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "filename" : "Icon-Color-Purple-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Purple-Dark-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-Tinted-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Color-Purple-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Color-Purple-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..81b06307056ef8a287426731c412654c3c034da5 GIT binary patch literal 18983 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 GrT+^hn7YOQ literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Color-Purple-Dark-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Color-Purple-Dark-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5a224e80d5144228ee3f47db93bde7f1f99ea1 GIT binary patch literal 19171 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


yOUnS*Tw76*+gA_e4#zeeW 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

ktS;MWhP$$^I>BYXtTBttI{< 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Tinted-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-purple.appiconset/Icon-Tinted-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..45bf7060cc7c5c653b8480997e09eb285fa8e7e3 GIT binary patch literal 41976 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 LhJ3ZGW%&O9*K7=v literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Contents.json new file mode 100644 index 0000000000..2ff9a347d2 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "filename" : "Icon-Color-Yellow-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Yellow-Dark-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "Icon-Tinted-1024x1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Color-Yellow-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Color-Yellow-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2f684ed16c4ab4b8f7838b85e65d7d54fa018c GIT binary patch literal 19127 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Color-Yellow-Dark-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Color-Yellow-Dark-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0cde6ae14e5f40c69ca69649bd787a552745d4 GIT binary patch literal 19081 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Tinted-1024x1024.png b/DuckDuckGo/AlternateAppIcons.xcassets/AppIcon-yellow.appiconset/Icon-Tinted-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..45bf7060cc7c5c653b8480997e09eb285fa8e7e3 GIT binary patch literal 41976 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 LhJ3ZGW%&O9*K7=v literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AppIconBlack60x60@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/AppIconBlack60x60@2x.png similarity index 100% rename from DuckDuckGo/AppIconBlack60x60@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/AppIconBlack60x60@2x.png diff --git a/DuckDuckGo/AppIconBlack60x60@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/AppIconBlack60x60@3x.png similarity index 100% rename from DuckDuckGo/AppIconBlack60x60@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/AppIconBlack60x60@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Contents.json new file mode 100644 index 0000000000..621c3b0889 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconBlack60x60@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Black-Dark-120x120.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconBlack60x60@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Black-Dark-180x180.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Icon-Color-Black-Dark-120x120.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Icon-Color-Black-Dark-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..22fbe2980821205ab2744706e572191767bf27cc GIT binary patch literal 12885 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Icon-Color-Black-Dark-180x180.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-medium.imageset/Icon-Color-Black-Dark-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..d116270856b5a0639e2cc45f65f4573e66538fe5 GIT binary patch literal 19959 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconBlack29x29@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/AppIconBlack29x29@2x.png similarity index 100% rename from DuckDuckGo/AppIconBlack29x29@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/AppIconBlack29x29@2x.png diff --git a/DuckDuckGo/AppIconBlack29x29@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/AppIconBlack29x29@3x.png similarity index 100% rename from DuckDuckGo/AppIconBlack29x29@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/AppIconBlack29x29@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Contents.json new file mode 100644 index 0000000000..4049b32a3e --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconBlack29x29@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Black-Dark-58x58.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconBlack29x29@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Black-Dark-29x29.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Icon-Color-Black-Dark-29x29.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-black-small.imageset/Icon-Color-Black-Dark-29x29.png new file mode 100644 index 0000000000000000000000000000000000000000..a72c110a7e44032cfe3edc7befce8bbb9cec82df GIT binary patch literal 8157 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconBlue60x60@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/AppIconBlue60x60@2x.png similarity index 100% rename from DuckDuckGo/AppIconBlue60x60@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/AppIconBlue60x60@2x.png diff --git a/DuckDuckGo/AppIconBlue60x60@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/AppIconBlue60x60@3x.png similarity index 100% rename from DuckDuckGo/AppIconBlue60x60@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/AppIconBlue60x60@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Contents.json new file mode 100644 index 0000000000..22de91e68b --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconBlue60x60@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Blue-Dark-120x120.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconBlue60x60@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Blue-Dark-180x180.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Icon-Color-Blue-Dark-120x120.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-medium.imageset/Icon-Color-Blue-Dark-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..081d9337a6e620c80b95138e4ba41bd502559ef1 GIT binary patch literal 16764 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

Ti<3 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconBlue29x29@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/AppIconBlue29x29@2x.png similarity index 100% rename from DuckDuckGo/AppIconBlue29x29@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/AppIconBlue29x29@2x.png diff --git a/DuckDuckGo/AppIconBlue29x29@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/AppIconBlue29x29@3x.png similarity index 100% rename from DuckDuckGo/AppIconBlue29x29@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/AppIconBlue29x29@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Contents.json new file mode 100644 index 0000000000..c2b4bd994c --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconBlue29x29@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Blue-Dark-58x58.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconBlue29x29@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Blue-Dark-29x29.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Icon-Color-Blue-Dark-29x29.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Icon-Color-Blue-Dark-29x29.png new file mode 100644 index 0000000000000000000000000000000000000000..16c30a116fb6ee81362d17f915fa0235bba6b9a6 GIT binary patch literal 10298 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Icon-Color-Blue-Dark-58x58.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-blue-small.imageset/Icon-Color-Blue-Dark-58x58.png new file mode 100644 index 0000000000000000000000000000000000000000..5957248456d1f3f9e6e11d674f7452cc073ab26b GIT binary patch literal 6592 zcmY*;1yodB7xo|_jnWO$IYXBtNDLv3bjJWg$IueeL#K2j9U?6ujWiM>NJ-ZKf;8NoP0006dMLDf|E%6}OSoim}_E#MD z3JtEMAOonKpxwLggjwq=*{G@lxbAIi045qS0Q~`Se*w^_0hs^T0Kh9Wn*Z8bXdM4y z9svN6b^wfjF^2d0p()q8U(>?3h+I$3*IF#0$-I>RM=UNHTG zkhr%W+#n{#e;^(XFPQXIH5g@G+^rc!fP6qcCP`dIMnEG!q;yU($A$jLp56uf3ll? zne`9)yh2e#-b4S0RWue)ED7nItVnw1bTi)x!Vn6N@=0W<7YvX62@qHw0(n>w2MIqp zTt*jL5eJB1=2Kfy@#1W6w_p2B$_Yyc$PIkzO~n^oQhP3Pbbz%_jRSe_&tZ@lTaQP3G_i+i2|C8Z}W1$30TkI2;+ zAdv}090O4p>2yYSQ?K}zGkhm}jQ=#bk7a2haKaac##E#kry|2JF0ku5J1soC&I&3j z2o&sT>H_q5ZyW2WY0SVQet|h&rd)oUKO%o%J#qcqve1+}a$aPBEF*2>^z|JEItG>G zcKf;ZsW!OoC5vZ>cVh4D4KpjAg*@SS0a$>i`;`s)9mp@vNKa}R~Pw-2?XBmomgVlWV$0tQEgkVCuu5a7CTzO&Q zLTC6za0)UinM-8)i0g*u&V~oEuDF&_!s3yB&pA<&qlBSBOJpdS-dO2`QGmF=_|DR; zE*VNiaF2PIG-T!VLRipEkMYt?vGvf1O1K>A)=Vmt8+e2MH^AArv6a%`kK}u(m>UX8 z>GY=kt3Hhk3A>X_eD(-yv>F#Bf2n0Su#XmE=NtuH3B!m5srBB07Z8#3hUhL@*fVSi zvZkh3BpA;#czQ)Al#I@{B9&eZup#oS6ELS1+*}l#@T1+A=@q&RvY6pqlM~ zko>OuIVRw5b0P%YhSaSm-Tbm)H@A;}{FE5?Tpr)zR1i{x+y*p;F~K%$C+zI>ul#8O zZ@S5OB&29a*f-4sAvjDE zlI?SaIu`v^ALeEM`X5ClrJim;3#Q(fj1O68ZvpDR~vZQe7IG7 z34yEj2Lwe`fq&=QQhREJ>4dOKe{R!&_|1cq4*w2)@UrY#=c$&WmJvZy9N3vgd@yA{ zp^sz_>cVF*5TdZN8+M)9pSratbNKKrkQ>C7>p3Crz*T8aWH~;?$(>wrmKsPPX-Wu?k___p$OdHB&t89**fC;0Pdz6O=slh?n6B# zBzl>@)?i1Ee?`17*9^>xR9I6-ZHQjv5X^dHQ2+2694@VY#LA`=siJQ2?zLv> zkpQiH3tvb%wH||e(`NY4%kTJ(YmSoVU+Mi=(Pq8yyOjwz*~PQh1FoCAu90~&ngTV7 zAFTSwv))cRiD1Z})U+{dJfeQ(A?$75z>xX;wp`?<88HD4?Qv%V+p8KL+`$2Op><$2 zm1H3cQe6x3^N)j^rC1xPTmp<`2Dk5xd3~R81-PV~iU7MgeWJysF>J3&IGJUZxn9x@Jpw9)$c;c6mfzM}?5@vrv=pD39toiy_JwY9aFV*=|LE?XkRmZ&b)O)9pBg zFvln`8;|H>Xqr=8QTdD+6gq7YWA1N>aTO}!Ser^c^#&PAZ(-`(k0>#WQDQiB4NVeM z8S6D|k_y|K>42@>?xfAvmA}&$^nd+K335O>q!p{MmQYDO7`*FFz(Ci@EDU0AYiMV< zsV-ysNOoC5F)n}B62bvg>`7Jf{UAl6Uz6suf?Wrc5?FU=eZ40-7^Xu})<{cmxaKiOX5+f2!b^!5 zzLK4Nu7BR~( ztc&7HcEd^kzS8BOiJc-RgV6fC+L57k-{9>bV;8Wkk_z26GGw$(S5a%KjnRl+Qihtx zKpw}ViiM3`t$BJAukXO~v~ylU_{@4T8j|St-X<9}2AL%{H#*!sJS*Oo1KReYrKbRM ztiGbAXqp8L^WR#%{-g*xo%#9EVtNV9gMcqtJ$YZ3MU}yWD@;>A++bc(~lkN-Rs-J3j(l z3tg1ijUqFV1E&pNc|eqv{xi(&m#J(T7$!Yi$xP8CvdQx56>#!zdYfv&K#ZmNPAS;B ztRGv=bM0!2v#l?tTD1dtW5VKy71s_^+{KLE#y;)ZKhxOmwnR);a?vVvrbtbaEsKM4|t z*6mCx2^sefbIHmLm{vTuZc6>734GrOePokHRuBB1a3+79?(=nAlO`Yea--RKmd-`~ z&ln#VXQj~79x;;fWG%{UbJsOM#3V+M;uAZXo|)J^61#wVvn=#yY3qVGUSo(cdMx0a zN%$*nb{V>QhYvmd?S{`L5585<t@VOyv zwYtxMB)z}Ys=!uO?pt_r-H1AuXIb@}XTFQ*dX-R5g3D?=(pL#v;73`KRzS^6BDoq9 ziE2AdTyRoyvWRZufl)!a6>-7H>}c}6SRG-f-EME^eCt!;S86!_>}S};_Z!Q8guwW#UM{JM z+1z@=om@d0qW$DjW##~z1X`!2Rg5Rjj&XM%7Ms-0 zhMx*?^|ry!__h5T0XhVogSK>P+D!_i74EDSTi0Bk?A;?lJXS#H&b}I{KYEk-(qiZk}{V&IZ(OO zn9LFimYcIzp0~p4BDktNm?9|}5Uhr^^D_{}G?k(&1@h$PhiAnFpfYHG)dh!j5^io1 z6s=Q4Cc%|xLLzBl44Z~Cr|~J;`TIr{xE7kkubj9$IjVd85oj)Mb-xTW zpB^6FO{S{|sW0 zFX`A1Y55)(A@O`LpoWT7)Jb}q>LAh6hJcnzPMSX+F7&48ulDN5m!-2Ai2O7uT#Hag zKipSH`mF3UqP5nUD`BdehD?sSrt&?qx(0Ur(z@}NsvUl_r zeK9`l*It6^OA*wvxy1|#~)Hy58D51?F_y-y_iDhbf$N^cm>7C5;6g7j^t9b6U->l|aziEEexYSze zg3%u%6b!mP4t)l3;y|X!HY%2v;_gh{B!Qn@C9iK;9K|{ae~ada3mN+H8jo6Q2k5ch z&=7hZf03x}=2`U*!=l7V^`%x?ujWkd;hmuCO|qTr56&-T&U9${%p5JAbANJBC}r8t zOm4lHeNCLDLx!1=s+KP9zDO4&FM6X^a-^$g+DF(PF^xfeIL{$q-kg8X$lk1G%{qSS zd!n>T);iclnzFRB{`gEv&Z!l5>wI8$Pvvb52rs~77zMF=4Cj?&CZ59%_!`(yEaGOM zz4>LDVIS_f^$jbuj)R}av6rLdQkS(EHdy}br@$8vo0oeY)>+4Y_smpoH<6fv3u{d_ z9-^P;<1tAn9=Z)=3ZIpwRevTo%I%f4HB9upx#61+jU z1Hydtqz0ydehMDICd_+jy~9PSp!^GZ5mQG%E8QxHxhy<0HIpjsZsH+ZF_y#5ry)#3 zb*MCtvZwnF70J6f=;9kPu~g)GdVRAv2Y)1>!lbVm+rrI^A0b**&5~hRV?D;lJ+m}k zH*lH_5@bTnZhYTpN$4E9yZd=y9E&;TP48qm*iK`&qCIvx*>~K23@tAv>&cS`dm6Hi zxZAic=gLJ(QGMvBr_ozR;g9TCTYYd5xcJIPJcCtt>n5TXl&a-HFL}3+K#ixmUYU74 zbs<9aaH6lDS*`6jjIBf?$e62|z$ZOLzI}KHPGsu9Cdhd*%pzjaRb=K@q7SRipS}1V z;|pi!t5krycE{)INktpEe~!$b45DTIRHA~#%E-(g`UVEb9Jae${IOgvu@LzvlIV?Y zgq!0sAk9RWis)`zu=V=2ZJ+vKWgoTK-MQ7}x5@ucj;j!lF3(6r*RYfTtKTk!c9}$h zg4QfZC$fX9Kpcb9F+1z1g}#JU$Nm95@VL{3tXQC6&gIu&F6zsk!|}1gv`kcyfJ<88 z*TqF!mYxlZoHR(!p?-miduhTgoZC$-qrtBKc3;BgakK(`d65oV=$5RM25UDL@fLr= zP(X^prsOcQyP%I;ywb{R&O2>|P5cEhypkCO2EUx1>bY;qrR$BSQ5@#6qQdVYt1|N4 z_}^MXehc^A;A@_T{iW1$vR$gkll-N*VLyzQ6nq;Lxa)SQV&_$3RsE{>b6~8_n+h+t zN2aOK(?w9I^=??%D0Xd;XBP@EG;LUma{$kqjt+Zc)j$E_)hzusj$ z;3-hZgt<4Qz9UUK@0Rq#SQdJ=xSM(ZnKRTab*KrCDYp*coN){nAa%tPs4A%$_H+K0 z&H`)DYgCggBio=dnXJ4s4O~sK_TZw^H;2eoJWryo(mz8vUY_ZDu8wvR#qPp17+9jF e0^-i@g3xyG)k%iX#1$TXV<%{@s~atldLbgGhYIT=wH zNK8lo000#7(570Vx0C-~gb2 zhycLlto{~P|N zo=)Z_|EI~u@xRUb+d#U1f9M!!>FNGg_Fq=+f2EwV4(7&xHUE>(%fS5~%Ku;4fAw(F z{Zsz`sm%Yh^gpG4o5~BxP4~au#tVs|v;PYKfFD3yNI=OA@XGs_Uh?wWccOD6nL0cp zID~!(NvHGPXSj1D`=*9#=rXLR@3KXxil*k5vs!(%im-5H!3rp)Mtpe#1iT48fhQT; zxb(em&cmM|N$_zP5R@O>*X!=Lk+&K5T*sY@2`ScSc_5BGf7FnA3E#lo{F^m zK2-qUajb#ADd=r#7Le}!x%YBlFVL%`j6a?G(>LEmzfX|j=no&o?WCe|FYGC`-&Nhu z#vEAF1sxfO>udk+Z0;=k&oi*?O`|K`CNgIUpbP#Jk)8EzQ)^yuFE>sb2>h^IFF(jf zFyR_sk{%d3IcO@rm9?#~qb56N3u7j2j;*u6Tde@thrc3muopEaMgFjfCP znK|Aup5JSpe;8zhfS4XQ5V(n^Csu|==G>{dkh3Jm`9{V3+A#pi`AsPJ5Bd-o2_bVF z3_kwaqly3ZbDR94LNKH(1LlTC8rqr|P@Zp#eHz~ASm(RO<>!zO1p-dQwYbgDaC6FZnIam;xceTyGS!bQbTwfva?= z>R##RFn!1oT zU91NyoT=_EMP&^KD>HFq=poT@(}O)^aV#_@)qj^piQdl?zFnfh>On~P+u2J&3x)Zj zYiwl5X(<_dEUqz$9A+%m3`QNA;4^uX7Z4V76iaiF9M_CTZMO{GIk-}<%+BuE?Jcr6 zv#j+vVx@R>fjI8^fLQJrP!X+)VWJ1(|LC=CVzM85?g=pMe;Z75_u>OsdOgWSK?s%k zCLy>zJ8TI8Lf}AeIb2V(-y}USxGbqHO47W67Qq5KlG|N&dw;RIH)53OyPZ_;bejxf zb~T*}bHCo>`H>!HK^Dp3nw9FU&Z!9A%?hTG^x|&Ky=%k}b^kbmt;yJPhvm;9U*ZMe zM0)~!i*nojT<#uZDb5bpP3dPpSy@}M2)(@UwUxGIZk5%PiwG-oj4nAOsix#NbRe=k zv6NYt1&ewym)<*@S{fZgA2!H#ev2;PHoVm(Xms z?)?d-+h0Mm0hVxQ1w}{XM3=Uh0%M8N_jRxBmfuhHz&8G6dJx3 z@zZ+g;dnVHP;ZPMuU8fyS|-rzQWP`vg1BvC#=d$xPV~j;7;0bkZNqJ_11R zBgzW()?#0MAV0~+EfccqyL%cyI5E5rqZpeW7giBr1tWzKQZq|yANDEBFY{j)X(`nE zb=>=mZR2_Dk_Q_m4I}XT79W`nCGE{UF1K=%p#RvFxt9;k57Y*@Um99U$Vm>H71<$T z5Z7+en6GcSv9|v-YrbSAM@1%_{0a3C8 z{L*M~udCn2+?*l7UC(dPVZ~M_cJz35SWuP^+Af0CV$N=+pGxk4LSXF#%yeUZ1nh~sz8iE8-;Sv4AwmnZ88WHeVL7)Kw z04r`{^vp_ylTP z@h{*}c|c20ENSJPH#>wLwjYnCt^q7kp!W4b`27eW7C>^B8v$X$iT;$#?dOlN6lwM^NwH^Xzu8L)5W4}`4yCq=GM1PEiG zjhJ1}m#g6|Q@r7A*Ii&Kun`#aK$hkU_^Y4whKpGcJ-|wHaT?F{q0?}+_H?BJ?8dzl zD7zI3Qw$dhmr_qH0a!~Ka_YW|o9|z%KZjs@JPIF5dKL@BGkh2Ey1nt;xhG@VMC1aN zQHnoH5271_N-AXH4XK<~$IZO#vlzpdisI6a2nS6QA0U}8(A(!~iUfR~i)t>ty zy}XZ|KHo}X^`>qaLdbWzRTkq~cYUGwygyN`e0u%8tF3X{ zG`Gthmhu)9CqRLpsSS_@-k3yJiNH3Hqwrw&VAr0!O4r`$Vd;Q>Bh?i-QQU%sen&3Y z@3#7cF3PgwASktzv9UF>{c;sMytrT4ANi;q4ZZOSDkqZ~shB_!@vSLeif0wmoDuZK zQ}!e2GfN(o4kH_u>KC1*9d&Ni3Do`E!zCso<_gk_Y&E>vh_<|)Q-s^cd-+CUj~BGs zP@<+Vv0WcMkVH)wqS_hXfrDs4SYi_@G2|Bm0^;y4|AVfz)`s*4dy}XQ8C?isn;PYQ z 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 IM6N<$g4E~r82|tP literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset/Icon-Color-Green-Dark-180x180.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-green-medium.imageset/Icon-Color-Green-Dark-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..46f99ade9c9c5b8cf9d794f1886c9a1c6233992a GIT binary patch literal 26379 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 ON{Y&fRQ=TR|9=2;ay?rB literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconPurple60x60@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/AppIconPurple60x60@2x.png similarity index 100% rename from DuckDuckGo/AppIconPurple60x60@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/AppIconPurple60x60@2x.png diff --git a/DuckDuckGo/AppIconPurple60x60@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/AppIconPurple60x60@3x.png similarity index 100% rename from DuckDuckGo/AppIconPurple60x60@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/AppIconPurple60x60@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Contents.json new file mode 100644 index 0000000000..c9ab25ff10 --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconPurple60x60@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Purple-Dark-120x120.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconPurple60x60@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Purple-Dark-180x180.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Icon-Color-Purple-Dark-120x120.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Icon-Color-Purple-Dark-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..1c131df20cc059959834213271b4a649c4574546 GIT binary patch literal 16921 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 IM6N<$f(tBP1poj5 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Icon-Color-Purple-Dark-180x180.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-medium.imageset/Icon-Color-Purple-Dark-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..5ca22cf901124d1d096df7dc93ed57eb978cff1b GIT binary patch literal 26096 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconPurple29x29@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/AppIconPurple29x29@2x.png similarity index 100% rename from DuckDuckGo/AppIconPurple29x29@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/AppIconPurple29x29@2x.png diff --git a/DuckDuckGo/AppIconPurple29x29@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/AppIconPurple29x29@3x.png similarity index 100% rename from DuckDuckGo/AppIconPurple29x29@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/AppIconPurple29x29@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Contents.json new file mode 100644 index 0000000000..653913f90a --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconPurple29x29@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Purple-Dark-58x58.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconPurple29x29@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Color-Purple-Dark-87x87.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Icon-Color-Purple-Dark-58x58.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-purple-small.imageset/Icon-Color-Purple-Dark-58x58.png new file mode 100644 index 0000000000000000000000000000000000000000..4225bab8f7a5076d549b739b23990e8d94e6ed5a GIT binary patch literal 6635 zcmY*;Wmp{B673KqI0SbcB-r4tK?ipU5(W)!gIf|D2A810U4jG;5L|);9o<fWal? zk#oQ;608syl0RUwr%KygNNUZ;2o&f+6 zb^w%rF|VKeUsHM-Pu2f=GR?$+>nDfds$}E=0ALaR9Y}!8 zY_cadBRgF~sG*vwsHKY&7sSfN!kWv+$@Om)K-@?4DRi=iLg;*)9GyKxeIywEL5M!Z zf72iax_=;02MGp4HBCBM7k6tqK`w4CZU#wAIyyRWcPkrFZ8?R1%b#Wv3~!-OS5Xki z+uNJVn~%%I-4?_nA|e9f<^}Qcay}tAJ$#*^5Fbuw561tH{9hh9YY$6zJ6EWki!;o=7Um;0$y{BKrN!`;sMN%=3o zB#-z%$p0_*uZ}qAulWD7nE!P8Pxh%*NlbCjf45B%liY0MIRHSK1(uW1eT%wnjOCN9 zml3p^lrd_Rr26ZlpjxuobdjAOQC_a{ihSL zwOg*zw9E&}pEtojj)HmO(sW=Kq?tQ-@nw;Ta^eF9KxfIZYv7ySEEf{?H(oKfa)=Ba z)#3ZLhi(Faz4wN!-fJ7KcbW&I>VzFCZ&c9^Y;}VrZKXZ&$j`W5e z)D5u@Nw>u?SYly^{+Qh9?Os{&sm@1!d$g@5hM5qtc&Ey^e@~QzY+FwlnUJqZo~pPuMQg5*S^)KfAyZM4L1xj5fD7pm_2;OurJ^1Hs6x=wHUW* zZ53=TadU@*$^%sdrpoSzCnwwsjdA+6Jh7tKDFUml5tYr92e(&wCDzy zc(6gHxw$s*6`|an*)C`o31x+MavqNs`76j-0yDJUMs)E-uTZPCJYrq8JXVqxIPd6I zxLWKiEw%lq-NpAh77qd%S*1IE&agX;JfLkLehUwcC!r$mQwVX%zrD;HVQqDtS z_jC>JT-iINvST@yZD%uOQAZZ^ryZxobzf)a)2)EnMGpG31xpjNS%AT@DdDXCx~p+w zqUB(?DQC-0gRmIxFf{L<)%G!AU$4;*oHe;V`oF&{_$eV*5Q1915PzCx=J>~Hc zgRo-tOV2h9e^=xs{hyUI06^XZw$BY>4127H6^Z};%kMkB5{3EZ?Ui;TCYY!u)uyy0c zy7?TkPLp#Va5HMSnKd|N?d<3uZHB3Yt2=x);bNL1TuVvxJU$^b&9rcfv>u807Z{4a^e9#-2`qR6tIBM=k2z1rSBBbdeS3d>uQ#X;M|}gS3Idhr^e($^^;$GrLA^vn^M%VZKveDbc&#iIIX))c0ECW z%>9mma)mt0e|lNmzBkWl)?5Bi5umvXsK`ysEln*$w;yP*GZNA^Wg2z~xTlas%zC

5vLJCAUev*s6uYBY}X4a9kjH~yQ52+8P`(Z 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 X6Zo;Ln=+Zd$MPgVvLcm2`rrQ#x5?j3 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconRed60x60@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/AppIconRed60x60@2x.png similarity index 100% rename from DuckDuckGo/AppIconRed60x60@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/AppIconRed60x60@2x.png diff --git a/DuckDuckGo/AppIconRed60x60@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/AppIconRed60x60@3x.png similarity index 100% rename from DuckDuckGo/AppIconRed60x60@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/AppIconRed60x60@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Contents.json new file mode 100644 index 0000000000..693e00868b --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconRed60x60@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Dark-120x120.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconRed60x60@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Dark-180x180.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Icon-Dark-120x120.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-medium.imageset/Icon-Dark-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..b69232790855173ffdda261a37ccb9ddaa24b0fe GIT binary patch literal 11861 zcmZvC1ymi)vM%ltWaAdx3GNUGB)Ge~yIUY^;3v4dyGwA_0NJ>^!^RypE|;8p-ns9+ zb$eD%Ro8q~)iSH6dRB!gDSSgmAwq$Ifm`8vwGP({ndgJ@)CGw?akecDZK3M99#vwgem`p5P0YR zirFYB{snQf6{ggZSEBgh=weR6!}^K!6Qu|W1qFqWiE_g99*gX+sOa1BVq1p>SFEWX6@)e z@z<`giKDxlFeT+*NB=4R-A^}bi~sTD;QH@jy$_J>?-Mq5)=zBzvHh+p^j9jN=wfaD z?)k5M5q6<}A^#uQzx@cY{dN9-b>_cE`Y-AGP(@IL*#0wZA}E9gTZm9l%<$3@VrpK{ zr&-9EhU!WC=K*Cj>SfH-%pZx7k!2|hwIz^wNOQH(!^z|6$?+|4m+kFzNGvlCm1j&> za^}f&PqWirk*a2@sy@S@hzHq8!}X_sSc0)AqfE*=k*<1se0y{3>V8`H_HKN8OJbBW z$=ZEBzd94XTXj7X_WWLxN&Js7GMcQB7EC`jL2^$m+&?s*m;?WRkyEA=g?r{~!GaB( zSgrt(P8-D)T$$SN^X*BCOAIl5!5_4AtYWb_*>ENxe4nrT^_8+$6nceIzi$S9cApT>=$jEccNTOB7GBO7`guH;9_ z54s=jMu3Cs?Q-^ppwOQ0n;x}TdYIL)$9Wt75X0Uu<^M?hKAH+K74JpT?Bt3v+A$zv zxS`zM4?Ksr3@iZ_BXz*SaA(?Y5^vUTqFjU&_A#v7*=WG? z(M#Mr(i3K+NYP8@n>IJ2=W9`Ib&y7+qF9^s2fX=xvw*%yJz z0=gU10X9L2ViJ0o)b1ea)&u2{%*&yUD0n89J9oEWqvEa9SPDiQ+bz1E(_p)r`Yd9z z5t#v;h;ahKJ*Vr!szfC2VcAqr+Ob2WzpgOQMV|j*+MCcTy?KMg?Gb~}F3wRS>Zv?83tdkP3InmCCYg4R8dMi_H9g(*6R3adC97zf9q{{U(gn<;-kj~JL0?AqQSn( z*|PzJL8j!NUzgMx0bt$>LhvFK+X~}aX9-vnSi~^XKnlrBqUH~m8{5c=i026CYP_~B z<=2GDT|2TMwNWONI};~FdMiZxe^$fal7n*#={JI$i&_Mn^mKJs4qG^T7&eiOgjngW z$~{4ep1u~=2rEU*m&6l&mjNhhS#aeAM~q5qY#I+OFFfnLd#+Lk+LBIeh>iZZR)f|s zUZepXOu>eW^8}!P{%a@!i z)m!$?SLxyokS|}LS2h@rcI4BW zQhVZYilzp}mLS#m?`8&V4tCe?b_|4rFD_7?v{t4LDy7ssp~zk{Q7fj}gCj=mpsR}jL|p15=B35o$BSCxy|w4=Ed`&)NZ?hf z)4+u;oeal}TGQz+6AZX0{;gBf)7U2~&1`&L7e=2IF%CM#L~<~_9Aq^3VN_eTLtv&Z zGB8>=mX3_qn7?X@AW+HiJCj~!#3$_OaMaPL+5JK&u$v;7mFcreR>cjVj|o7&F{gBY zEJy$}P6q5fRJ9Q0xc%7J2}7OW5Mugd`#KXH9bNBnw%TfOzTPRo;F6S-)Cd3oR5{W{ zpQK#-Tby@_E$X#3--{gV?p$1AJkbH}ABz^v3%fL7iYjdEIZpEAGpRK*{YzV`Hu%{n ztTE2n)Rew{N<9!wa$esz^iphb_TUOq#z3FgsO~q1QEdEXn~3A1_`#VYq7Cj2|CdL_ zu7|x0L1JR!p!s=?G^>qvFl|p|C#lRGP`b8lRGN09jXM1BiA|qMP50|#qI?F= zT6e(P>t;_NY|}cmEbql|j0rb}ja{}QOpoX;un5i2Q*W%=9@(5DKHr{zJ;Lgx41GjSvFf;)mUUG+iP6HR^DQ4f9OJq!{iZ~gW?Mjo^U9v|u}9RbFQkdqs|#yu z9R}rh45^YI_io=c*2w(!x-2kKj<5N zPp8dMUBgxgE2;AMTm@tl^aaQo)DDUlf@Z>LE+*QW3$N`xX2k-Jval^*27~7674Z?a z$-)eq3E_OjhjJ?A@S*$khsOO6m%W~jDr&OVCMPe%B~+tnX{9CU$j}!n*6l7Vu_nF< z(5j}g(3R{otI{W|so;E=Fd@`k72H#4;r-a6`2!}((IUP319JJ0etB0a7r5(cm`Js>MKBYx@3l>J(dk4{^CM|iqwPXh#M0&2PY0ZEf?CpOtD7UMd<}ZsAiZzvY=;5@ zD30-3ysV)SC6pQXF}s1N6u}V?@t`5s~CE} zn^sh^=QfY(yrpy31$}Q%R&8rKc|z@nHssPcB#Eh1oB(b@QG0tl%?>*}&7Ot{#KPtC zS^PU{P4wSNLp;~APrBvw148X~lJ(DqWV2mUt$53;1^$3h${xp_GTyG(s%x@1ew`@{ zH%a5K=XoEFnuSzU>DynT$Q8TN-vP2AZH>gV=MTIN!os3w+!`!8Pk(YERR}mMkT+6( zMs$1^#JXOt_c&qSup2J&)F_(Ca|w9eL_M2$+v4Z-^vP=9eO6s-`PJyKkR5b3-CD0_ zFP}tJRp0PEg*KrC{ooUzzvk%=I)2+saVB+0$#fYP`hn71^%|nSuP(P=!8I#`+Fqb0O}2xUKB7Pj`EN{DIlv zI{L@5+&Q^}yMPNTr?H`PB#k!@s;99~y6Hs+QU360%qG*FO+%T?59HH0^as9aTmEIT zl5V~OgNLQs$<>>Iku3AaHN^y-0k&0+y#Bh~02#}`J5J5Y3*jKuJkJ;+?jtwciiP$U#FbUHvzDbSQOmZ9>f84KgDgYcrRFq-JorGqa}~)hVT*R#tqmYr3m0^f zK5CXvBO7Q|(acM28we6XLmyyEYV4fN*~DKg4$@@Zs+;dDj3Fkh-*-HS#Q*7gzQ@uI z{35@VT;bL(1AwmwT`&>DJHrkWQwxZL}SsYsE_W@P(#kU&? z{=bH8NO1K40$=WATkAg1jv(g8GyA2PDG-6Wn6r|SQpLw4^nwE@tq^a0FIL3bkV8se zp|4N42hZl{$Bz{wT<-ahS8y4+KjY0ZQK>W)g7%6Z_`3+aqdxw_q6>?u3Z2-3m+vr47R4wF}bmLrj+>wnVb(u)ly3_Z?wr>ECFtY)!Z*qzkl2 zfiY&DGKE}ZG=D-3B9`min{^+1T+gBd^!Ld8{h~}GZ)IYLzBT)Om(=1XK5A~Ccpl@p zJNCV8iP008`+hTc*OD|*GcuVlFsZeNVENT;I7!=Zz|#j0G(K7fnk7o?`a=1MG&s-S zU)BOo%!;-QulVxrIJp(M)cr%_>t zDfE%ml7Ra#_a0CsjGq>dZvPR(;Y; z1eV4sg#y2KNyEcn;5(oC&V1KCM`(KB3xzJONU+CdCuOPr%4UCKKmGzemCe^t zRW-wQ(PvVhr)vI`Khe{6{?z&HrhsnsrQ0W}(WQl{oNVa}F}q45YKf0!C1Y|TX2?Af22U)U`ZCS9$wMxoH^p>N>U&$1n zO&yyPfZS9mL#(83VP+%=j&_Qd}SNnST_fxSx>i(*WW zHoax@*w67zUuo_J$*1|{XEDkIPh_8?7XPbrPjUUm;BGDS++Fm$U5P8*RB1qpYrxaX^(uLmAd8Ic<3(@0zZpxR z89J<`(~l|CS%&NeyC1oefa}@ty6W;Q7&@>@eTvP3^Z^i`O=zYlA|PC6oUWh2&vid~ zwp~*=my%v)_y|)j8C_XCVJMMx>-8Y9v6y49!96*cMLE|G6z}~0j*C3qU+!dhoGj+C ze_P4v631=}W~*ht*SA!3?rwjgau^uqWgn?>xJ|=Z%^4M5QP)(Li0U!hsfS#^9>)5V zSTcql>kFZdB;s*yi6J7u=_5QGZ5qGvOYoTC@2N&4+wc%iSOukw3nsDY7=)mBU$Wer zY9{gbns0um_V)CUqdA48Vbt_XW0r3U$C2Xs_YxP9MdqsKM%Ao4&{$0;33>gZ*_ORB z$^R~Jo139rduudNDD>U3T-V?1>@?FSEw&#a@dKk;R4Pa23@TkXltp8~%?A5I7M zlq;E)W^1_%k|B?!hzaMiTf$ingkj;isN9T-64#T1q+u{+Hs~jQj}5uzR@YgCVM~K- zpmedo14|ZYp3$;D7`IYJyG42j(e2^MHmOLsWOu6Ee86dg3?g+K+2haiZ7(j?vpq zEIHgrZn)a)Oa7(}L0L&eOgJogG{7XpW!g@1U_QLv70qe0f}|TcgLY~T2;GwGRc?#j zWLFAw%Ynk|!Hgs3-jz_IzYgMjtm9&%#^hlgF&H(A+uC&En>pH)IV3%ObCFaXR#-(W zym)!`h)bcmKjW(EtY|R8X??rEM6%@;2XLP~f{Xiby!g@(wxhHbDN|EumcJ$v;(VBN zwdDk?%bm0NA%I_@V4_7xS_alN$74VmH}F23)7`1~2v2X^=8znhpDMYf6h7QE6S_f= zj)O6+^kg-N{@&FCCzvd^+2Nj#^h(mr1Is59SsKD~NH>c`7C35Mf7QD`p)o(bGMDjfnI@J3L998le!KQ#oIc-iWAkY9;GNGj^ z4jNBQRpdG5ZNAWZp@}&@(X;W4yx`?Js|wecXSfnO_6Fy#mRIBzwq~4vm&T44HutK) zW&A2os{@h;;vTAlV)Weo7}QG}SVA&wk+Xa60#xy<4Z@EXFaETRXk5_2BUI`oR5=%Y zbp#v^=Y^jj6fyEikFHF@71dSmQ(q0N&sAvpiduLRqpVBN3_2Ys9oUmZbJ7ZT?GIPN ztnjCgzaW4OLR>az^GB$e)WTe;tkCV8?tjhl(j^uZ@)##jqEkc5_ffB7@C>4!QCN5} zmFvom&Qw!EtZc>^NB>dWTL6`fXlPj~-F(iiuxlUgGEApo;xm4N5c&l&tR>4!I|nn! zJPW%W#Fn`CA=8m;$|MJKg|ZzNevQ1)jFTzE{xuUWj>&=w01#&=P$$L?pr+d~bq&k` z1NKjBNHehHMb-fo$}Z@)1qhOwSUK*5NPrjAl_%uxF^gS|+NrE&3r_o9Ui73*-;+WX zxjLRt5D`jn`upxdYs=<)2;AOwQTK3EiU%GlPu@t(`QLebw8&xQC~gxv6TLq+eA8Jl zrKbfLWgD8}b^g>N#66*UDv6bv>NSuy7DmaIDHKq`v{NrwozFLrGW?C9x{ziA)OuUr zge)bU^^`_djDp`+WAfxd%C`!IyI8(y@Fz=#Otw{0;pWe_$dn)4-{?|tLn@QpeY9kZ zF1H5;9`IAFQ7Ui_O%E9pQ|ursFB(&cz{pt-H^Td-9j<2zJcZ!l za$&;*xTJ4u6UI|2PFh)I>IpNI04>S-l6Q}l;ti67d!!wPOdDpliKj|KZpN3LZSUV0 z9d%QQvA&snCu!OOUWKnQWT$Bs`4C!^^{D)zdRo@a$tTY!)0ony5W;ov2)F;P@eXCuM{+q zuFFx4Y4Azn`JM$$2hj`}_B0&xX5A-U+l;;WBm=ri4~`NtE3$~Al!(eDD0?-cO&C>6 z;43EHFy(;DdNbbMO{BI!2xqyQ2b1ZPp)_cJxo0yZI5HZ}ygDfKivWlVd|!|!Q*7Ym zbMU+VH@b3*S!?2qV5NFh!3TB<9L7`>RUDcHeg9P>kjuDtNt2CzpFph-)_%4N8Gz?0BUZk<5AuJXguE+KspI#*X<^<{0 z;it0pDUo;6G;5&TzzSB6+it*>&>k3s03q9n)oW;ztNfPdbeGEqRX5v$<>lq8VRYH_ zy@%JBFHAZk1iIT?bwP~~+GH7e-4ZX!y?+=Ow0m^w;%TreNRtIH^GL;@?8MOUEd{?Z?^fJ}A_m068{4}a4CbI{ z$r`KF;)|ROZ0_Wy*>`}y$je7f#JCvl5o^m=Mz~`s2KXvfwFShw*wfi^oI8UtIcT1_ zWV&K$`}_uK!h}Z%$3w18q%77-PyBco_BhGxitfro|Df^Ixh;on-|c9gpHYm4)VKj0 zSab+vzf7~pj=3mOu1T{d5$_8yT0K7y9Wc|q&a2sQ*K{X#BHDAjA1Y{fcqx}sAf#0; zat$b|K53i#J+@-DS?B$17dxLKwfx>^gw3%2x;T{k;#}$K>%pio2=|X%3fj8bm#_9F zk5zUSlNilc4~QqWXMCK zj4I6*GkP?@RtQs7ceTK`iM%?-@h|MAN*O#_;nufNsFe{#gG%PhiHY1wQYcA_5H$*9 zsfRk;E$5)4^dUp=pnC3VlMhjUR9PCam#ji(bK$k2GG3`?d4gOI`MQ|EYOn@9w2=VP zmzU>s;G;C2sKz;<1IhuOrF(P^ockGt>;tn-L#ffmer|q+TOC}u!6NZ+-cbw+Rn@GV z$-oWGYunaWv?I}v90mwyTG=j*nNQ~Rvw8FY6fS6{i;Qn!-Y0R!h@IN0R3hJM#^W&R z$GX$yiii`;7b5(g1iH>SLQoflyjh3>MpO{M87I{5f43;BMqX(Y_Z+Q=iYFYI6Jh z^ljIY`?3CTRl?fRc{Rnf6)2QTv2pDT!54#nJj&dZoXpT#h1Nyn5zunr3w;_G%iu+9 z_k5~h2pLvpfJH3W@`W?IpR_KdI2A`OVut)?-JG#58S$vxwdpte044Ig7*R3UiGrId z*Ih!1gsGKnUN2=_Eb(1Q)rgI8WCG^qj}N;HgeCc0WgL88n-mj$G+-BX`VFOc(^ohq z?A*u$0Msl^BsYHcyWAF2wvofcOsZRN|D-IIaM&s%`<$DSv748X12d-P`4Tz3lbp&0 zYvaCq&7!k0(kIvbk#o$>=M$hqPDn+;nwY*Y>)XUDr%%-t3kHHBNSbgf02>!=*)s9> z`41@CN_@=a(8)+Ft7E8TRC3Pmcekf25Ed&)7ZqtJ%iB5j^W73Bp6Nfz)#MzJqOCzi zX7{z1?$G|QPf(*tj1hlCyw%dh5K*EK{hsHqPB{IT!md{o_mW3`q*>$oWegg3aiNyo z3#MLS!pZd#Z7AR2I_|W69VFImo_B#{RbS zEAm3t0w!S#r9e!N**1b{jx-h-;9PuT@^#~6GJeysXGE;gEo2{P2h$z^mlSOVu8KG< zjb%F*itu*W_tyaI)H?WmuCvS~5oN=09D-!hhR>xAc_jOyo+!jR-#v!15?pS&$216u z1CPl%Z&Y~lyW@w8tE>3Smbo46XPBrLY6R6vI++2MBZT>~u%O_?WW~DpQEI_@yp5i7 zUq@q60o6(XI)kys9TUepoi}vB15WSE`=dLSHRB5m7<=uUpxL>(5nX|ax4}z2n zUTqA8J%W;n{UX5zq~_#7_7Vvl+c(TGI9BBai%I#!|u?QAPCM=KwA@N!$sTfyR}4H;WcthBCUb28YC$J59{Fu(Uh>}l^qs_3*T}C^2RBk z-q$IJ{YhB3+-k6%Sys9t>a+Y+Ulie`GHo1{Hz~L6t~~u~Y1aEJkI$WQCcHD&FmYKOMDSg1xTY8x)+Oqk8$b_1#aZkmZJVjRE**C-X7I&VNiX* zU`(@+>X@N2Rsg@;wPR1ldstY#TAPwT*^GJWHbRu+6ncfI=WY=!7^h2GGB59fb4=Uj z%)O(}(*}V>uQ3A)Px^13ywxB1<~%(&bvuz)ylgfIhh(+ai-F_)@;r2#wkJKUsdC0N z%=OPchu->k9-^T__QW!hIm#3|JwG1r6cu%Qk48%%|g$?!B&G=eiCKr)mqS8@o28b76*W76>GFArb2oal8kvc_`yc023y z4PL804}*;JV$0+#QChbRqJOgaT^yAVaS{6NwtcJorn0u)Yxbi8a(bORsFyIu_?$w? z^!=fVIpSLvneiu|TDit1>>?p{4`Lc&beUF?j<%^y{ok@6osFc?`*d#GSznTX`mMPP z$1d&t{`yo$XDI5X{-)Lv>*jXPyXMuWA-!#znS#~(8*4X2Ih)CCo`xEa3f*&8&yLg8 zlk$-@_X7Mj2;#cihQo`$jl)2Lk=*UBT9XpUwzMvsA*E_uZtHo8`_vwTZ+CJfP(8ib z9Ujj%oJe;RS8>RmfZrmZ4%$tgEVQ7_R(Qgqr5!cVg@y_w(|O+{^^dtb+!X{RDF6NZ zFkhCgE*kU%*zQ8N>F*-UgkMJ=-)|-QB5fK$N?wj1u#J=Bg*7m4H8L;%cdiSmfA3c?UD9Q*Wr1gy`yy zY5hc}cwIcKOiL zAVokxET4#;n16}07Au#Z#!FLy5$T2uSn{o=XUblX{MqVysHLrzol$sQU)eh_BenA< zF8nyxN|BKKuK_C8S~Vh$4%l%f@P~<~yk^9+zNVfKtVZO3quuf$h)ayXFh)1!VG2A*U%}6t3w8?aR0OV}MIA*Y-&~Dxfr+(xLY|;jD>)Pb_Ii$o@ue60qSg zHm;j3mCHKb5h53>!EtD_AR%qBoD1aT9?I(xLQx1kW%4QXc3nhLYIcND@y}kbG{*%K zhxI#{;Wx}{@UQutZzaCY?NF#Embtetw;C^@mPVIXkbQGc(d%RXm>6YN$S1tuGVRlv zA5DOu-n)%}&`3Rv*p7ict71Y&UsMrqVlZS}Yz8rlw8+W*n(!U~_*ix2U8eX#{rX(N z^tGi7;L7j2F+oJj^wFKlBHY6Lx0fywV1XeGM#ZwlwwHskW2smB%j{QdE@@)0q}TVW z>bBl`h~C_ThZ09DGc^v#BF{`x2Xx{z0`4{H$z{@#>n(L4cM9Mt(hVnv;hrxQFRx@+ z8g0zUjq3_!1zW>s(m${WUscb-ckJ!q)u8oN7rVgSt&Y10y42K>sMIN>t72oS7)Uk& zwN=r1=h#WY((4_2bp(h%Wy}NlC!zsFtY$Y;Hb=RdJlCJTH80Ew`fbnRC!8sNEJrO3 zi$9OLSJzanHlxs%q9vys^U0Rg;8+U62(!UpwI`U5)QJ>D1!Mjw|MA`>$d^JwX`&E! zyk)}}Exfb?wQmaA6o2IB2;D8)cwNw}%E)LX3#TN?fr3+1j5ce>_7m;N^A?&3)utvI z$8?tTsXJ1Kyh&rOD;z_XSWApxS_RqkB$Z^*wght_V^3IB)S8PCa@O1L2AoEk3u^cy z?Bzj&%A&fo&mW}CfCIG*nsxU-%=%qHrAZgDpL1Y@r?Ch40F&hVTK_!xAG}~!!p~i) zOAiQ7aGrW}0ykp5@bULKYwkAUZQu|P=WN-We$1X@Uz&E;dE>>ih|DU>7$qAeVS>`H zNr+pTs^;FpXoCU%v3M@##%o!BjV@(6t%J>AcK$;y(27EVj!{N(EO|Yk^ zK$8`66X4+{KBq9tqtA`4E7=d{PCc! zYXv(6_skUAVf{t2hAdd!nXP@U2FUPmm8~ZIR5_<+5gQU~tn@7{@%o&p`((a*wcIa@ z5h78py^@x23Y){u*H^ zV@6gui|JSLkL~<<@~NI>kzn+Zp_Xn>D!e`nBWJ6HJ+E0@QP4@}=g8x9 zT!hmHk2Ez*I6_zbqve29W%n0M*3z_I-Jn}J)`=Y&GXFCV@9cs0&+sRZu8VK(qyVs> zNRn+|UcP~{vU#`MVj+vYb*oV>>;-%>n~Y(r=lS~7%{EKM`f{NxR5GuZt>>3be{9CN zmk3mcuDAZ)aQ6|V^o6W9Q{o38?a7JBwW18(FlKNV&xYlNe(Y}*5 zsr`r0awn$}X(c$Un~kXkDnRe<(;nYTQU0%siwSsl;u#~%Y%S;e95{DEmh3W5wZhCchhYZ09`GC<}&IBh+x|MKv12%l|o2M(m;P_{s5xiq-gR-~X`E zS~6g*THPp#1L^NsawLgWsahC}>-3F`J+rmOUbL^I_U9-S)l0IAg?ka|tNihvPjZ21e0d+rP4PyE`H2Vxzmjmp0hHUZKDSZ8V_yY-?{qA+m` z5p-rJvqV2=upBjM0bjM)K&0HA8tqKq02CybzYRWn z!BFk}oT;9q6VrF(hnEv?!2~x8#80go+PrM**Z%~DfWyD47_T6+!3V&_2q0g5U{G)8 zOkN;+F<4W9zli3v4lmx+vifa}?#=B*dGYPgSZ7V>x2?zXCe-?-U*w7hW8~HInk-WTFgb#=swc zuKHrXU7$+JAg8H*2Ndl2>LlEPQK`t7SWA@1O+re3Yk`$`QwlVd>6He3bc%{lN!1Im z$naZF$Px0#4h0r&iUc;~v#7BFUJAOJZ`JZlHG1`#a2OO(68qHIARG)ulNsWO@rXV{ zxFozNXYxn%%I*z5=@q*+P?vBDSpEM?BJKYoa>A9}e1oOXayx-lLL~p2TP-cAAWUvL9SjT%QA$!&`3pAwr@}&i-T5Y=S-t?cv$BLRSoIX%=~pAz zR8z`KP7aLb3x@@R0!Iad{13_31qO}-2K8S!7??CT?*HP-;8g!Z0|5pWW(oG~e`vJ7 z;D3tbSN-Dt9|)NT{(mLrLHsXuV;hVcwVc7g;L-k5!ND@Ju)m~f zS*mKfXv)cQ8{6A57@F7{nKF3TI{b$VjMszv3$-TK*}>EL2%Z%6bW zxrRpet}c8eB>z$LzvaKj>0)X2e>K@T|If6(Cdl}oCydMtOpO04`-_$LKfT-vPL`%$ zn*Sr8pPBc+DE~iw|D%VO@juG{UxWGYnf_Pr*Hrnx^D_SLvhjcaslN*Y1||q5B`T!q z0e+DUm!&6`eFbFL%$A>9<&@M!MST#HT=_-@j;^FA8WfGh{epsLzED!g`mzu|B;-r; zk~77dlea@PMm6gQj-e#Ef`ax#7`6Uyvfx7zPxhAGW9QXth4TkMVY_Sd^l(F-vi0*| zTdhPsyWIaBsPTDM!|gidS}kjen8dEQB&Y@X|2q;E4~-h8qyy7b)~Z`Au}Og%v61)P zB~5jya1I#_|GqsvfMaxUuap34ffoyc^IO}kM7oGV8^bvJ>U9g=y%OYX?8$y{n8X7K zm}yqiC&35 zi5|3_ItN5uM2$WgnFVM-pWL;+2WJQ57DPAdtyy2yV5N&@$t5g~B29%X6b=<6w<_%K zc!myma7`8^KF8`m`{~!G*Xh@m*L0d-1aQMruT-*m`jFkQ0`QC>8t$a28)%5!S~vYU zNZx{w>h=*)0f(Y9j*cVFuyH|9Pr|5wO?nX(L%8XAn|){~aWuM0GxP7nAuhB%m^)zo z&^}YWwA!wn$$fx7f#6Gq6wZcr7l5vdeR{ylo9Z1_k{CA z_DfnxU=a+D&pwY;#ybCWvG0UEQimU&K3CXrSCAzDs2vY&oRs2xE%RjFD0dk_xkjN; zc7jJV;WPsEZ$zZpa27g!k%h=vcktQ0kFyU;;`aM*h;|r$!+gI3ZCG8BhTvYM4*y4u zxPv6TG0GY7L*0>^$6bS&Elgo72p)e<<+XfiB{4iFTRMn?QMOx=+5jJyqF#tP7h)V@5GYLObd%R9E$@+|~*0Z=qrUbM#8H@nvs9=w&wsB#QV(kxIpu$c&= zcP8%e+4H~ad1;n?o=T%}rMe+M2zpXv!=P&AsI9JuMZmN!q$TL;18xX~ z?RM@G#mGf1@ExD4wLLw+zqU}CPumZdi5QUb`mc|5S7mp#R$bk!M+r5Yyu{x8K$O{G z+3|znDRZP%%TpxESMp^g3@`7L4t!OIbJmUUqn!OI1q^x7y|=KR!aQJA@~jVJCXm56qL82|jAPfD}9R_IUU%ME`7#^VvZq zz0($15lKiFd1-tT5|qzh9f%xOR+kY4X4{=;b=2R7+vXJ(rgdGh6 zvlum&LrqKZwvmJviLpx2;yEC?&{Lul*rlzE4ZRo4igBeV2?4?puWl=jTzC*Tc`6g% zN6%ox8GFR(MeE&ugr4173@qF^0ZHqyKP{MG-o-#IJsYF2`rl^>WJr$1G*2T4Ozv48BFk*qN@v=?a$%d0Cuej zv|)%yO@@KLB%>y`Vo;>EsBco5wk*mzi$^B`>e>rN+ketE|)95cAh8RDb}M7hIO;BF#2j&9?=|+f ziz{hKwSQO7j4??^9FV4U5h;?n0-$-}ON`SF8!v%Lr--p&?W6C}{*I@s{UtrSenum& zYrXdau>K%q93%Je9@02j>9*ynxW2nstE9>)9d)L_y_k^SN)(nA`%uy^#1)rtm&mf` z51(0VNkKqfoH?HFoEvmk0X1+3I2J;A15-z}t#AR8!TQG-xaK0ckeHo#*ri{9W)*M% zatF(FK2ePkz9S;@qqR}BuqG|5AQJ^18I8z2$*sW8!o?&Mbp3`LzG~o((CG6dLVKho4TgC7@Q|!_(OiE)m4TmbvtIJ%9!C-YlrcR=AIcaxitf?qBb z?F@5$wA>*J#?2tv=CDlm*H!LAQx;^lK+-map9)vXl<1tH3jr!S>Re||n{>^ykYnDu za^;7gyF*>yo^0ZthbZkhaR5IwA-r{=0)|b|@QN9`9fg0D{7O?KZv4=xXmx9=rxv8<<$`fX*;6fx2evfWm+6X zhcEbvyyu%w!BX?*6ZeD7hruR@%7D^RWa-y8oRb%^&-}AIawdE zZCQKs16XldLD8?32cwnqOfrRk*QviU?7mZMk(Qpn-AxM!*zOO-06HGltS7x6FDIKC z8(|x7$6Y0u81Cn}l1ml`KJfi~Rps!G0}12^#~e+jUY7<+`e_a0Pk;S7)5KTG#jD^z zNfFvqIW8bVh82Ex8>DM^;|7-}+n#PG41QNWHy3zat*g+e(cf4*i((VdHIM{L{&4F`&K;!nAMoq@H!3?0$HY!Wqh(O8E6>8KDah1=oQ zL~ojaNYRSP&0s15N#!3*2jxD&>>}2d@(9A1^L&Vd6LcPl)r%5t9RQiN!o0%YJoQjN zEmuqewQV`-`L!he$f4gYBZ4@PB7LZa%r@)oW)~5V_@wfkz(u#&^TQuUQ4_Xla~!zQ zdP`tq3VQA>v!)}wg%W73MhOm{G)E=V9+l*d@(DAZHx-o72>tP2a6>kCu}JYEPa*p4kqn2JC~xHnq;SgD)l?3qiAnKMSZDGPbX+fDW{M{k&pbFCd$ZXmaz>LvqjU=c}EkAMQ#Dk?w1ReNnn4kZ8E#SeL|^h(hpobm@{uUh<k z0bx4_NpsXX0HS;^E<%`K{`85Xcy;E}Ig~iKxb8jeU~bN)rlu^}^2>@_D3ubqqFc`4 zxvXXrX;vxEx-`jSKWa*=s~^;qb4V2w7Ax?*nxyakd=gy^w}=NxSGqsHkO?f~{b1=V zbK1)QoH!#dQSzq?SXHcf@?E?zKl|jK9T3SDfp{$sFO?Te_1FM3P`BfWj@MxPOgfX$L^?d@p27?Fw_jxASBq3U0SQgG1R z=|bX<9ylJYv^d{$W3_t zKtfG=7OG|N!r^Eq2^hZLy7~*fc45Kh=nXTIB&fW_S)oRbmx?#BFguFFsMCBNsaB!> zj<;M;mx`(B^ceCD0-R^<(!lZDV1XQOj!2Ln(v{vZUdwE-O73i3$&e7~lqb&QoO4z( z6Lzb3Nkqvs4Ro6*IF;<8cemwzb>WgZT--w7|6Fq`2D!pG`#ho7`-c040II0%8euL2 zn%wc4-=#0@77$f!RuCI!varp>VnP{7Y%~LPRVVIv! ziuPd#K=xTC9p@zm?)7b(L>M41{rW1Z-gz~&>2Ys|+r=903VilHHSwrl>$RYk$)Z8D zEGM@);5=co&TBJXjD;k(l|Xx}p;!Z`VjcFf;dY4sW+~zFB{!Rg8?VAqaZscFg2Z1!y zz=uU1?B;2qX22SzR3g?Z$LR`Ub{4Z5bTrQWQsltE?<5WwA)a3$EN(PJNGG`cX>Cel^aIx_|8Aq(d+sOo z^+adhh%Y5O+ej;S+KTjOAT7?a&tTe&VvSk6;LLqAg7EXZX2_JcGj{7aeE7cI_gWTP z{?*!)8hGp>!L5TnDnaPUidy7W$?4{~Zt;RZ6C}95P<~gh*%OIeTW{cUOag1tYRfK) zg9m3mcvCbPf5dn6cIw=!EOVZC1XVChl@8FUiqm>Nwk$>e#D5waum{e0MF`lYkvL{wbJDGqYO z0HK1=sjKk?iDlf|nW_X-_oC}tLmBoVFJkeF2!~OtxGqI{-=fgINZ&{giV)FyyOLXE zyKaU|uDj~d>-ME{3~yN6iT!9IJy8o_w|RK(>i7F#B>tjMJm!|4%Jm3{5? zvl*d*Ubg16E44`ie;B%!0V;pQ@8kZZ<)uelDIS7Vb^)UB&G2NKq9-+|;APGTfQ%;U1Gna?ThfIBlPvc0%qb-hY(I$KDmS*;9Y&S3b z9Jh@gtDqQLU6IdHSLWGisL zzv^n|VT^gp*K2TKu&A_)BjE~q-3WqDZJy@73|~ku!EbPXeefMt$Y4{>^f&5mKr9u~ z--_)L?J_0HM$pOCX@TXN!i~JevK9FA5-;I_V`I{QpGoB-jO9G{R$X8UqGYZ=@~KHV zU5UOjU)?Pi^4kM#zyqBU8J;=*J}X~deIDlEEpY+t`jY*v zSF=`!y)fjTg$J2I;bj8q1;9`ss%Rz0Y@88HAmGi?N^66 zFXQF9G8L!1Ni9TF>}lkwf;K@@!Oe||b~-nj+(hKbPevw>zJkAgB5ehqXl}C5ZICek zB5W6mYVw3V(Zdd@efNmTAH=!qS7skV4{pEF=f5jDk#aclB+`qOk6h_7*Yv0zs z+lE3w%UPl>Wp?jAv)>JwtTs93*^rn39g@0MbU9jfJpuCHlC~)H8%_ljIMqtX`Ow19ABg+MvUjLw_s>VQK7BMP>xT6IZMk`(j{NYOp$`88k8dMeaCz zk`a`64&#dqJ6M-|^LVOcs*=I&zlX#uweRQ048MYhsuRbic;hKVnHV6kw;5A}BtzMi z`eq(HSLVY$;M2JsdRh$YV}8e+{*!K5Ey%R{LAR2`1aD3~U8^!x0di`C;3)cJX**}q zVuE(5nKS(OP60e-6fS!s%f*p<3(I15KUsIFt)P3X>n{ zZ)2rm!f>-p3f+x#FN;EAiPFG2?BE$ctRS8&G|v!aXP(4?SGlGzYMO1<`)PdfWu`m- zMb5^;$(c@rU0-d|>+EO8h@RtWx^T$P{AJ=RNtg1;&2M$>4v<##w-&9czEzymIeARJ z;uE#McXj9P@sST>iV^?ejp6-}!j>Cp)Mcfl8~yRSPXPVju$sA2V7w48w|++5e%2=> zqAireW2avC*zLm7!TSuymm^T?SVl_yqi;B+m2;|dy2)&96G}p@y+Xd!QQ+fk&~9;j z{hid)M6&D=E-v6uCQ7<|J}=Vm{mUG@s`}ACWRp=4WBFlcMG1pCWR#E6^DRs4twoW@ zI$DsSzN)~D_Pet2OGQm+IaLxX#ka80#%-J=gWs5Zw*yX(6)^fPm?_mzk@@2P`I&@r_J`K8e7UrbZQWj0MHm|@Ia^t*hWC>5 zN!Iz*2JkhiWOy-=L(*T~4?7w+?>Cp4v1KvnBObrTnMvPq`;CHQKr5ZP*JO(CY?~tA8uzH!O3n@|M;Wcuco3*zWrq=n#WAH*n97}>asU1*InQfl)K3% z(+b9SF#pBLL5u5uquq5FXUjnUuj%IA^H?okWSPP{*r#k}@@ zwN~+-0V=Wbzcial+mlc8GPZnTI}01wGtoNe5PEG;;;7hIgKHp$)&H|p-|dj3xEexSxzz^C@5+vQ~% z8D>qVf0@&EQ-X55d~4jtX2|8BhR$XJA|k)sEpMYyoVS}y)a&b`!H5ZG896v)kiPvL zY>C;t>t`_4rrOf+!|cz*`97^i;%1)506nDOI^R|=0~@PSEI4ZbCcA}Pnq3S$@;*E! zy|zjA2Av>K%Fupv`z#&oPZ@6=_>|mFl~aEI$0$2OdM-2UOToo}#bm~ACL>zvk}Q`b zotp;W#wL7@qm24D#-AJ4|BN?4SKP~Wlxwfo${rq_`qnt`SAq2Oyo;|y?pJR~nROhe zX3Ga}L%|uHaGc(7-E4mi%z(azdd?Z@A>f0P80>=9P2%m022sBw`ahKL_)K>AP*KEt zP_@U{(OR>g%rs46;A4&6#*1cB#SJ(u5Hoyd+%|0K`=F#<`YUKRvs5VC4H)%yk0!B4 zgDWSCuPdO=?qYE+hn7{_a(UbOvmNU*ur*b{ne13R<+IoqeV?7L9NM+GlW2xx;x+STw+A7p6cF;7`Tdi*gP{U7Ec;^m;%gCh zt!oV!%dPHNJX4*!Ag^-5gU5K(xA^l1A_?5GXu8Q*xMG9TE(+NO zKUm~;=tlNa%t;Iji#rnZ#$cuHfkX8y)-Cqt?2G!*dCz9<^u!9?_Yt0CN(x15laoR& zozgWhdS(RLz9}P*Zrd3#J|(<>=G&4G6v+BwYm+h5weZIKgy4k+k-Wd-!~$Oa3J4eK z{u4@Qn+fY%mv$|u;Ey9~e0D~1YjqLJix*bT%UyndUWblrOjJ}{32eww_~{lZ1#EAq zt>TKs&e#Q!ql#Q3jy5AY*?A+;!m*y?Gjw>pf5}j2Fwt%8{wlY zck%|!9H}6HA-U*vN0=RKDjW8uoT~nw5j_5*W6)i3(!wM!_{zBNf}V|~4nU39?GB`( zpeoMn?!X2ni{QVcWPoMEx^H*_g!4{fUF4UuT!#=I!+2`k6&Upomuxo%$>>jG1?=j1 z+^6U`jXW0f0=Q_56<8#0Lws9!<0}Rsa(M-IkL-uDdysR22z_kBc;dZp->ftiow~-! zw<73$+HrHT&TNg)u-;TYJI67nVz?Y=7iU+H=rh|E;2Xo~={F z3*gwLa3P&-X6p17b#*p0NJvM2IoCYU5OF6JN^9VoeWjJznYH!pd%|%)JZxw;VRRb5 zN-+O~`&UljNR}gd^}Gd-jUYr+0A?!7}mvX zi*r=d+@oNywy?i53&RCFUKFtWFzYO~n}V+K^29Rzorg3|;SdTnSZK0xT3t8W!8f%3 zt^VQ)q|AoPm<2@9}n@} zB5BfIEsZiM3~+9a4kUU_Q>ac+ak)Fng(b#@3eKbFTnyt^^k$wsCMMDfCRx_tSM-{@ zN0paJXWrnyq)|C8?o1Qi#S{k6Iq5X3Fmc?3O+nqw;NUnjl0;~I6qF%z3m6nhCoAKD zVq1SI>QX1A*flM@W*E^xZPHp+aeURVd;jjXFaxn6oFEF9p$3Y)={%LF6+P9Ieq59a zow9U<=c1u$q>)c>^wU4JIRLBO02d_&Bk!iNP2LZG&>Z|6iJweXEa(80oID^f`!I5K zxj^>n^HN&W@m5Su2EK_4%TJ-btU-mbPx%R*A0?TZgk|(N?B^qVLKpAbT)&6}!%(%Z zMy?_gh>1OLQ212-JWXHzF$d#d9@)C&T*sK{mx17%|-b+Xq1TdhNg z1Dv}A4#T$Qy_8r+13?@#=>c@{)WhH#y0i!m&T>pL9<9FDR@j=*+6t}ACHhz8n!cld z0Wof7zm&Fz&Y+6aV!(PrQdV*qp62(&A&)j~y})h_{q3IrWHnmbnlY*iKz{~KW!#T3r{pM)5G`Cu4O&5byX}%m ziS{c@mAq2jqtmGslJ`B@7Nf-V`t{ZD$~^j!jr$3~%EC|aKi^XxaOm#IeM)C*B!Gx1 zbMX=^9tEMB{;qcOfZ7pvm^fHv^Pq9#{_;~EEeCtw{vtcbs&>5{TzviulQ(o_Y` z-pZa>XiM#}v$JbPNgfID%O*qh4;?QyNS~~Oc@Z2V#1#s;kum&L{oKSsRJ5j!H{Qd%{;3yu77$eZwO=|_8nQf`<0+aQ`BF621|u#wI8Cp~%)f$Vw_{-&l-xO`HvPg1x>*%zxIa zCtol8eU2drdJSWeronIxgNnm9w9Lam#-4#CA}$jAwY)`O!Q$U z+0-*IldzFQ!&II9GF(ye{yyz`a3*FW7_cOYF!!#yaJrdCH2S%SIV_Z~NN`cLcSBJ*p$DuIeIe13qQ;<7(**KjNp>dSD_%) zGHDKLPPN!GUqpwOz>*=GtQA=%?@&6U*!D|=`F2w4Ql@3XbJh{c)$EWZz~kZ1)?@OV zbNK3}Q7=Rtw%)6Mbb0Ca{$pYz)k~e-2Uu0sNka=1(nd^pY!Vp4chukM~G!eUDf2;GEP>mmyjGTssk0Eo?F(35Z9>Vp+B7oHo@zOx2ONO%q>bw z6Ac(zJN6L}%prZ;3z&JTRZpB1?vFJr+wL2LJHg+SWNytv*))lwU!{d35~$$A$GM$+ zOMx`Fi7SJ^VC+O|wmHGgg9KK@o!<12zvd6D%3MZEmHIG0Z@Nkw*0B23eM53zJ8VF7 z8+e3EwnFK`{^=I_El;jT9>9(&_iL$+ckqEZzP95M!hhTd{{_k~u{K#^C;4f%oaeSc z!aenYSP$@Sv&-utux!n^F4++g+8kG3?@$8BNNlFuY>v=3#_^`>)99TJ8T!(!* zpR%C6xJ+0zXVq&750zzxOtudT6-g`DAdVQXKS{{~0fD|-?#U~8g{BUMbQKV0v|SEa4^ z@3C;df_cGvlG-r7^DL|gKIbMYNyqC!i3);q7rn{^@65!PKRNU}JW26S@!+5B?YJpP zB?cz=+cihM^C6{(YXE4v-Dn7Iq-EXMJX&7HS7Zg4GQ>wB?$`&}P~hs{KnU;siYCcd zT=M;Q*@$Yp;iS}AeN{klrSi*?t`HBAc~2-Dd<`VB0BPLtj3875{LI#&U}@qHNm6+V zX;PK^SxeXt63+>~x-VzqU*2MchQXA*uRu?R3y+LPS(yquXGA>00#EMltKu=l+4Afe zbAYyHyqC9X9kgGh#Lik&KBrt`i6J#0?pUzbNw90FsYIXHmhuYrwyM6(jMG_;Hf5<2 zx1>}$uKtljqjhY-fuBrSWUEe>GomCi@u!Q*s9d45gcEPXlZPmdJXNpiwmaB^dtat{ ziIduc;K)mc;$`UNmUt*)NZ+8-xb@E$+@V9KG?FEvk@0J~m0%8QUw%tyx0tB})EbjA zzgEm?X68zBL@#u|MuWK6$%|_YCNrqBn`1B&f{^Yvj!T8$QyHn$*L>5Xla?hh&+qr$ zae$gp#M0*p!CO3y-tnrr(n^5a$YGWn|An)wG0xMPlCvH2QZ^$ym{g}x2=ZaM?j#d^ zWL!XnXJ+vnB23MiVJbqq<~CQNc;oL<#o_)|&n19w5crLV+xp`3MPYByPnH2;tCkmS zU&gVX`lSTH<6sOs`<#V6a21;XB#AWL?|eC^dGJt0VVjS?+5a7=>gZ&KB(j=MZBPi{ z0DS^EXqct${ah*`PKcuf`5q9C<$INDJ~;&D-qpYc5ot%~XuV@0e#?-vMC(zVgt>iR z9bWzk311m~=Hh2S+ACpLTRu7<`m04V&{8uW98(1-v`!W{R$B+b(?v zSS>PT4gb59CycJU0@Q}fyqx+p+OD;x)&-CX?q_KQC6D`@#x*9^t}Gs6EEWWBGYy$0 z3V15`_x6kSo;_%FS;l5*_qQ%wDvT8!5FEr-B?c$8iBnk%zuezl-V8+I%8!{Q8j&C| z^*WMhXQUES-9br?r~R!1{t+%Yj^uKn5i!VdWx35-7aP+`v(`Z=t-7Ob!4{t&g(t7) zn^&+hdMXJxoaXLt=Hf^~Oo`zkK)^l#qBTT^kveck3 z0uACffNu&;u!_7(6eoKm>p?Iuw_*xwp@>y;TxTf5;q|ckIt#|}ufg)SB5t-nF74AS zC{+%N9fs|+ce&MVp0O06z0wlAm@K7ppH2Mgxe6iVVRPs>90a5cXIjWYIr{Hvy>&nG z;t8p8LFD4c@S?4sUgY`r9ak>oH(|R%`CmCpZ?Rn-fpPm4C_mXX>xn8&AQy1Fj8?mp~!QJFF_4rhK;JMiYYO}At2`XR**c?<33c|_cU{PY! zKDR{`NBwiXoZOi4599$Iij**htCv;fFsS@4C4Uv@4+W6b)qi|vCE$rfPJ;f|_Gb;e z-hhU5AkZZ@gq_p~pSC+15c(u#1?CC6*E*?arWCo48&a>%|hx_k8jx*b7*3Wg1jG5{?XPlop!IL*moyJjww-K+1DtX@TigmUoSQ-dzDkwjS(4F$7 zrvYST7*GfOl~cp0ix)aU7rN!qf3)aPC`9|hN0`v?5U=ga!02gf@%VqH?5W0m(-5f% zgReeN79wT*i?sR2ZlOY8rXb7njrg!SR+&!YjcfDh2ovA?^WBXH@ftvdS(z zE%;jLf+!A5U%7x`l?mWz2kXtae1B4`@K?OTO_2} zSmsw$8*X1H)ppK~L-+@j;1&%kL$H_`61}cjf%BA|LJGP!m4J4LQM&zRleLE3V!0aq z`Nj30Q}Q(-k_P!NfBft`)fEDqd^z<1h&)Tdm?`Y>ldhg0Fw?GGA6n$D>IFOIl z(B%U|B6h5hFmv$XM^$}@h`bLc4P_CiJ|IE6A+EVpI@9!oZdm~C>Yyk(?f;D3Rs+dt z440XNqj@0-e*UoXAn~Z{yQ|fz8%CpL;MbNHc;;;=sQH6JG&FvP>R&fGI2)!S0H=zv zndlflzj8@a%aZ-t=e8rAx9#{5_<)-&`g}&X0u#3W70Tc0-ds9bjO*vs-zEkw9*BeIx4uQ6E&iKwToc840^qTAMAQP{ zpC<6mKE#&6QUG~H*aOP#E==4KD;b9)gs#HSwa8B3OmZ_}0bF`{-@)~lkR?HwO0$36 z@AnswL~W`uxi{B6E?sM3EH{l(+m*z8J<=Tg()~O4+A}W;2uP2pb->d%?Wyt|VQ1`RH3aHdJCj-t&mT=5+@l6DMGKq?0;8JhRz!c8aJ+>-`0)923yLR>Ht++Ulg~ z_)M>yUI>F|cwuW%`R17XcJX6kYg%2nth6WqDP+k4!xwQ2$+{t-SgXGqcI4l@#b%BT ziBR*(XsR4v9L8lF1^vTVB)SD!K760En=Y9(861`oe=d(^&pO#2fZt>HE#B6aQ7yK- zRE`XdRQn7h?On~@kQ(FNI&i#oAI2G@332i+%B(EAp#)M}F`uV?jWT>*DmgO-HNCt6 zce#L%*GwOI2Lbsjj?ce3wdj7IVVNqJmf z*9(~1s6AHNX35S9`ZIav$5IkZcZVarpWAeu8Axe*z`9zVaJw=KXF!hy1nA< z2g+4Gl8nY(?^`uNLZCqUHVl4}WG4DaJ*=Z;_whQ>F%)U37#eYlFoP?RkxcEaGoY~z~{s$JAukJWH*^a1jeQLwyj zHnR!r&rT$c4-GuegLttDqHe&*bZ7klz2+ktfVd$ej&QLRhhNP>^ib(?1%-9fk-cH# zewKA3{_QWY)Nm~h?JxA7?ws8`4_F7S$%Qd|+8nN%o5ZU$gS(@<$EIZkGmQ$rKyT#I zCsyrNAV7n^>vc>(_gbH(yVJ~!&9i!5=s4GZhSN11oVYGHq z{(8oo5vd9j&lQ7l@qV1m!*P^wL~zPg<12%7eIvx~OEz%hetXiPfil`T(Nln_w<`mo z)OzC5alN5pb3D(1#)7xzjQ(Aeb`bUG0 zr*84oCvMa8<3JFcA-&kfH=W!vQQ&yhfNRMjWRuV{QWOoA>t!!dm5IM)-kY%;(ixn6 z5y_U&ndoi%LMNx=$MnG~pJ8QQ^VQaFKflB(kJbe?qhdcCzog2-g@@Do{uU{(%6<=qb>S#O^Oj?T;lHV+9>DXVc|Z-qPMp!+WfqeA|N7SOqP^rj6aIkA zpZ{Z9v2VRhuO~LvNsfSR=0E{h!3`Y2!Y!qivHiCqib?xUACXRPGx^`BkPUodWc{-cz? zD+!_wh*$$f>KEm40vk?EmIw6x8njH3XCSPLMPAwYZJu3?n51G~1M_-9e?20rR+q?R zkgZB$reUP^5ePD?QAq;l>*$1(Qn)!ZZFfqh?jJbEJwEtE&aOXLj`Q*+G zRf#FSUF_uEHr+Jo1~#SVdd%NUM2>H?hw5DtY&vspn^(G{&CTnIxN$yfdqXtPm|LYv z-qk&bsu(9)+wYS~iBVLHX$IHMjHJuR=6nv1cZe7Ot!%$xj&^;Lo#woNetBcJ5(X@C zo{<942BFMA#V@KRzIb?ubK8&*7DaOq$ys&3c$W`1<=NCPyC1JqdSLGvsg5()^VRgfPcv;;xe@?n(VP7K? zyWy%4FV5$MRERh5LdfqYwToW|7dj6e2X+V$lWXdIJbkgz0(Gfv3(jcs-dD!kIG#IvDNa+`nzE$W z+;O3NurWO#38|=*e2coi0%9NOK31#X4HJQqz4Lfcgnt#K3ynm^76-nZ*xuTB1~I94 zt2a8qaLeE?uhg{^Elg2rwfLDd+^w7$1#D9U@B^JzLcD;OqaBNdvk?%hOhc{q(6wB0J+s zBI%PEHnmTctJD})h0{H_<-9XDxp(|3czps^Ui$}v4VeZ%XQ$87w&v8gDpeOBtaf+ zO3XXg**(XveSNlN)7K1y#l7_X8*5Mozi>dHpPrZS=E=f>+C}SMY!Y ze$aapMcj4FQ2!V=e07-PhhQ%Ev&-kCEZ>3T^`>bt z7C9M8%iJ5)q6`SRJvrdK7vBGB%cC#zxzBb;&*Og34m6cqO+3Hzs2W#|w=b?1?t@?dLJGQ?){w!#ew7aHdLExIu<#YyUDdIDidXdhNU5+p;*OoJ1z^0CELz~9agR_ z_vSfnQ%M&bmz3m|OXM;nVGfhq#PD^#&-oY5pYZwh^E~gD6*~;tXF0(~E(C~*rRx_` za*pX)9(%p7JJl!sN5+GQ4yfF=&mjGkq6bN~8kEiTfW!GUevyCDS*PSiC$G$ys|OpoYhWS#IFGF&W>p>sY?!$LF$Q`|Lty8q1@lV$UeP%$|FmJ+T=-sfIzr zyL*%p+k<~W#Om4SLQDcw_d!vkhH;nzYMm3JUqLcZi3~EG-L8(dc!rYNiPCb5f^FYK zv08ArCl2XvO?M@Ty>9~e{>bHh6Mr_!IL~nYnig0;vrT1N-A7-e0O!O$` zI8Im}w?rO|>8$0uUf$mYg_M(UDmCnb)x#bqZ9XvGN7>!PewZCGIB~MI61>?~5C@nW zxj(JF3hUNC1z3>W_DHS*wD#nN7jJN7#VE0xG8z=t=ba*0$+^Pa>*W>aMo(erM%;`n zxp1VdxKk?tTUmkFM!PS`Z}baX@F76=>3YezX(;6e&IzF>8~Ji1QORxNYT1&x_U{VX ziHC1(3_!?E?DG#2r}!jK)~ zX>IaG>WzyAAmlkVO{k^ta%E@-0U^%YD0oyY20HU+R^Jxy#@F5nQ|D*oG#U$+m<~EARBAN+}&Iv!+^tEqeK2e}_bQo4)3T}UT!c0WGtu;Wvlyt5w zNWb@wkkh#F1Tv zyM5rhElMYLR8+Cf+>0bilvv!wyUxfNMXL<3kobE=UR$f=TwWk3A5W~lBc)HULtMB_ z_`LJPk`n{A;E<%Q&pMkSM+H2GP!hmq(^K;*q+Z#yhXIJlG3l8Mb&O4VtX{wZe`iiY z+?8iTP@TgsLw!?32cA)M_1{FyxxF!DJY4(19k9%roJNPSV-t23B{EP`j}u3fv194O zmqZ@6{592Ji~Qh2Y>{jl6LY2nCSJ^$Nfv054zuX^=XrH&z_Q-Lu@5)iD`mi%ftjVYE-YXR$Wxc>7q|%s;0H; zFews3(MMs|sJL7Hx4%4Ny@N<~u9z08MRu3>pvW@K^*Ly5=}@-Te32Q45y3qwxrDOE zDJJ(t>YdEKKJKP*;>((~d8H>tk8v*#2+K{lbK{p3x-dT3FS&rDLvk6c+GrCaChWBh z&u%w%a!|x#PbMjNFZV#V^Q4fyJl!5oE?Pr9x!|xs(v*K6MLl#mN9rrZBlCu_|I(ZJ zk3X&NoDK+c33(Vu22Q<_g&$7Of8+Y8v2dCAtLA}jaFnzS1uh2Na+#s)5IFj#L&;k8 zjC)_qeWJQ{OBG`N@Opm!m8#r|V|q$#8&idXd|*(jODh=YcxB%;;HL39gU9Fnzm1m? zl*Fhh6Rr_bS==#zBJP3;hhO`^vkcFg3L?Ov+)n@167Jm3kP|U^Duil`Seh<*?v z%97#!a~TW=GcvFDkA>>Hy7E4Pbb}B`t-#K4JBS*bz@jH7#^;E)#lSr^2^TH1k`hY^ zpUEv}+x>SW&X8qdReo+&poTPRb`O(RY7EV+O9wx^!xtt3Jm)%v36_#w&nO8X2GzHI z?P5RcThhim=hG?^kEmj4YAGV_dMeakwUkp(q8|SMy>8U7cDA^%uEh;!-#b8CiKO$B zQ3@$(j!z$Gm+Dx^XfB>F56Bmma;ZB9c9LEgm;llD%jQ9hjszhO6kb%=A9PnexO#?C z%z=`o#yfbXzA%ApgN)uNz$=r1lTd$F58{3OlPl9;h8W+5*F$3=-MW=~N|s3D@HC63 zLxZv{qY7vGO*FfJfV)!W;qHOp3mf*5!PM!duyF-m!zDXVn&aEQueelxdf6E>j(^u$ zwRG6&qCpNoY+QRJ);g(nC@dB6?O|NmRLu-QD{ec43DeyS@h4|Qg7(c?Q9FVKRSs(I z*F*J1-}K$R$8y0~T6OLzr+_@(z<58eY%y$6dNEu5o|CHF;Fh6vQ}g3C>cSonbV1+lw?yymTXJOXFk<@~lxfUK5*Tbs)2;4KmBv zW2I++QSSGJQ;MY5IRJM*D$J`C6+iO3@hV!vnYcE&w4^oauPPZt=9);)ORfYV)3N`R gKJzbUL;iJrhgI*%^V%mf{SRDZZ{uWLVdWG5KRz(rf&c&j literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AppIconRed29x29@2x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/AppIconRed29x29@2x.png similarity index 100% rename from DuckDuckGo/AppIconRed29x29@2x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/AppIconRed29x29@2x.png diff --git a/DuckDuckGo/AppIconRed29x29@3x.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/AppIconRed29x29@3x.png similarity index 100% rename from DuckDuckGo/AppIconRed29x29@3x.png rename to DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/AppIconRed29x29@3x.png diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Contents.json b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Contents.json new file mode 100644 index 0000000000..d7874103ce --- /dev/null +++ b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Contents.json @@ -0,0 +1,54 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "AppIconRed29x29@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Dark-58x58.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "AppIconRed29x29@3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "Icon-Dark-87x87.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Icon-Dark-58x58.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Icon-Dark-58x58.png new file mode 100644 index 0000000000000000000000000000000000000000..f1913c92712f0d20a04ad36032dd9aedac656233 GIT binary patch literal 4579 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 literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Icon-Dark-87x87.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-red-small.imageset/Icon-Dark-87x87.png new file mode 100644 index 0000000000000000000000000000000000000000..a0b0f2c2ec44c30323354014d795ada22cb93121 GIT binary patch literal 7619 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 W-A&r5d*tu$4rO_DXuX`ptN#N4O%cTa literal 0 HcmV?d00001 diff --git a/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset/Icon-Color-Yellow-Dark-87x87.png b/DuckDuckGo/AlternateAppIcons.xcassets/UIAssets/AppIcon-yellow-small.imageset/Icon-Color-Yellow-Dark-87x87.png new file mode 100644 index 0000000000000000000000000000000000000000..28e98866d4b517c7b480b49b13e4ba71036f3f94 GIT binary patch literal 10406 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 L25L>J4zd3OwX&ba diff --git a/DuckDuckGo/AppIconBlack76x76@2x.png b/DuckDuckGo/AppIconBlack76x76@2x.png deleted file mode 100644 index 5a442d7d381a6f95711e2b9ad3eb024503d7cc53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6437 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 Msj3UDR<@4(KT|;$-T(jq diff --git a/DuckDuckGo/AppIconBlack83.5x83.5@2x.png b/DuckDuckGo/AppIconBlack83.5x83.5@2x.png deleted file mode 100644 index b6befdfdd69ef11b5d9410be2b8ddee9cd750849..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7657 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 BxFG-l diff --git a/DuckDuckGo/AppIconBlue40x40@3x.png b/DuckDuckGo/AppIconBlue40x40@3x.png deleted file mode 100644 index 39231b53bb04f8bcb492f41c5d2e33f8f099b2df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5300 zcmaKw=Q|sY*T#cbwfC%0dz0F;)D|%+b_r_FQn6|URikRxZf#<(XvN;NsJ(@vYSw7& z@$2^wc%B!Z`@YV(&UL@KU!7P3s3zG1<_7=(fJ|FU&FG&8{09-iKb3tUHTlnoy|v7J z0RR%3|G)uc=Q93V;`kbAssd`pSa<#nKqnPF6#$_AJ;{wNJ^(ItePGS*_MdEB@t}FFYGG1 zF%Cnfj%s0j#Rfnx_0%AINQTFc@nVc=vPsz6_Ox=*oopqZXEKIsfye@DuPbAG z-sW4*l1=>Z{g3V}KchZgvTIwvaUv$ja;wp!sciYU09cAsVUU8&TRfS!v`y_Vs+;pL zP0PL#f-iOO@h(-W1t-E~wD-J-y<>)nK8aw0e!Pm3)gVk9kS#y}kSY>NAclPmRY1D) zI3=k|s~?QpbZ`NHd)~oRv_fd7Lo|v{8R}rk6ml}+b2z<~;$2I1K#VMiQ}IN1M;0GC zvK^5B+?3ICm8!DZErWf%G3U0N|8-ES&W{}u?ADkT?@4pAW-d5n^9rn~TgXgfSD;yo zTImcFtDVf1M*3|c{3#cfyKR05xJhi!jVaZw<_TwR>qjJ|?(_1$i#`-}oT{`|(0U{DRuIT<(aj`mKN z$Sd0KcT~nJ?Tfnnqr5nL`<8hY=#W&VNUMdaHz7UgJNMlo>1nPVOpE$X(c@ABZS6yKf?94Cuq@m&X`ivX?u-5k z%p=FDu|ik4P3@IbidP`Kt3FsL4>6O6ebi4$4huP$7mduiD!C_nX46?O8@<&Hsylb_ zK%?WLn(c&4;FPBxWiKhT>g@_==Moa*JC_H4Q~m6ZeT1jU6|ff~x#5VS8(ulVa>xZM zK^U&=Z%{(|26bTVh&bAoK{`4*V@u1N2`RVa(JWt@A-pGzJA;HYl)Dy^!z09ZyI9kA zx^|h|4B@W&TqzPV;MLQ7ac-3G7gul-cY@JSh(q7rIxg*d?DR1CY#&5e(vDv~9wq<<@{b6uH zP4a3LALusm)G_0@v;Ee|@28si3JC#}{!}(gKVM#0gG0l_!GYU!Mk73(UB*Myv%CZ| zM{p6cjmJn66&nO6g{`K7>B!QH&R^vj#F9x8@8&X;j6dHfDt!ZoR!AaWqdd*Qz1L%AbkG!Dt%Fosnj$3A`2gUN>mqSG-hO=Z<0YA4q1P>6n)?o$ubcfX+~#c z>(9|l@p_&5c8?6lHD_U;sNP~N7~ZVg-<6Fs@W8$_+RUVx#1d$a?sb{Km9A864qpyd z0u_{ylrkbd83Rxj{|=+8T=88OYc%Trb~@k{^vD9f_}^~;gfpkqU@+LGl-fh|Qo#O) zjS%{P8w5NHp7p122omi|@Wt10_80=|2#@fygvHZ|3$J-E@L#k*>L5X|fKl&qr6Be1 zux26evl~DspuVWbV+d@n#cm$WUE9yU6YXl<@gg%?WvV!gLQ_M8M$AnEucGH?^|i}h zVhbNQ^Xwrq;z8@n{@1N8TXvo-E2Md1Z-TRE{hc8|*9K|NWAj!DUEtS@Lt||(->1&G zEw7KhyDYXjD2D;FnayOT7z<|-qTKFWc^106{g3kb7ylfvR8-Vw-yhB&E6H6Q2FhKW zVIXmqR{F@B1U&)aZq*#KFaITiMFre{FYmm30Nfq8IqX-A+35zgLrAvK-`nrMge6p!Po#640lVUe+_DiE+m`+?vb>KH^L~}iiJlQ z$eLun65aK@)BP+k#yh*&z0i}n+i00b@-4=*lz4W@rrpwu?r~|~V6?hH-ke`(!U>ty z`z4N4Go$Gq9e2+-c%OaH-?r^=W@MQ(539bq1^$r7$DemUecQ9?uQNxxB)WrM@z2{K zsdM2DBQ!wH7p)r|48L+%5I&$MU2#E8B<9-n=KNCXb$6rdij_wqRQD%2;-72c11{!| zPwj~ea02#nS~|LW>yO}R`HspU`*rH1_h(d$mWsoUzkAb$eqpU<2V~U#2&)x7^dM^P{S}Y>M;GGGU4EQ`p``vG! zK*BYsMi*y}%}kPfPDbM%2Tve^ij5V6d$wG=S{%a`k`;UszJHCuX)67$`sWV(px0mM z8JQyQ%q;WZ#scp*L9aIXpMiV^!;Sic6n}l1JqSG@cF7!58?N-hBof;Z@T?38nh%yd zjAtC!l{Iz;>9D_LR#%TA&+L!M&X>KjUThX6!_Du8C&a3`DQ4Ih?L!onC*e0rr26>n zL2`u#L7X7RH6Lwn7F|#WD%B29{8pjip+w{PMd$B(8q=@c;bFPYrI+lq>FTOWHrB z&zPz-zeB3^RQlXVhWSxrR}En`f#e2>8My*%R_^0(eXKV)>sIk81jTOqFR4`8oDYv5 zZ)fyDu_^wO-NKB>CdXA1)Y<#$K z(Wa=e$-m3)N3r*JkH~zm!$j|w zQabG_C6^=$1znxkWA1UQe=9&n3m#8fhrP;8bL`b`_2Q`fPLj$A+`~##Wv*>(k6e_3 z=WX|Yn#M)ksxjC&N{_N>1~C=Pg5i0o3(Bd(68V9_k{-X!p(ywOL!Emh;hPy zFcD6ph{JzE|OE94Y^ey*=mgV>iB!br3P+ zou^TZKeU(u{N@eq{`-Sq4zJC#Kcj^nigOd>r746$0pGy$=J8Sxv0MROybvuh1s9&) zGgjgGxhZ9y7BMmE;v!I!;apbq^b97cb)kfL;|4@Sm0*iJE?uPXLGCy4=B**-PZ9}a zp7oqc0w^a>yM;8S%bQ@0eQJD>F{Cr{lw=J_Wmz=w+t6Mp&^~U>9fZP-foAyXGb84~ z-I1E4?WBFno#&mb$ucuZeggm68)R@_3Kh!B3sBBWWMM-a#^j2jrFYK`Sa^V6!t?6U z5V7psiZ|4nm9FT54=Vjo+9A0U#%Kp*nN;})__}lVa09CdegaiO?y*{gb>=srKW02; zxqPL}G0@T#+^vS+#gh1ahUiu(u_fQd zI!fNz;Tn1Z-Zz=dJSpVpw+IfmSXcByRm9WFyc7x1{S_P?%9;Tn&PNbV43nAL5Twlc zE2*`JtiG0g)88s=5|SXYx2~vqC)TX5G%^>`j|*IVs(xqQIRRjmp(eyj`jK%pp>X_& zkn7^&i;-u{L<1!WMTT2R*=wbCqv;&^BK#DS=FTBeoW53DdX~Msde^W_8Wi_qn%3aj zrZzRcPrUQ)<9g4EV!(Onx`UxI?olJnwoM{xpQA>dlk6;6y34?@l_T@QUK^?O8^9B` z8h5w01%LSZM4Gn#Lw|)KR{C=`UAO!I-o-IN#HO0>*{%#-?wOK;l8h zQD}dBPu1pZ6UP{bi=v zu_5(N^7O%VzUE#g?`uv;$RnlR&@0j~^6iRu$)tp?XPXiW7S}9}&^dsAYqm@>R8#^E zLMz>^INE~HE=ckCKMuLhqMxqXILloqtEvD`@N8Y104}P{hoh&D6xrRxoVMVux|bT} zqP&6!_zfyD7D@1#qpM3uIebRm%!H-e>=EN6$|kjK$D-MTJnA7j{lgfb#eXj+x{5Gs zCNDRGDC6%|_|s1f&noMB!&AU)WGBt|{Y1v+?2X^vRvkYe4>uw%n{HYV&h%9EBUJec z?46jbB-5(bv8<9!LWV+=|ELm-Z^euNzVlX>m zoB{iMWf~3&-#^I+DaLKEr+QKq$Cia2*Xvn$Dvl7oy(m{(`z*z!YW%9p{;77}sYbvE zHIwj1uQuOTbzaKt-aaG;ikSF2iSJL712RW+1^J9KWc}U-D;yoF?+OM-j_`m=C%a?| zU&xl&aR^l2(tNN8duBQ-uRHLRcJH|k;#j!_fAAqT2Hhi&z07y~_EYJX$P#&3VB_SW zkQ%YRoM_&URSBrJG8uG+p2=Z!nC**gPSu?rO7;|Zdr`C2@OFxyH5o1|$Q_$$*Sm0> zOxE=VAg;j`3d;L57=oNXx!Kg0_@&3e2d!Oq+FAS+|D--da>%okT(P{Qo8`zuaA|L zdW=6u^aOwqvdq&8TeD;3U8^Fwr{ysy8aH6tY== zbRD%_h`E0dKdr?xDn_IROXjS}1n6oUno6N$D-9?#vu)pUI{ZBrSLLnb0?lzLG_3@v z-ZAU&BrFJVWPM>L>EFk7y&T4%24`f?8^v+IK!t7PW)HY%hE2Ew!^WKxP4?WI^{*JY zsRxWD+y#pj*}fjmknn>@HGMjyWHT`+&eYMZO(j;utB}PBgj8Msf|k_OHRE-LS`K0L zLu-jGfnH$z9GS*spGtN=ojnON=YB}e1H$PLRY>`TiTkPUu(B-*czU6=k zo|%D7zHAkUjoERI($DIcpH2R2Qd}eB^|!xi3e9hBW9ZNF+c$Hj^*RuF6?F4i?Uf%`ME2kKt!M*sgWSk%(D3d8a?;D2hX{ zUQndg%?3rFY9o!dOxz9*hvs@p{?Ah>QfMOy-$R z-sw@9y7gGO^M63JdA60==sdD}@dANfHBFts={+f!w?_Fj$tj(-M6$918VAIUYT&+iU? z5Ba^_-3#t;tH*UI$!=x>>nLk1G&uru$zXWAI+4y z&Y#)ZZ*gsu`m|l1m7%Z(8N-b+Ox^9s>3(x#+2XUN&USJx4MuOVMwE82GQP9`Ecre zquLsqoJmZR0asjGDdc1w(qK@kKa5k0s>)(Cu9R6O+2k10$Y)dr$uOU{?MlWWIX)A~ vwyihQt~15~8D#!16nvYW=Nr}y=XU~t0Sd39>3z5VJsAPo>QJ>BRXFm06CN3m diff --git a/DuckDuckGo/AppIconBlue76x76@2x.png b/DuckDuckGo/AppIconBlue76x76@2x.png deleted file mode 100644 index 83f5db1aa8cd60a7cae891e1ea6b38038b02c632..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6621 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 e{|9g0lg{}P6~qM;`O0w&@A1|mXc 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 Jt-MwEe*j{}y{P~I diff --git a/DuckDuckGo/AppIconGreen83.5x83.5@2x.png b/DuckDuckGo/AppIconGreen83.5x83.5@2x.png deleted file mode 100644 index 02a02bf6583f263c0107140dff1b2a15f3f7bca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7948 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 diff --git a/DuckDuckGo/AppIconPurple40x40@2x.png b/DuckDuckGo/AppIconPurple40x40@2x.png deleted file mode 100644 index 14c2cf430855b27cf452953e9d2a6b77b9ba7206..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3777 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 diff --git a/DuckDuckGo/AppIconPurple40x40@3x.png b/DuckDuckGo/AppIconPurple40x40@3x.png deleted file mode 100644 index 732b889f4473072c612aa30ce6d314f96c8cd8d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5609 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 diff --git a/DuckDuckGo/AppIconPurple76x76@2x.png b/DuckDuckGo/AppIconPurple76x76@2x.png deleted file mode 100644 index ef975cb3994c484d36fbe7e14fb7cce37acdecc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7088 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 diff --git a/DuckDuckGo/AppIconPurple83.5x83.5@2x.png b/DuckDuckGo/AppIconPurple83.5x83.5@2x.png deleted file mode 100644 index c94cfebe4cf336971dabae74b32b4fde787e4ea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8380 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 diff --git a/DuckDuckGo/AppIconSettingsCell.swift b/DuckDuckGo/AppIconSettingsCell.swift index 0afd421d12..5492136a9f 100644 --- a/DuckDuckGo/AppIconSettingsCell.swift +++ b/DuckDuckGo/AppIconSettingsCell.swift @@ -26,7 +26,7 @@ class AppIconSettingsCell: UICollectionViewCell { var appIcon: AppIcon! { didSet { imageView.image = appIcon.mediumImage - accessibilityLabel = appIcon.name + accessibilityLabel = appIcon.accessibilityName } } @IBOutlet weak var imageView: UIImageView! diff --git a/DuckDuckGo/AppIconYellow40x40@2x.png b/DuckDuckGo/AppIconYellow40x40@2x.png deleted file mode 100644 index 8f6b0086c4d6e11cf267bc7dda0b8225679cbcee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3644 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 z z9uhXtI4_)$#@rYydgRtGEDQwbb9=U;b>{%Uf72L;d(oZCB9A=n0z1*B0KhEG%-l z)oUPEq-JSnWQ;_BrghmwpnN;_!Ui$|L)|}!3nveJxf~n8xI+?!Pc}QuZJ@H)l*ntV z^uh5rDU?trqEIMm#(h%`7l{DPBlqcGe)1@WFy*a*IqbgfuFu{3jlzoSkf zqmZvt;MQB9DwBv0fpC{HK@Af>mU; zHw7pfj!=Rfk5@bzV>5(l8j6MJ>)B~q9-E=?>@3A1QA)-Wlx8=_m8}ifIJP|7ZE&6n)y2YEN0A{R|aPTE?iEJ7h>?YQdEisw1l zK^|b+Lnk18Pz`0k3j)68onViQ#%4Z^Eon4f>Y!6>#-Pzg6_d`urw+~XlC04>b_xepW zM92^Q30!h}&GWfns~hp`nub04NlkrZq^6Egw9v=1GfS2%Av3_uIQN&EI8k^!0M4WJ zm?_L{^(t#t(D;Xsu|Z+6qTNm40NPEoT6;kp(r`wXXBfr2J^l{f8M#E*NV^-tWxzqi zPVVJd^hOgW@l8KZ(`ft!q0S~UWxJB*` z%TAXT{U8&R2^}=oHD)6&ID!A|Xv|`^|066AXb}qpTEqf@7O_B}Mf@8y3%B%Nw`DQ_ O0000)0V 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 diff --git a/DuckDuckGo/AppIconYellow76x76@2x.png b/DuckDuckGo/AppIconYellow76x76@2x.png deleted file mode 100644 index 34f7898e02168c07e96d9973ea1225c8c60ab621..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6722 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 V=u0Q4dp!AIs3>YGRLVg^{s+uM>W}~c diff --git a/DuckDuckGo/AppIconYellow83.5x83.5@2x.png b/DuckDuckGo/AppIconYellow83.5x83.5@2x.png deleted file mode 100644 index 96634519b6a0708bc6a6d9243b4911354dcbfe62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7974 zcmai3ZbW(|q*JAr${WR4<^4JW9<3_1?b*-9b)E4h5w?3FpxY0|kY)Lrqam-yiiTAM2CpRnSm~ z_Lu#iu$ec5gKzkRDbo7>@+K2l)61&n^|%#{Gz|dWH{p_Gvo{sFrM}L->~^xA(X_Yz ztcCU#5LWR@D47D1V~Ht@C5&zjYOx#n(ac$W4ZaI`sba0(x(Vqx3GM*XO-`sUXV@M+ z9G^VDyiA{+2#;)SZc1%opP!wv{S*z7jQ;?jn?%OX3^m>&FVDFCUkH6z-JqP*SJAhf_$mc6 z$cS4Ga&zqroEjTz_*a}+9L-C(<|eDJUaW<<9rQ5J*7qCu3BGhC~0cAN2Sd!(s2}WPR0sjRy1xu6>mseS_=4T zcbq!TfX3zYxJsAqm0(hUj9@!hKsdx^M4SS-bVEz!&lwvJ-xYEuk)jnTD76(Z`{K~A zI21-3UneEVj1loRcE^1#Y5?Wvnj-}{)iFPK-fx@!mGqB^{k;anuO+Bcd~3a3|LLJL zin|7RKC1eCn*ktDta&M$@X&_QJMLzw#l&S5-+(PY+x;hvT2l4Z!wFaPRz=f5Y_WeI zi^bnkdMVjtEQ3n9vA^4lqR-Os4QC?+Oawiq>n6xuO+(a^!_1R$ssiNYG1aWrc1S_Y zv>$C=mkbWoIlD2a->NZMDAdC93{9k60y?DKP9MDeZ)L{kn0P0vZMk!zKAl7CFd-Wvts3Dx{DsLM_gZF({EI}dfl-{AI? z&*ok@L>@_U#|5>PB;k%0Y1VLB=z)=K6xpgO_7)QwoH`q9B=N;&D-Vxa=0xRw{jo+^ zy|e0p>w}YUZ;-B%cg1Jv=CxCf$UZBMC@#8P|1=Bc$3SMBZQG0~A~$;j{n7C+Fxq`w zPckM=qt>+@_vx$Nksgy&DiNUn(jQ=x71l=s1EAnL?)!&~*uu{_g%NokoqzX$gyj#& z2u_cVXC*Bw#-E1{WHX;)V`2q6*730OADs3N51E1i3W79=2ZP7XF5F(ta@Vy5iq$y?H|VjuR2J z*3m5uIOwc0pGJZ>=$Nw{e?Ec&rIIk2r4`;BvzDBWg&dJroP}F#YJjWh^}7-lELg5< z)2khkv*u*kX{T5C`YrV!oNtBxnTTE?&-v>1BOvFY2Wxb zSZJs#*JGK?n1cDy(C|P#lSC(OUjd^iqPpC-Vx$?6dVxi__RVdflPxeX{c32u?K6sQ z)a29KZ}|cFTW4uwijds92vydR6ui`fdEJ(0>u0eS>G!jPgUXfF)hwNF>!M`$0J3Vc z{l7G0s^(IR!@NspI{h66jLU5!dtHSkN9% zQgV4Di(IjLDh?&Q5eaEM^W2a{+s}p;wolL9a z*0p!;I>xY~@&0$6P8h`^yh@q-b4+>_Lszf*8G|F3$TK`5y(Ys{_of!H~J;n&Ra_KxJhm z5{n4knUqCveN?WB*asj)zfSvijph~v@jM_XW1H}{vBhy4cO9x$%ny-fQEd`FDof8) zbF@3fYxjFt6~~@uv?}J_+ZqUC6To?iYB&h~WpS&dVW8{f)yUL~j_GEZqF&S&@i7l8 zRK)97=ZdqKC!vmqJ}BAVHo5O@UHW-(wf-OY*ZqS7Zl4t}d&XR{qYa}R(8Wf4eeI|j zV#3K%&p#a-9}c#^?>*6V+d{CC`tyej+OIF;WIX;WQHK_$gwnhY$7D#Di7 zMyID2OgbvzCDebr8PC0K_ac8Gp83gTPw6+eOViSQwn|ygQ!xuQkpM;Z-Z6J$=h9=4+1rWCIYh<~I@D|TEY)$-6^1}NAr+Co=^pp3@awWpG>59lS z<4VU|KifH3~57HuuEjCa02RH|e@r|aU59M%_Pmeu-)D(P|8 z<@)w+j;TT`N+|%RgCOYc&CoqN?c~)_R>91e`$c(YX=bjlYsoS6!}}A)#)I3K$_&Fb zQ-g_S6OIYzEZBQQKueH-b})8EytO8YR8R>Cl?G7jV>V77)|%L|HvaPt?Y@`*c;3cM zGrRC{(fNm+Ud`j*?RK5VKRQ;T9q8}t-Pg%H;)p%VR3X=(aS4AH;AnoI^-&-arEBs{ zZ`)Ja!R|7rL9$uGVA|z+$YGI-2oDrz@?^_^sEgbq-7kkUk|pST3BiE5U=dg~6rE{T z&|Y=5Y9+;BQe`jA?P4LHO+lE43$wpD=5(V0YFWVJ8Lu?-&BW19zYX2YOon(e-@L%$ ze%ob16kM`Zohz9TV0mit{6BIU%Qthj?#bb8!BLGB33jcn!Lyq|~W+2L0) z2HNa!>h+>8nAbxCOO(e2p_rIcByN2oXXovDJ zy20QtFDyBr$;JWpJ?TAv;j(^8f^;1CqxH|n{i((XEZ@fm);rn3)t75xaQM~Ik+V~A zR&CVuLl*PpOUBMRT5U1kxv*N#Rbo?Kd=BmqM6!&4dIY&$6e*R)IQ%9|S5a^LenrMG zAkmKZ%*_9%sDb$p$F&6MKz7$|dVb~GuDsYB+<3jFuejVAP+j40?x;5P^H+vHw&@CO z4KAQC@{n|Zz=AuuX5J+}s0JC%)>u&y_dDD#$a`=hOz3a?l5aQ|T3+T>M&YqoZHT!> zxR-qqtyK!FD4wLMB-4DuFri0<-V%$Wbg=XT z4F=845Fr+zB6CpHd9Nz&BsNphZe!|g1ZWbpqG`U}B^@1cr|;+z;)}m67Ol`_C`6Tq(Ye!GPMd0JYg3fmi^^E3^rsW2VIGKTYV%9^7W5&>X9~D1V zK!LT~*5_3Tg1*w{12ei3k>D&47FG|^g*@|=g!n6c6_s;&Ls@RT&P6+_%MKwhY*6FB zK?SUo5|!!F&+ca0V>$T!M%ZB_k?I6CZ13!?Vb<2L@1L65z7sGLtDTES4eUi`H!?m8 z+p+D;GyDeT12|sy$HdTtTOt0j3qfL$#7o@Nj2I0yo;Dxtn?98`yA;xoc~{fg&)&O_G_iY-W36(q2`u~B@I;lz^T zkj;Lz8nh)?E=+-SqrOrtkg|@Thk>HEz0oln4qRAR)N=+l6~;1#UMrWUvpo%nd^*yE zBpLyXM)i_(*;6Q}pmO%y8VrMwZw#K`JxmAoDXm5AH%sDx*Dc(~hc8ZQSj5HDR`uKc zMqv;}dQnKPBgRm+C`PlUh_x>Ju`Dn`FIxNQLjVmXk#)p_u*ri^_?!X<%gKCc%3hC^ z5daiJGn^4EsVJUNJgXQtJwigx?Cy>^4R{-`r!UN#n?o7taF{lu*21Es8m5`7srl*5 z*2okxGDe~k%s`_R5hrUoxJh7jEUm@=VE&lk&3`1u5SPb4I2vzPPldXlFDkIw0+`xG z<(H4bs_c45DDf-=Ely1c2a+l&3>1~kZ3#AR0zRNvUDKWv5ci^|Iufus!2|7#AjMOn z>|2jpzCT5Yu{>g|+7wM93)vOs3VivPSCmJ z%JpaHC2++^8%UXSI(Fq=Jj9-xb%6!?`ck*hEME4|v;e=osn_5 zE%|Q@vdLJT|8Zp~mCDw~w{XELPf1!dY`tA3*{CO1Fj*2cOC03GBj5rmvP=nb7P9QU~idN}c@ ztCfFzea?Tj4!cNi$a(uhMX#*+8*1z}%c*xdJUs`>Y&cz%>oj@~ATgao;!`j0U(%k% zNZ5584nz#i?Vw8@m$Pp$>kM?(4qJRNe1KgQOde|H@1AJI-GZ9B=$0FCI{&q=uD0CO8v z^;`ea&Z#6*fZB8NO8cTpqFbw8h^~3Uzxbs-f}z_N`2&y7L}C~UAKDW4N52{~Ue*Z3 zCWnm62ezl^AzZvsTP9O(5`wxbuFk;|a`TNCLrsn5GsbG4hR1|7X(Hxrux zi3L(p`a|W1d3(X?zhCA}v@F|2ag4Qx5H!dMc>nO8drC%?PQ9+NY2|<99C;No>k~`o zq(!fb<`nN#XJh!TBt~8<&d={7CY0wdGh6q6vZkk}<=@we162X3n zR4}oS_}|VZ#?rrr$UL2mwQY}k_PvI&&UYm8TOjsXmEAyT-5J0O0-msjWvCtWq{yq@ z6(^jWwho@FHJGI2{p21!hu*@CJKIp8bFv@f!Yu%h&X@CRt; zN3F`qfU@P~S2ay3f;Cy1uO4KyeXa6Dt)zxJ6dMb&#M7wTsr~k8+6+uZO>eRXQ?2{+ zJ)$dzv69ha%aSbljt(Q1ew2fEyI;Xvz6XDPmCD45_!5k$@StM}*e}$LqiGxTSR75w zuNCIW-{@`r>eEbRN~cT242^Q^FEjGmze)S{ABguKnREUp<22IhA-Xn%9x61UpjRD;gBGr>Tp zy0pbnq9Z{d5)6JM>HOr3FBP(HykC8y^JF%jL-M3{D5woiNRK|1ve8`p*dTQU@)xeQ zLM~c8WCd#sb*$Df{qqCyPYBX#`Y&(B3RH|7=5Sn!z`v*P>__6h)9+6$Pthy+r%yXWyZaMbj~6HK=J0~udmc5Q=cr(v{pv15MTm@ldL|U+F|NEw zReP0d7N%miAAE1kil>-HvlJ{p+8G`|=JD*FssVAdnoGDXV@dg zhHmja=w|4D|UAZpM$1y7N)LnbUN z&^L;8U4$^7_h}5BMh;>u&bADOrTg9z$rUH1UEYuDWg?0!~lJreB{K1!|4ia|4o{PP?CAS^+VT!Hj$@!jMGTyRuVHxRC*l z{yRv)3CYpxY28&PRc2W+^Y?jE9sy^a%3RlNw&oBYmt*4Vaa1CD)?dobZ7oMUNOG=1 zQa)}S7i*nEswCnl(%G_27y0IY`ryl5TCC2z?4gq&mO!+=PPU_rL=MXM;G9&^#+u%{ zV>C23qZ^h6&HpeA>&AhJLG&v)A(cc{Ui^Ot7hjc%?~>8x(r%Jgs5&%H^nA>NbV8#Z789TjD1 zdSd&`FIeacD<^q#uq}D~(Etd;&RS*3r+w*arpWA%Rw2%1d!7(R+&9YKR{Rodz!Y-7 zu%+0khA7fU=`=oJ6KLDDCmBCUoYY;Vj)4#b4QDk_u#Rc_BNsnwyXqtoVW2Pn!tO>5MG2rumy$mHl|Kl|rzq-kr=J_WgA%YV z=U^YrT?8P+QUE#;m#A_aWaKyXQ@YsvhP6%a8TcQ=S9Xf}Y+WUiunvz8QD{mDXv$-z zK_q4V!VXIrdrz|T$sHJ;bj8F}I-@33LzxlHqOJ5??i|G* zYMr8Qw=+jl?y47rXJHNZ7NBd&-VKUOpf}`s-!9x5fyP)-Rh2h2cW3q@CocX-tHc@a z!rCi8Xv1f}4dhxW)Gjo6Ccn%Rc++-E540Pmq}y!26^{~{C}DQ{l{jT#7hMtA(3Cyh zWDfZK?K5N|D@}hOg4((@n0+`EHc~i%kRd-(Of_D``XTo1gxgliD^^<|p0D)lu1BhI zLO=}o+O=4-I13)e6ix?TFY%^Z9yD#g#`7u9VzgXXN!o$p)aII7{F$2Kvr*quQK5yp zbp^yYJGB#^rR7(uQzlPCs%F^N?NNS0 z-l|*w2*94s|1aF3+!?W6@0_G8IS185s|`YXON zEXbEKx6!?Y|DCTRxpP2wVQ=;&?|Rb+O}Ez6$ty6Kk}Rs=5|lk@qm`G!B< z7`{m0P`KPYKT9dKtSXt(?@}IwC>e8^Fwr6;Pm$W3cMzDmz#gd}jN=#iK*R>)N@d~d z)4J|7KuE}prX~ztabb?S?dPhOmKRz5AR@q1%mzIRPP0 zw3Tv~ZAB1@V>G)@l?{k^8jhO@YuHX}cC%e1yv4uB#-BeIsFGIs^Ya=@yw;P2vSI&bwObNpOX~UvXZz zCi_eB>3AHu>y!2=4Jgmlm1`m$Yyd)Wu?nQv10@wVC;4#_y647Cj(^J+KWHD9KHNOf ze0Y&fCvS!qN_+JjBq5+Qd%gmoH02G-Hz9t6YPxi3!L<(bjQ84d9V zFxbt%Z<=+m+Dsz~^Na%*-X36iz77{?^uiR(q%Mj#k?C%9lh_S9R;H^bmmHP7SUuDw$A2<@oVyFMw;L!|erx2uthz@!Ga_qa!_+0FyqIRPk~*sYl>4~@4Q1g=H=_YWs}aJK{f5UF?HfDX{7p@wo# zI720H#c~Qf>f-Ywldrvo7}8c;lrOFN5CDE%h

    %@G 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 H+lBovQ8UFd diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/20pt@2x.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/20pt@2x.png deleted file mode 100644 index d2249843255d75c2619d66e084ae04f1c75f89c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1641 zcmV-v2A27WP)|dMDDRuEu6gjy759?Z)zt-I|giqSn%KxEfmEt$rTMm%6cVzEihEbxDvm@tioz zNak>2i)@4KfDY$sXy)X6pB&RAO-+Jkrl!K7VljT=k6V&z$z_tT)xVA``wp1RW;G=erOXxClKY)z(j$r?vn& z1lb&&F#Tg9XR4}4;fH6EEC-!p5^aM;L(72HSMJ~SCL>I^ECRHLV|4bXPS_IxCVh>gg;8S?O(yq zWAj*RdOVc~C*uyvm{LDH0zI%}Xw z&{|r_$tk+NE1%mO5unY_d^5$AbwFmfxKbhxzu z#FbfiS(r2J*ce_Il&?)Cnv#=jtsY$PBN~m$$BESBF(4|JJlT+ukrM^>Z@)xNxCPyi z5#%RfIZ_cq5aHRs0k=DKJTQ_Z7h7V2?3Lb|5nDz^aLp;CJDHPE(9Dzpq7%O*?Jx;* zQ3?@~5WP1)TA)2?Z`pYI0C{l6(BPBo&}Or3j5*nS4>L4hC#+t;`-Vg^!c;0oBnP1< zo2fd?#sk;n%Tn~97D1DsFgBcw>PjLvj1M6c3Z)Vx6g5jk8A%gHkdw;-cKX_koS@(! zQq^4ne@Blt!O(C&w?oQ}lqY3ijuKh=Pi}_EI#k*!zNt!NHX|yw-F_`McH9U2x@hwDnSBuZVpymcusW4 zOLAt1!FfM3LpQ#i?7|=GZW&vRNsAsfBOZ^lzgLkBsb`sSrxHx`C1P+nW0$B}@+V4i z%J@_rr>CLV)j`B!G1yHT;|7C)6HEV12%C{gj;)Ef2;Zlz$b^h{GbHx8_T%df&UdNy z_174J!5|7Og~_3{wKe1!cfu6QMzP<77k*jAo|{1k%wAo~lJsZ|YL<*P2Pdc11#Ycz zXDN_w1$ZmKs%y(<-Iz1Y;De#J;L6&C_sT!Q!Gc5l8=99Mrl@JB@I`9XLryor1oBw- z`H+d=%qkOw`=^V4UuDg5nu^9=^OTUZ1;q8NYk00000NkvXXu0mjfCdvs$ diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt-1.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/29pt-1.png deleted file mode 100644 index cb22b9305b3d0ccb525d966b7423e83860b4e7da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297 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 QR{#J207*qoM6N<$f^m7oZ2$lO diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@2x-1.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@2x-1.png deleted file mode 100644 index 6370e3f0110d71e89f6069f98af6534af9c0fbab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3498 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 diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@2x.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@2x.png deleted file mode 100644 index 6370e3f0110d71e89f6069f98af6534af9c0fbab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3498 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 diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@3x.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/40pt@3x.png deleted file mode 100644 index 320d0f79020c57d6b79767b780db6f6bb99cb867..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5254 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

    S?Z+3`Tw>+?TbMI*2Jk}HTAoA6WPkcE?b$Ld z?$pg^FW6?pD}~#(AMAG2lw!VkHGo##l7%Di9W2>>bJ!y0HszqiY-B7Habar#Mz}`Z zfpiYr?Z#q;YF%zQtyf+lw@kyVWMW;sBA>Jtbg0pQ?|nFV$Xi@=|f0jJv#Fdwx|AO4Eb9i&V|8CtNLz@Ee};}RgV(#s*+&@Q!m zHjL47VyaS?J z)+uYBs&{_yXI$~s!PEo?$B-7x2HP;vA!xVJpW_vaaO`5qQ)_-UZEOt2 z&MyW+C24xtul$&m3?Z$pSs@|0wI6I}e*wN#F1QcQHCHX;sh5_c*X>EPc(i6r*f@<9a<^fYV`N3#C0~^#g^| z8FOC*$Y>$cDrju$2l~xV!ib4)84;0m-8GElg1(mHrYAdLQOkil@-s^~q4h0CGQ7(4RvE&y9g`~P0T z+P2O4KQdtc-DZ!BE>jC?u2Q0Ga08Hhoqwb4THZ_NfG~#CqO9&2+eC?4_;R}soD11u zGNNi(b4D3wnua0N%P1`Qq>-t=%!pid17c7NN_XvP+_9rEGe)u5wtfXl%@jKgycSOErQ70J8KN$uNJF zIAVy67Eu$bUK+xKv7eUitv-8(x88so25D(Pjo+ zjW-?yhGO}1V~Z;>G9(e#=$jE*ro5I=FJO+Hedn$08pFdvnw|6-(-RM*f=#9?0$i!c wm~veRls701NR!)zpsm!PF|BvlLD2+}mvRM1UJtBr1oHmT5nR849%ZIjAqq5ErN ze{|JE%Rdu)uxSNNZ8t!wDw-B5)P%M`LwN*3DYzlH#_{`+dwaff?VFq2ryZ(3)L&%T z_nv$1`F`hnobP-mwu?XM6!GPUXvbFsUlaMF!GT)@yW0n6`(n87T8r9H8~eS4-Sfik z@$q&cl|b=Egnws-hmfVunIYUN%$i93(oQbCZ_RpHXaWf=q?0I)NBA|h5mDY}S*QF= zdhiJ12lpX=`5a~gTeVS(2m~J7JWZ&?z$;9kvuw6cFap;!`wKOXz1Bk5?~0i{V(wEYT)f&k3jFEGNB2ko!E;nFl{C(c}-FQ>}NMTqkg|`+^>P9w+|s?87|5c|CQAg{BK+uVcQ~%&g*@Z2dT-Vsj$p6x|HDv5(mFw#e7JwmpC`7QtFV=5|jcxZw4Y;Pi2QgQX)2rF+FV+n2D( z7c?R|?K+h^QC%YR5T)W~C{Dz=R+I~&ibR4*bDia984c|g6Y#gOPoKIec1)WDi^5zZ zj$kWHiCD(RqsZlQaJgLC?GcuST(h2v5VBW*=xfZZ$5AmjM+nlVgbMDk2rD!x;l(*DmH8Y{oNVyJ0D}2%HisL}hrtyPi9G^2ke??V4#knHPadGKR>exStqm z1+Wwa4Z*ZQ)lJHP-#~tnN~NaV6H9;cAgsS~LZV(9p6#i_pYN~3fxBywaoTj>Z+ADy z+8BR+hwgK_DGITtG7$L+y(qeOm-d5fVa!k5gwWc`^R7R>y8~wur_thS#qEJR@x8hC zgTI}X_Wcew8_I3NM|14RvmC7s^>Y7DyxJNe zAEoF?bzmwB8NslILlG?UOh1I=1h2>XSQ%3j!*3&A*-yx%l&Epkpjar#*OQZzDC7(5lZPm16QVJK zTekBtsUmM>e`HuPl?RVUkvaJm+;^;!&j_=_@32~IDbGkUA6a!De1RrhxOo;MX(_S@ zlL8vVM*Ohj$8ZX)io#a=l}A5B|Itaz8!Mtd&iZEyxMxH}Fm2;Ofy%W0AN-t?pb4~k zBv<)C&y&01Xb$sPiZQ!QzVQl=C}QtcG=0Ap7jx(E>*HJL79N=Q5Posn7Igc8XF>VNt;!r?FuUivRuJ#+Ex=DSq=v+ob` znN|`|o<%ATkt%>#^#g#+bUpQUM8_xxGnQ+EXd*0YDwn*aa+07*qoM6N<$f|H+hIRF3v diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/50pt@2x.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/50pt@2x.png deleted file mode 100644 index 73231dcbab1d6e8398295ad76d891b29285050fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4660 zcmZ{o_dgVl^3vW9rnV)c$MyS(;u+ZX0y zuQFx(?f~3ZMkGW1QZZ!7Pt8dv$5?XmgjYrDTRxM%02+cbj^gbjsUD{;jOW;(GXp zdxgP_g&qb=ulmICML0S#%szz}fM^!zi=3~qE95dQm1-gIqUAJ4QhkX)*nk0t>V z_F-NZbyh$>Q_uwsbD;uHI=$DheWpk_KNUu`l&rmGYkUvz*%aa_ZgaSieC)zPdi<}4 zDTJM7vsWt9LqlRWBC>v0@Fx%4y65bK`H+VU8%^%5Ny1hy^cjO`yC$aCJIrg}@jafJ zJelG$Ad)Vc((|n-i~$42ol&zgi#ZLOobn7q5uVTL03X9bP7| zvS|fLys>c8;=tx&FqqgiRJ6qy{4Jad+E2ybcxIOBPcjZ=l{XtF7%ueYKsnZwl=8Pn zCC*iRs5!%y<1D(8d|PMYkVLzYt_%_0UIX?23wMaW{pm3V`fe1Ia zHEH-y13x`uX}h06dc4hg{sw$~<|Ed2(en8E))1*8w8kmDl{o{^2)fCjzUaUCml0L< zD zMf8#J2Wpoi3CSc%Me~TczjLyqG{yIsYUoJ-e^m88gzb8N!Y)VEz-0qB0^g)P;7Ne|5@;6EoNZr!L{!qRN<5RPG24n#R(%LFbHGmyNB zN*>oKtA&c5=H{zp{^e%jAAAC!1rRB4T0sYJEnKan5fOs4hU6)p&TeRKZO0=gzPs|C zb#j%NdJ@eL8*V&6t|o9P!b`86qwER9$K;FeLYt~NUQaJ*RJdHBDbXAfpNBN})iy^( zL*9+WnDePSX8T0$I0n4`wfF9YH_WHie+IN>3Adc$N`mjwvv_%$tBK$h^YV--0aqwT ztHd~2?>Ila!N!wJwQ3mEdcd#KPPR^yKIHpCVO*)~oOb3pCLSG3O!vPB0u^&i{(_Pc zMIPl&T2WFtf!zFkH`Y8#1tA?AL8{QlZ-`q6nLIo=Y6L~$RhXIfkg)e_jbVm*igupp%7#KcK$U!%Ua2|!^GsXvtdh;7)*hhyZ znjddAq~Ez3k(jvMy03B?3BR^>K5hR#TsvgHVmg<)pXDFgw@B(Iz5Y1F|Eqi{kAjwx z(9fah-1s=QV{gLerBCH{4`g#bpsKv1v;KJ$)h^2gW7X*~`uOf*s|h?y9Zn(;ASQPZ zaI!vgG~}1HdQU7$^)(>o^^zAZcDYkYdGyOHX!3MHZm^!fLJC|Orhg3>p<~2Is(fR$ zv0Zhe3GKZJTTp!y^_lUZVC|4-YS^)#$?4us%%!ydV}=hdy3Yjyta&d2ENdZI&1KIk z4aYYnXjZ7na}Bq1TdBE|`o092*1ms@w1DI1Q+lUi8hkIKt%=j-9aK6L9{=;g$=?aN z+r{f<|8us`smn=v*4sJGSN?t1t_GYAq|tn4Ich8k>q~wM>4&gR9z~(V_koP8hRuQr zT78sDGUrXj8h05s3XBm{9v>VT)b#YzY!#Z<3dVPK+(b0l zRAy)uCM>@Wz18AMp&C7N*QK>G@X8LdoLd;xJ1dW!HpWJZM^u0ChXMvBDF0s zhf?QW6%!hZpJC#@Y55;n*iERBUke2W;N;LtEDT5f>uS*k%Qi6Ey(j#Gm??l*=1`kp zwm>9~pcSM&Z)r zGFOhWc}#ztIj_{-s9o|GNM#Np+DwR8j4tZ?8+g7~Sv2+NWQ`yR-QF5)9vOW@MV993 zOYSjR%sT=H4K!Ed>$HpD9+yF51uq7vokp1Jx819%;=xygN%^}9Axpd!cgac6loSEy z)L-2Gm!d&YJ*x#|6f^k^VyPDP7lnx{d=hZ+H8Jk zM=Mo1pX(Z%z;3+!YrqI)rKF<0V9ppw-)j^SC1#My^6=%^oh|uuP-5r7C`22W$?=u` zMfzdHbM9#JB5qIXDZlx6#(u|;=1GATN1FTNC3D6%(Asc6|u0Sdd|8bE-Qs%&_R@7u)UH1%O}^FBv85VKdMQjv}b=^QZKQN2r2j3Uxw=o8Nf&z&B3btggaNCp=c> zcNiEtnKMV_=LD%{S{?l;fr${MS+4Ly+D$ubF_V=i#7hPqYrd#g^DU5PW?X~jB`CyK z)o>Z7AB-d{WBvZ3LJwFVJS75m{`?XMI|M`$BZ@?9l+_=3!ryg1B)1>Kvs%0!ODbS! z1pV2^5Smc%i?-yt2|gD6Tzd+0oZudfAX=Yr^_MmbdA}{vXxuR(V0_r_&s4`d6X?HvdbSzKOH_>Vbx{mRj9}e#f?yCgXZ0o~F%(pTM=4fknOSDToJ4rjT z)l^%{uv_27pKP(I3#^n!v(qM8GOFuonDIQ*PPnAC&yPtXr=pmq{hOy{wCxC!An+_` zN>YOriH!p@90RJZ^=4B>! zZ9Lr+Mz0@LJL0pD5Ov)wIn{6Ej8Dz=el`9D&j#%l#+KX`JnFrBMqHm9g~YwyT~M5I zzNBvu;IX8u7*|%l&e-OSQ?oyaCDJ`~&OJH;v{Y7vEgm6rv(4D#_hULVWCspwz`Z9p;S`iZCr6>3w)}nI2vrHDPgyO8 zCj`$64~kC%w_Y*lwyG2_NYBYfe*(L4Wv!uJRGJ0`X)tke`O#c(iRgu=vTg_bJnd%P z7HR3AoMo3+*E26Ce0qJVki`ay)X@>eb^=nQ-GT<=OoVkbWv(-8I{p-R3#RVUoyKWK z_FGy{2)2nLOo3S;SL&)H=IPWW<;ww2eA=k!RojfRppQM#Dk??x3!~V1PJ>kU&&;rH zUH-tqXV!v?xZ3xYK4*5;!Co!3dG_htep>vua|VUY5zg|BDi$Yu!CS~n<8ek6PH9=5 z?-|LCgCIc7$K6-1PwlHk#fs|8r2jI%bNJHKQ+Yt0iX@FVpNky765Qcdn!Po<<15nM zc@?Ll7Th6PNS6kED7L)PO)f+;OsM8%zuE*WKm^H?o<0p6Nd|hlPI5Q4QMB?bzIeuv zxxQ}9jo{>#miaZzzyx$B$k`4^X%Lg5ebKd$g(ZKo7XciI`8xUgTb?zasOlqD|BH=z zA<;e9w)b0uAdJ*6v zy>G`@xKQKzVlP@$xxJm6?3_rTqD;7o?q|*V*Y2*Llo`DMK^I9%_0!s}`CtyFt;Oia zO>a9BtMEGpjTf!jhFu=cn=xeQ&EA}4&|y1nx}$&eet>dFwE2R+zCPnGpJjf9M|zQ7 zT4Mvw^3#2JyH{bf72ER0AvRgtXr%o$usrMLqX2rZ>T`er-Y3Z zUSBj!=Gx2gCg?;Y*T?|5s5?UvABoR5qyy9wViot7+Y-`Zx)WD;U*;iY`r#B3m zSidinIJGYGOk+;^_m|C|w?nOj2aYLXJwQqfY^`{MV-rxxqayPkU#pqyzj=lEF<#x) znWfVf1GZ{^qc)jSJ)e73B0-*RliW5z!!LGZimo3R-}mH;lK!L8ifK#9ezAHe-3#Cf z$bPIlWymn@^*F$XmZ@1=?E2}m#CD6AepFklCaD;0P3*WC%yf9_fJt|lQ2Y&^m_5AQNKs*LKd zUpoF4JPGih;X7k)< z9BXMeV?ZsABP$T007{tsVeII)1dza3*+Ae*@-Ux6KpS46JG!Tm*jsz z0Th)`{#&B>>Z!;Bn!nN>|1&_xx0-JOfYuD$Cu?*7fRsi}@vT7+%9#bOm-+YLm%the zwSMl`CWJgxZYUVzE%gy;DVlB{z5;5!+4VnY#Kua-k-JIcVDf1cakgT2Xx3)2D@f9z zl{&<*SIz=7nMeqo7uR8nc%shKZsV(;sWX?mUQaKdyL1vd`@((w5BgOC|7?%<1{z5| z&TjVhb043aKYvBa{Ca}_McQeWxzwB9HN-b6r|oj7{C`Nl!+xrCz~SpliWv~o4R<6& zm*~HzDt}aXb(K(z8xhGxRo8F{Jc!4*f4o@>y#K9nV=)C?(f{e)h;eu5!q*3{PLTgC zs*lFf>AhyE>>xG?WG{YI8ulAYvqVZ%i0F{|kaUQ#Gx)lWs?zoD2diAb)5NrJ#LYwr zbN?Q8d~%wA-iT{=kd}*}Mv3^?#LFwz_u++HbYx(GMEA7^P+u}#)w8g?2glgQGgA9C zs%#9iR!y9=wo7Z+Z9j#y}s6@^*u`-D+Pt3Ug>DVTzO zyRFIWhKh-C-e;13j|hwla&_5e51_MUBzP)~c@6f`ayFIAhi@*nF6eG`2=dN2hf4bq z-t0=ikBBg&<)uy?wUu22G0)pKepU>@=-OEELjJd9p2s0&SiyV|-IgmtV>|xm+miai zI?+2yJ^w{#m8C~=f0B!Oj1%rY63^^eSzTec*pIMar?l*Nbk)8bjZVyRd<3tvBJsI7 z?)tm+kMsle#A$0E9`?`$MB)-Dd-W#xYTE{w*ZgBB!hSxsPsH7%(QeKy<=vZm?1Oiz zxw2XdzmIC3U0gwh)tI2$1lp{GzHx|0n#{HCZV z%#t~Wdh-I9R2BG5GL1}t^6VOZPgT_q;~87QN^-+Vbko4FLZ4_xR@rpDvbDxATjTq; zf&2@%(>>t{79Osy+zox)tl^1oaS6=~Rz`Rb84OvL5xH6dOJ8FKk=srDQ39%cT&4qs zSKZrRmXs*isS;iZ^ms8Guu)Yq&wL>F>cW7xDLf3Q87+7Q;)uBs`$Ea&+&rOdA{K_&+mUA^SCA-!rOq7SI}n~riNJl}FvSt$d= zIy}Hbj`e^vnZMevY3_gL=OFbrIIik4bf!g8>LHL6YHDhYXWkBtf-QD>Cp!IWk2P7A z&#`0S!cJ_Ia=-5j!$p5b6-5h^r4_sp}F+=OUA8BHuUzc zbvU~J=dHQ~GlmOKZZd}n$FziB9hitcEKt1YtSd}=!g68)Pb(1UxD5>rNp@(l zL`j$}-)g-2Fh?u z%&4vBh5zn`sii`_waX(tIzGE`OXr*DP?l!-@?}XWn7?(Y`u&tHD~jW8yb@i9?;~~5 z&ap<^z|{%o!(^8JQg>5=Mf-sR)@DcKf4$)&KqWBS`wJICjS=PIq9O| zN+wG~KOcV|O#iidF~_E9`YP9ImCgGBzjj-Etj)iD&s=qtTV=cEWpHh*MnjbO2gXRb zCdeQwAnK+WaW8sBMkd__oXF21E8_bI`7En7!Qn3$qfn_cq~b}RriZLP&veBIvkq?Q zo+N~au$YKfSP`FnCLbzT;n~i#tr(j=8K?rvBIeK1zeDwfH^O=XP~4eZM%jwNj=Usz z@0ik^s7^pT>yx;cZ;~dfSLbw_~{ews(e#Y~_5tek1FIpra_Ep;= zaA*kmO~MRc6r=EfeH~ga@Ub9M6-rfNJBc+~?`WI|WONI;C@aPvuojBiZ`?=CIDL=~ z`AM15uZ`z}*)n8{jRA#P+|+&=&ek&MlH}0v2(pmfx*nY_N!<@B8XumJi1w=c{CQ#T zWiTQd{`e#)A=VU@?%eZUA*^c;hfoNr2rZ+_?!_U}w@$kl(`7BKw-ICslmv4ghL5t& zVv9BpH1A4d5T(Owl5JT+i`j&t=*X=_?An!~UfyeqX34w2&|OoxxbwT=zrjtZv~47E zG^g-7uk4qvXReO&!uARxo+Bay_;yVaq4{pmqgqG%LnoC4bz-SOTLhYn>?irk#!{Qd zWo;j|`25eeiv8(o-tXszHOi&mRY*6*tLI~p)1}#LkgTC&jp_23$F%#>Ow%A0NrnNY zYQ8w;$0ar3V|Q! zoYPE8Qn^(eGUah?m)dfrJIHH8B-60Jqwce%=kO+Stxq*aMv26XoCjyYeRYR{?oEuj z>EgHtd~^=6iNViQh|h}%42O-7HoQ!l$G~h1NLkpyDTQ>1k`fp#F-`hY$uuBubCWU; zKd+NXoCP$lm#iBeQF$BV~7g|j#T@8BhcrW(uR(tW4)*jkA~*R9pyYEe)pW?XxYj)h9r@@0yEfg zu*P1d6p7C^I_R|6au9X1!`lusAl=L!Y-O#GqvTPh8{Jp)urdwq{U1^82jc~g|0O5k z3%YUL|22##v^2jae71HKG~v9H5&yB7BdW&t@$89^TP2S?wqEd)10iql8xyAUJeliA zW>8K}0IT_;6<;Q$VOR73v!wVi_bB>|r z8J|R@`^hd~!m9LlD#;iQ3`S2W3Zf$pTBzYQG9N2naHN9NDgi~@vIJ^|j?60|JwY zHWZ%)rlCEasg5*Gy?he5lSB==a-p9jZOT=ic_Q-R^G4Ez`3tajt1jMb*N8 z(_B0xsimtpe7j?NO{*pz3E$IH=&FB3#2q2r_eICFN${n9OW}QUovF7>2&nWLTcp_Jev=5nK08-* zO|kOZa{K0|6Z6hcH zPWi1Mjp;hh%lWdz2tTeUH_4{xg#Z#4YLa(smlstbz==)z5kyDQ$FC3X8lJ;N0#*YI zT?yn72+A((cro5(whcQ^dIUVXE7!ur$A2+KA&~|O+M*v39rCK@!^I|8(>pD0=9$d5 zg7~Hkpnfzujdof=G9>aS$%-FFpYeAW5SeYY=r$T_Zj@LG|vUTUw1lj18bsg(jnZ9nNEF&D3MM(o zY{sPMcN_%e!@C>A|K&t7%YKrTRtp#kETAZ(A_}z;n~V{T$#Rc2U2y0SkgztR{X1RS zOgKW&-A&QFAL+h3cwD-GtggMt<0X2#izFBrBdmZp%WQ=|4|K%5dU+U^t!4-d${b@a z)b#wK-9iMKe?M-}Qhuc$T)VDLA|*hGGcPkV@6&wSR}jBc!#(lG1~m#%+e*ggv8wjV z)gRum-mcT{aeQ;+Iq^%3?Wg<+ZTREe&caDy980@K%)MyfSGl0hQ2|CVvcosHM_)Ub4uQKdN^yK7(^Mk)5lSCOxSsd2d zzccP)1!nC}E0LddEvt-k%QG+L

    S?Z+3`Tw>+?TbMI*2Jk}HTAoA6WPkcE?b$Ld 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

    S?Z+3`Tw>+?TbMI*2Jk}HTAoA6WPkcE?b$Ld z?$pg^FW6?pD}~#(AMAG2lw!VkHGo##l7%Di9W2>>bJ!y0HszqiY-B7Habar#Mz}`Z zfpiYr?Z#q;YF%zQtyf+lw@kyVWMW;sBA>Jtbg0pQ?|nFV$Xi@=|f0jJv#Fdwx|AO4Eb9i&V|8CtNLz@Ee};}RgV(#s*+&@Q!m zHjL47VyaS?J z)+uYBs&{_yXI$~s!PEo?$B-7x2HP;vA!xVJpW_vaaO`5qQ)_-UZEOt2 z&MyW+C24xtul$&m3?Z$pSs@|0wI6I}e*wN#F1QcQHCHX;sh5_c*X>EPc(i6r*f@<9a<^fYV`N3#C0~^#g^| z8FOC*$Y>$cDrju$2l~xV!ib4)84;0m-8GElg1(mHrYAdLQOkil@-s^~q4h0CGQ7(4RvE&y9g`~P0T z+P2O4KQdtc-DZ!BE>jC?u2Q0Ga08Hhoqwb4THZ_NfG~#CqO9&2+eC?4_;R}soD11u zGNNi(b4D3wnua0N%P1`Qq>-t=%!pid17c7NN_XvP+_9rEGe)u5wtfXl%@jKgycSOErQ70J8KN$uNJF zIAVy67Eu$bUK+xKv7eUitv-8(x88so25D(Pjo+ zjW-?yhGO}1V~Z;>G9(e#=$jE*ro5I=FJO+Hedn$08pFdvnw|6-(-RM*f=#9?0$i!c wm~veTe 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 IBW4`*KLI$|MF0Q* diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/60pt@3x.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/60pt@3x.png deleted file mode 100644 index a094e8181b737a5a8194b9b0b638cb76b706533e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8163 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 IBW4`*KLI$|MF0Q* diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/76pt.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/76pt.png deleted file mode 100644 index ac5691fcb9582718914c0c10178a0b26aa3c54d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3307 zcmV

    5Q;P)#e)2akzP?SN8Ehyj~c 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 U2Bm8L_vpb=QBqedS1<|qA4Hhni2wiq diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/83,5pt@2x.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/83,5pt@2x.png deleted file mode 100644 index 183eb856f5e244f979f7c8800eeba4b25c5a3f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7822 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 UF9)3cL;o#09&)v>wew5*2e>8pJpcdz literal 0 HcmV?d00001 diff --git a/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/Icon-Light-1024x1024.png b/DuckDuckGo/Assets.xcassets/AppIcon.appiconset/Icon-Light-1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..dd13311edb7318491198caf5639f625772d938d7 GIT binary patch literal 49288 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 LhJ3ZGW%&O9*K7=v literal 0 HcmV?d00001 diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29 1.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29 1.png deleted file mode 100644 index 0904196f446a5f2f58132766b16a4e46cfbb852c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmV-G1Hb%pYF9EUyEUyU;4T&xKXZH_h{d-1j`S(n;uIuHxc4RyCj) zE0_x+R+$v#4?9*>*ZYTMre~KEXk9}yipH!y2ke*dWxM!5jq7w>OE_|n~ptu-A_j_|EfG@Vi!YP(@ zS$2okQ}Oe02HWlK2$9vpp8PcTrmTBMN5@-I;hV0gWnJMj=^I?3HL5g002g1Q7y9H{ ztA>V#UTAGN2hvbbynXUIl;TZ@pWv1hG|>Ly&dVw3<+j&yVxNj%cqeif>CpaWrc?>w zVl}a*^e`7|Dt=oEx>C+?s!Lo})cY>Pt)ZYm?Vwy{uw(WX=x0;k#zQv>#&j~5|vmXn|e{dfIO3nw` zVz+$z*ow&dwz|`o?rl4CYqQCQEw@eslxjHk@VWsKI|pr9)W5`bysDHK!=+sIu+1bz zNAsAps^m?si*T=Vm`C2*4&Q>tBkKknUOS+~b{vn#OEDaqZ$9bc=Wi9zP|aDKTb;eZ zc>!1}t!Dzd+IYcQ-IZH+KEU*sOzW$zGz=MziwwhMRC8w=qPV)cS}x#>jPI$U`hvpx zf?KlwTpu`lWNnWLp{k?74O1P18GM3E&SFGJNl{f@Yb{wl)F2#jkgG|H!r!IS`l=}n zzb`fv_hTWsFZex1RN_b?A%Tx!He5&n1dW(Jw5v*qvhnc$|4uhV_6R$bT(%(q0000< KMNUMnLSTXgXp|-Z diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29.png deleted file mode 100644 index 0904196f446a5f2f58132766b16a4e46cfbb852c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmV-G1Hb%pYF9EUyEUyU;4T&xKXZH_h{d-1j`S(n;uIuHxc4RyCj) zE0_x+R+$v#4?9*>*ZYTMre~KEXk9}yipH!y2ke*dWxM!5jq7w>OE_|n~ptu-A_j_|EfG@Vi!YP(@ zS$2okQ}Oe02HWlK2$9vpp8PcTrmTBMN5@-I;hV0gWnJMj=^I?3HL5g002g1Q7y9H{ ztA>V#UTAGN2hvbbynXUIl;TZ@pWv1hG|>Ly&dVw3<+j&yVxNj%cqeif>CpaWrc?>w zVl}a*^e`7|Dt=oEx>C+?s!Lo})cY>Pt)ZYm?Vwy{uw(WX=x0;k#zQv>#&j~5|vmXn|e{dfIO3nw` zVz+$z*ow&dwz|`o?rl4CYqQCQEw@eslxjHk@VWsKI|pr9)W5`bysDHK!=+sIu+1bz zNAsAps^m?si*T=Vm`C2*4&Q>tBkKknUOS+~b{vn#OEDaqZ$9bc=Wi9zP|aDKTb;eZ zc>!1}t!Dzd+IYcQ-IZH+KEU*sOzW$zGz=MziwwhMRC8w=qPV)cS}x#>jPI$U`hvpx zf?KlwTpu`lWNnWLp{k?74O1P18GM3E&SFGJNl{f@Yb{wl)F2#jkgG|H!r!IS`l=}n zzb`fv_hTWsFZex1RN_b?A%Tx!He5&n1dW(Jw5v*qvhnc$|4uhV_6R$bT(%(q0000< KMNUMnLSTXgXp|-Z diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@2x 1.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@2x 1.png deleted file mode 100644 index 7f792888f96373bd3e372ca58ace5f23ec53b894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1618 zcmV-Y2CeytP)lq5nAF;)7w@(stAY|A7z4VAP`;92 zM6op9+3sgXn!An^^ZN2zZl$Q1)LuvmO%eOZh2!aK93*_?L}jB5|` z_4s2)uR~dw|Ji1}vfo-gtaM$rvZmSR^yUBZ%za-C=j!sEi_VZ{bE|_AevP;g3<62E zIg)IBa!->*vNg8euj#o$ppwS$@bLHd_ww@ch;qd4?(ULoe96A#O_*15g0g0KtN-u6 z$-&>gw$xlaq0^;Nh-sbw<(a&<+^e6<_V)Jw{POAL^}4dq)X?9!tl7S_+5hI5|J-x` z(@mA3#sAe=^ujv6vftd_>soH5Ph+0Mz1qF9-l43^t+&xpI-*W?a;crk&dJ!Fb#`!8 zx5T^PxvttzZh1|zL*B1Rn~BW--+<||8Q9h1opp7Sf62(3SoQVwc3-%7%4}}OVUN^> zyydps*yqvg&3dtcY*VwHjL*rxFMcChh~7)YIDg`}@M=y-Bw@P+W(QW^_+(dW~xjnr~}MusTDhIY@77 zM0{F9oj*!wbi=*VWxQ8Pw>nOOWDYvg}TVva{*S2ljwr$(C@y~3kZaH;(W?yz+=6mRVNWMDgQ%SS`hy5s)S*vpZ zx?$F&{)Lw@5W%qaQS9LW&t=x8nIN6dYyhD5?1P!tft;nVFjh{;dyA}$2r-}hz?n)h zGu;lJVTsJ+&{IWB-B~{CY~85Mq>>hknC(td=afJ&Eha0EOz0|}dBLHFUAzVWzf^La z4KgFpgN1a%%_o+?BbMU4AhUoT=$?5k z!komy7^qJO>P^BngqT!0HS=b#58=n~i-i+=+WdRYY zqcM!wGyu%y5X6X9r*K3wei%1->Mc%*Ucz{C)6<5OUl`M`V6v?irW|#gs~&&CLLN~w zFk_|W!|K8*-6y;1DVqyWVIGs9=8=;|!sFlr;4oFVE0(x&M~6HT@=&i_<^CoY zW^IO72*mdiIY9>{^cv2ngUjqAvL3^i_&fc!$U{B-LHIl~RMp?w+JEMd^kN5OU`WLR zdP0MbwPLCgI_p-hOHxY*`-sX~%9%tx47pf14LJ3*HyC@fksK=CNjm#)^ouPCpDpK} zr{2#VBf4m8tYP$aqWO|r4W0^$opt3^S6}neb=Pmab)%}Px0N^2f<=pZ?`qcWrHWF? zHT~oHzDKcK6+Hfg(Are>Db_;NtTj=Crgahx`iguT&3G2epA**eFWBmfBHuDvplL+( zkgdL4ZhN5-u1!VRy?R3;KmV{ygdY(=Gy5yU0zncXCXEuZMy{0u# z?+@CK4b;Mtv2?(&ep-Vrj8nrDD^*%Sy;}3nzx=9czcrS#iKrJceuqc9!C|mJh??ef zijOAxlNG_rAwn+0*k2Xo&^VtJC%x9p=>WLC!F2z+mA8};_5EGS{wwzL4@~oo_>HZk Qs{jB107*qoM6N<$f+fpriU0rr diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@2x.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@2x.png deleted file mode 100644 index 7f792888f96373bd3e372ca58ace5f23ec53b894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1618 zcmV-Y2CeytP)lq5nAF;)7w@(stAY|A7z4VAP`;92 zM6op9+3sgXn!An^^ZN2zZl$Q1)LuvmO%eOZh2!aK93*_?L}jB5|` z_4s2)uR~dw|Ji1}vfo-gtaM$rvZmSR^yUBZ%za-C=j!sEi_VZ{bE|_AevP;g3<62E zIg)IBa!->*vNg8euj#o$ppwS$@bLHd_ww@ch;qd4?(ULoe96A#O_*15g0g0KtN-u6 z$-&>gw$xlaq0^;Nh-sbw<(a&<+^e6<_V)Jw{POAL^}4dq)X?9!tl7S_+5hI5|J-x` z(@mA3#sAe=^ujv6vftd_>soH5Ph+0Mz1qF9-l43^t+&xpI-*W?a;crk&dJ!Fb#`!8 zx5T^PxvttzZh1|zL*B1Rn~BW--+<||8Q9h1opp7Sf62(3SoQVwc3-%7%4}}OVUN^> zyydps*yqvg&3dtcY*VwHjL*rxFMcChh~7)YIDg`}@M=y-Bw@P+W(QW^_+(dW~xjnr~}MusTDhIY@77 zM0{F9oj*!wbi=*VWxQ8Pw>nOOWDYvg}TVva{*S2ljwr$(C@y~3kZaH;(W?yz+=6mRVNWMDgQ%SS`hy5s)S*vpZ zx?$F&{)Lw@5W%qaQS9LW&t=x8nIN6dYyhD5?1P!tft;nVFjh{;dyA}$2r-}hz?n)h zGu;lJVTsJ+&{IWB-B~{CY~85Mq>>hknC(td=afJ&Eha0EOz0|}dBLHFUAzVWzf^La z4KgFpgN1a%%_o+?BbMU4AhUoT=$?5k z!komy7^qJO>P^BngqT!0HS=b#58=n~i-i+=+WdRYY zqcM!wGyu%y5X6X9r*K3wei%1->Mc%*Ucz{C)6<5OUl`M`V6v?irW|#gs~&&CLLN~w zFk_|W!|K8*-6y;1DVqyWVIGs9=8=;|!sFlr;4oFVE0(x&M~6HT@=&i_<^CoY zW^IO72*mdiIY9>{^cv2ngUjqAvL3^i_&fc!$U{B-LHIl~RMp?w+JEMd^kN5OU`WLR zdP0MbwPLCgI_p-hOHxY*`-sX~%9%tx47pf14LJ3*HyC@fksK=CNjm#)^ouPCpDpK} zr{2#VBf4m8tYP$aqWO|r4W0^$opt3^S6}neb=Pmab)%}Px0N^2f<=pZ?`qcWrHWF? zHT~oHzDKcK6+Hfg(Are>Db_;NtTj=Crgahx`iguT&3G2epA**eFWBmfBHuDvplL+( zkgdL4ZhN5-u1!VRy?R3;KmV{ygdY(=Gy5yU0zncXCXEuZMy{0u# z?+@CK4b;Mtv2?(&ep-Vrj8nrDD^*%Sy;}3nzx=9czcrS#iKrJceuqc9!C|mJh??ef zijOAxlNG_rAwn+0*k2Xo&^VtJC%x9p=>WLC!F2z+mA8};_5EGS{wwzL4@~oo_>HZk Qs{jB107*qoM6N<$f+fpriU0rr diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@3x.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/29@3x.png deleted file mode 100644 index 41f1b91565b3e4bd80c2edbf57126ab1f04431a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2258 zcmV;@2rc)CP)nbfnT*^+LeaDl3$%u5n>F4j~t>$-{17~^qGmp+t=oOWxnO(>izxwY*Mn+(BI?X=!bH{V@R*w z-Q>^A+w=AKxWL%N%iibe^6c#Fp{&e)jkt1xvbn+7p{&cTx6+B1zQxGky0Xw)Zl%!G z<>TYy-r4Wy=;+?q?~Z-I+~4bnDX-SeT}$gd8=l4tBIGtXLziYp~c0^-j|2N z>FMc}qQzW1p^|KTvx#S&b#>|G^@n4GzLH?{!aM)WGlp`!|NQd*_~nRcoztaJzLH;T zQ?uRO-T(5;|Kg1Q)>;44P3gHpXGWU;`Q`uFX3WRd|I$r;S&Ol#&HwDP$(vYmS-Jn* zbM(SG|K*v)6>85f|lisgMsDEz%-+=$nK;hxxV@I!hRfVsBS=ppD z@3tfPz8Y~%j!`lq*_2ts-&QL>}O{q$JUkwlp0ssI2ZBz_SJP02c1IwBgw%)HuwK#dp zZM@~S>G$WP+ni&yH!iMJ4LcJ zaZQee$a_AjEkCO+OtC|+fmuE<2Rx`NL9Q@Om{=ef1F6`fN3=IWuQE-KUdoyk!sNX~ zu`@=qHcGcT^ZN2Zt}#}$M@X$XK&>x6p)^8@OH5FSNnd(HgHk@BGevz{>9QDNx>Q21 zF>SqI=k(>y>B{Ex|Z6_WlQL3`-bCYj*VgPXUcXG#U_LLKzoA za3+;D@CvE1R1BfcoLp*|n1=aq!pcR0N9S*Mkhq(Ni&gy$XRO?fdm2*Cu<$_F{ArvE z>0_y}ckFA?nlRb?-ZlB2#qhB>rsG`cBJpxv!E^I&2o7ir=5| zvfyuAiGg@AR+*WZnVGqD-#aQZGs7{%$3AzH`&n|v&}jpP{aYSswT?$DyStoRf3?b* zl8$)w z>Fw(uVA$@#&Y|IvX9nz(?v55y$JpRFb&ypy0sCwkwLDTXK{PNW|Ld={UCklr~;QI(ABECHr;C4ta2K2E(ia_HvqEKva65lSLSDYbT z|F4^I|JPro{RD|oo? z4NhDFL4TrT+Cml<6=%udj@uQ)^2+KOU%*h})-6%YOau}&7>rdBEN^UXZEtV$HsHf` zEw*>6$WFU^`zxyl+e(M#2qFz|$-+H4mc94n^z8ge+d>zYlHkrQIWA(a!>hhl1jMy@py3YG&>H0riD-1D`!R>G#Ib%`1t`FAuHmK zQNdhEjz1tGc==mb)VjaznALg{Q5?h%zPLMA=!^6QyXP5r5G?tpad%g=?p~aFi(862 zJOHzjZ#Nq|z0cGozi%=*I=X-x`MrA0U?ijAnn`>-<29@u!H_2YR_U|ZLM2(v_?go% z0=88>=hz)i7rwZSq{`#14c@FfuOHI|yj}L{b2^=VU`bRU7@`n9h`e?07yHWs4hv8u z8kMSD1NrHA%MDIHb4|i$y~b1bKjH$ z#;Ipm;f}~(M)5Jm*f=;7sZ={bieDP9GrTvHfm<%CekbKGck$yr#th)VXD31T6|SLv zsi6U%$5ejsQ1L7CA0h6?jCqKjfE(0uJ*zTm;NAOT zae4WJyvBZ%@(sv5bvzij`Y6frS!^1gX8NW-f6?7G$K~hWi7#JE+;Og^N!YkWJpNq} z<`yTv74?_5tMWLT5N&_Q*B>Dw6GwZrUTHE;VagTf^ott06ARH#82+A4wg*#Cj;vgj z-)6bVI1=vBZAPoMY}31pWLOA}EB< zUj9CDd(HlLGXvN|s*EC*Ut6}F5%fBmEWZ7 gZ&w>qnrf=4|Dq=}oA5=b8~^|S07*qoM6N<$f&>+ysQ>@~ diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/40 1.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/40 1.png deleted file mode 100644 index 5107820e2ccd1b21a993cf8d0d4c21cdd7c855e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1094 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 KMNUMnLSTZ=?(0SX diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/50.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/50.png deleted file mode 100644 index 19215d311cae131f7164567f720343d9d32996b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmV;U1zh@xP)E-kQ002z7JX}An-r4SbWxvzR>C?;Uv!&URf61tr)Mrez-r4V+i_fTk zZqubv@3te^q&3>67rKd19~cAgwIh;jeDd=0zOvt3JD_Gnmwjcv^Y!@u(@oyk?`KT2 zyN(q5`}?bc693FIy|UlPzvRA>VC1bVT0N{wxjUtJVo0?(opp9zND8gD(&_2xa#*<# z3<7dbll}eum7&F{*rSYV5C7I#vx#T+_V%cm)am!4*}byf|Ia|3b#-i0v+3pamxsgW>hj6HB98;^Kp8fP+W&xJfTgPSBG@IPi26Ha=hE%?Eldx52>BWO`uRju{2}4RZp}(TDeL_bz}eE zfSY#^^ZN2cu`^k>O55(&a#^|G-`}?0ugaPgAQ%K~R1Al5#4aQSZBq=KcM+R+5s+td znr~|9xk8(8YNdE#BR9^C0009LNklF%mh$}C;&)hKA%t0i<WotZmiy})flCOmz-cW6lGP&zQxeR0L3MAk2yXRkF@f>6wqv$a#Sjz_Dc@v#8`xx@ zJEg+zLV;OqUTX(RV1o_uL$M7Bg0)#ID%rudl_s(Bh53}&o!Pgk7St)^mAO48a&Yb% zdt_DUStbz+VaDdOlUAD&(1&$3JI7#_OZH?wtGKD}%Apd-YiCzWth#!)`C_|G;K;IB zU~1Fn{iV99b;bB(+>nOnO=5fXlx8m_E(i_t>VSzXVZfejHX6vj&jfuhbS8`-F zacX(k?IV-NUNVr|tPA(!{*fd3!LDyNkbC`%`Rj>jG+I{|+sjuZC=Axm%Tr+LnNl7< z*2P!XLtIyG9lv1Gb1egPbptKu`I8+!!DkSP#V`O<2MU|&5fiB*)e+4rh5-n3;!GS3 zWeyWT{`?I*Vj;#|zx(0w6No4K`jQi0ATAW!P+D$<8HC{r7l+}}%p67#HZ=<4o^zkR3el|A7 zkVylPIpXvt1z4E&FTZO3`WpcFmOZG)2_300kOT)D|33}iLGSm#WNc9r{vgXqZ2eLG zDTyiaZ-oi~q#WNF`m;Y!n88*#{mZYv$@1^=pn3 diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/50@2x.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/50@2x.png deleted file mode 100644 index 07ccfd7d363c9a7a301c49ca095877dafede9b0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2993 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 F@jp(F9Mu2- diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/60@3x.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/60@3x.png deleted file mode 100644 index bfc30c8ba7bdbe10b9a2eb2ac4040faaa456e0f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5247 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 F@jp(F9Mu2- diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/76.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/76.png deleted file mode 100644 index 7cceafaec63309d80b0887352b0f0e5e030d5d8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2101 zcmV-52+H?~P)E-mkvfuRb`dmM*sF>6M004buzLI~*)6D68Wxunf*+W^F(ADK|I9OIMw(|#v(wAzFLS7lF=HO$A>t+&#s znbdNEv06Q>`1ttF>B@y(e28+yzLH?Qvfq$rbPx;zsh!D;YY$^buk^w@-{0Rxvo`kj z_WS$$>A6BhvNh?l8GT<3$-m{CcMzz5Zt(E%lYhz7)7qVk&+oP)ZBq+=jkxIO=;!q1 zeQ3FCQ?v8>@}aED?(Xin!Pu3d#j&W()1^^MxjR3rF5KVi@3kXxSh{jglRhv9mxsgu z@4u^p5=gZ;$-m^Kcwy}9?8Cd+|K*vbcw+ti{l1c4QA3-viDycE-o9uQIZx z*>YLA|J-xl+3$2+wzH<$>9QDONUvQ-3WsvTj(x!Y^31P+S^v{b|NQdX*5&{C<^S1c z=jQGI_1TAGgvGzr^Y!`j_4tx(eBQ50Q97cDm%jhcK#+aMsGHAEZh8OanUjIUP*je~ znia^KSk1-bxUAWdY<*3sO5U$Yn{aEFh{KxLk;m!6>G$W{;OtOkfKPUFg>t=3m{(1q zP@Rj;TW+OJkY3i(;oI-nkJN>SVuZWowTsVzNw+yovO`a9dQLnDZBqX zy0F&i)wO1LtGVK{Ph_7^Oq7+O#><)(>GtM@UVXU1*yOA%XLzhcu{1%gFif#SppwR| zw$ehcGTY$ndCP4*sVuL6SxK%yV!Bj8t}tP_Q$DIKKA|*4bz)9InMh`GLW)b%vV)P% zh)1+HO0PS@!VZeQxHQTs)`ht?E7<(kuGtLoe{D#R?#bC+sN5=)K9? zUJOYT`+DWm-JZBW$*)n>%uFTWbMLcjx(0}*=B?5V|EjzijoSB3=cQ$2dI`q>mFisS zcX$YzG>1-v1gUO+Jv~=2R+h>J&Fhr3CgIfp6fa4MTLIA0Xw@AHE7rp~YB;Pqyt=r! zjQ}t;9hZYpE*K3l28pY5^lbB*u0jRk49c*xrR+4Q87}>jOCR0RTssC3#m=Usn1ZfQ zmr3VU4PDe$po?va{f6LvZDi~RpL=3gie5dqZ}x$)4c&NL6PPH4f==vXQvfWd?yxOm zfI;JJE&#=LD^!c?7hn+2K?Rs@S6GJWx*d2tqVa2bkA)4z9$DUKYb$YyCh8_U`AlKe z0D-EG1*d_*fIXJGdW@0LZh*s;Qvu$*K}C=h-tYInXle7TStZ~TEr-fYSRp3!8UQ) zU{MJrch|sZLa>*cz+T8CCc{HO30w!fEIW7Ch)5)oYwQ7c*nyFe5PO=AJ?W?z<>lp{ z4ZI>k8OtQZlGJ!>Etsr3A;K{>YVJl)vL&0r;Cx;+VsbV~DVu1Otu?o{oGWTzT{bg2 zR>qHH?npy+V7!*q(cBnO6xl9K>@LD1P6+YQ<76^) zwy_pxGt(0tCx`H$n;dC|_D_Vew2tPL9nC$xZt}_8K~HtUhFjKl-7%45E@n=3hWK(c znKlIsj^CQ3+mW5}awLwVyL?GCSb1#6841(U$x${RpXe_4aG{xaF|E~f&-h2H=oP{) z$2{CL11^?|D|50WDJy3%3f$t?frAfCEPHN-6ekOH0(6aiyA5py6Lb1!;^%0|!ZxAp z7JxxEp&3Q*yzO#Awn<1)>H0FMbUoVMwtKm_teZBPd$XK(pL`)1jDm~moybh5a{}7> zi)1eLSvhSXN}jm$>T9mW@3Yt6@cqu4Wcg-7F!{0}s3{wUzQa+rvO;9@VFhexcZ`ye zH}AejM($lE%lFg59&kDz#Lq)98S=2*1G(LhJrddu{ZNLCqo3XT$?{VqN0JW3lAb}y zgt#on_UYbkhE~hU{KKl3{6g%I?ZRS}800000NkvXXu0mjfYhF|} diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/76@2x.png b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/76@2x.png deleted file mode 100644 index 8e1caa7049010ccb8a985f0f9f070d7b4ae807d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4460 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 Nfb`8Cl;3+6@gI@KpTYnD diff --git a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/Contents.json b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/Contents.json index 186dd9b2f0..cff1680b35 100644 --- a/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/Contents.json +++ b/DuckDuckGo/Assets.xcassets/DDG-AppIcon-Alpha.appiconset/Contents.json @@ -1,322 +1,9 @@ { "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "29.png", - "idiom" : "iphone", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "1x", - "size" : "57x57" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "57x57" - }, - { - "filename" : "60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "29 1.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "29@2x 1.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "40 1.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "40@2x 1.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "50.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "50x50" - }, - { - "filename" : "50@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "50x50" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "72x72" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "72x72" - }, - { - "filename" : "76.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "83-5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "60@2x 1.png", - "idiom" : "car", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "60@3x 1.png", - "idiom" : "car", - "scale" : "3x", - "size" : "60x60" - }, { "filename" : "1024.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - }, - { - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "24x24", - "subtype" : "38mm" - }, - { - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "27.5x27.5", - "subtype" : "42mm" - }, - { - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "watch", - "role" : "companionSettings", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "watch", - "role" : "notificationCenter", - "scale" : "2x", - "size" : "33x33", - "subtype" : "45mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "40x40", - "subtype" : "38mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "44x44", - "subtype" : "40mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "46x46", - "subtype" : "41mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "50x50", - "subtype" : "44mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "51x51", - "subtype" : "45mm" - }, - { - "idiom" : "watch", - "role" : "appLauncher", - "scale" : "2x", - "size" : "54x54", - "subtype" : "49mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "86x86", - "subtype" : "38mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "98x98", - "subtype" : "42mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "108x108", - "subtype" : "44mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "117x117", - "subtype" : "45mm" - }, - { - "idiom" : "watch", - "role" : "quickLook", - "scale" : "2x", - "size" : "129x129", - "subtype" : "49mm" - }, - { - "idiom" : "watch-marketing", - "scale" : "1x", + "idiom" : "universal", + "platform" : "ios", "size" : "1024x1024" } ], diff --git a/DuckDuckGo/Info.plist b/DuckDuckGo/Info.plist index 6d3941b0ca..9650027667 100644 --- a/DuckDuckGo/Info.plist +++ b/DuckDuckGo/Info.plist @@ -21,49 +21,39 @@ CFBundleAlternateIcons - black + AppIcon-black CFBundleIconFiles - AppIconBlack29x29 - AppIconBlack40x40 - AppIconBlack60x60 + AppIcon-black - blue + AppIcon-blue CFBundleIconFiles - AppIconBlue29x29 - AppIconBlue40x40 - AppIconBlue60x60 + AppIcon-blue - green + AppIcon-green CFBundleIconFiles - AppIconGreen29x29 - AppIconGreen40x40 - AppIconGreen60x60 + AppIcon-green - purple + AppIcon-purple CFBundleIconFiles - AppIconPurple29x29 - AppIconPurple40x40 - AppIconPurple60x60 + AppIcon-purple - yellow + AppIcon-yellow CFBundleIconFiles - AppIconYellow29x29 - AppIconYellow40x40 - AppIconYellow60x60 + AppIcon-yellow @@ -81,44 +71,39 @@ CFBundleAlternateIcons - black + AppIcon-black CFBundleIconFiles - AppIconBlack76x76 - AppIconBlack83.5x83.5 + AppIcon-black - blue + AppIcon-green CFBundleIconFiles - AppIconBlue76x76 - AppIconBlue83.5x83.5 + AppIcon-blue - green + AppIcon-green CFBundleIconFiles - AppIconGreen76x76 - AppIconGreen83.5x83.5 + AppIcon-green - purple + AppIcon-purple CFBundleIconFiles - AppIconPurple76x76 - AppIconPurple83.5x83.5 + AppIcon-purple - yellow + AppIcon-yellow CFBundleIconFiles - AppIconYellow76x76 - AppIconYellow83.5x83.5 + AppIcon-yellow From 7d77c7d931fb19e976fb5621c112d11a7103c450 Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Mon, 9 Dec 2024 13:36:54 -0300 Subject: [PATCH 17/66] AI Chat Entry point B - Address bar (#3694) Task/Issue URL: https://app.asana.com/0/1204167627774280/1208794359260769/f **Description**: Add AI Chat to the Omnibar accessory button --- DuckDuckGo.xcodeproj/project.pbxproj | 8 ++ DuckDuckGo/AIChat/AIChatSettings.swift | 56 ++++++++-- .../AIChat/OmnibarAccessoryHandling.swift | 38 +++++++ DuckDuckGo/Base.lproj/OmniBar.xib | 15 +-- DuckDuckGo/LargeOmniBarState.swift | 12 +-- DuckDuckGo/MainViewController.swift | 94 ++++++++++------ DuckDuckGo/OmniBar.swift | 37 +++++-- DuckDuckGo/OmniBarDelegate.swift | 12 +-- DuckDuckGo/OmniBarState.swift | 2 +- DuckDuckGo/SettingsAIChatView.swift | 12 ++- DuckDuckGo/SettingsMainSettingsView.swift | 2 +- DuckDuckGo/SettingsState.swift | 14 ++- DuckDuckGo/SettingsViewModel.swift | 16 ++- DuckDuckGo/SmallOmniBarState.swift | 14 +-- DuckDuckGo/SwipeTabsCoordinator.swift | 10 +- ...bViewControllerBrowsingMenuExtension.swift | 2 +- DuckDuckGo/UniversalOmniBarState.swift | 2 +- DuckDuckGo/UserText.swift | 1 + DuckDuckGo/en.lproj/Localizable.strings | 3 + .../AIChat/AIChatSettingsTests.swift | 92 ++++++++++++++-- .../AIChat/OmnibarAccessoryHandlerTests.swift | 100 ++++++++++++++++++ DuckDuckGoTests/LargeOmniBarStateTests.swift | 22 ++-- .../OmniBarEqualityCheckTests.swift | 4 +- DuckDuckGoTests/SmallOmniBarStateTests.swift | 22 ++-- .../Public API/AIChatSettingsProvider.swift | 21 ++-- 25 files changed, 480 insertions(+), 131 deletions(-) create mode 100644 DuckDuckGo/AIChat/OmnibarAccessoryHandling.swift create mode 100644 DuckDuckGoTests/AIChat/OmnibarAccessoryHandlerTests.swift diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 95347ae79f..65b869efe7 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -139,6 +139,7 @@ 310E79BD2949CAA5007C49E8 /* FireButtonReferenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310E79BC2949CAA5007C49E8 /* FireButtonReferenceTests.swift */; }; 310ECFDD282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310ECFDC282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift */; }; 310EEA2F2CFFCDC60043CA1A /* AIChatSettingsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310EEA2E2CFFCDBF0043CA1A /* AIChatSettingsTests.swift */; }; + 311711912D00E5500063AC3D /* OmnibarAccessoryHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311711902D00E53A0063AC3D /* OmnibarAccessoryHandling.swift */; }; 311BD1AD2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311BD1AC2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift */; }; 311BD1AF2836BB4200AEF6C1 /* AutofillItemsLockedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311BD1AE2836BB4200AEF6C1 /* AutofillItemsLockedView.swift */; }; 311BD1B12836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311BD1B02836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift */; }; @@ -200,6 +201,7 @@ 31DE43C42C2C60E800F8C51F /* DuckPlayerModalPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DE43C32C2C60E800F8C51F /* DuckPlayerModalPresenter.swift */; }; 31DE43C62C2DA70A00F8C51F /* DuckPlayer-ModalAnimation.json in Resources */ = {isa = PBXBuildFile; fileRef = 31DE43C52C2DA70A00F8C51F /* DuckPlayer-ModalAnimation.json */; }; 31E69A63280F4CB600478327 /* DuckUI in Frameworks */ = {isa = PBXBuildFile; productRef = 31E69A62280F4CB600478327 /* DuckUI */; }; + 31E77B272D038BBC006F1C9F /* OmnibarAccessoryHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31E77B262D038BB9006F1C9F /* OmnibarAccessoryHandlerTests.swift */; }; 31EF52E1281B3BDC0034796E /* AutofillLoginListItemViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31EF52E0281B3BDC0034796E /* AutofillLoginListItemViewModel.swift */; }; 3712091E2C21E390003ADF3D /* RemoteMessagingStoreErrorHandling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3712091D2C21E390003ADF3D /* RemoteMessagingStoreErrorHandling.swift */; }; 372A0FF02B2389590033BF7F /* SyncMetricsEventsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372A0FEF2B2389590033BF7F /* SyncMetricsEventsHandler.swift */; }; @@ -1463,6 +1465,7 @@ 310E79BC2949CAA5007C49E8 /* FireButtonReferenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FireButtonReferenceTests.swift; sourceTree = ""; }; 310ECFDC282A8BB0005029B3 /* EnableAutofillSettingsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnableAutofillSettingsTableViewCell.swift; sourceTree = ""; }; 310EEA2E2CFFCDBF0043CA1A /* AIChatSettingsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatSettingsTests.swift; sourceTree = ""; }; + 311711902D00E53A0063AC3D /* OmnibarAccessoryHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OmnibarAccessoryHandling.swift; sourceTree = ""; }; 311BD1AC2836BB3900AEF6C1 /* AutofillItemsEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillItemsEmptyView.swift; sourceTree = ""; }; 311BD1AE2836BB4200AEF6C1 /* AutofillItemsLockedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillItemsLockedView.swift; sourceTree = ""; }; 311BD1B02836C0CA00AEF6C1 /* AutofillLoginListAuthenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginListAuthenticator.swift; sourceTree = ""; }; @@ -1524,6 +1527,7 @@ 31DE43C12C2C480D00F8C51F /* DuckPlayerFeaturePresentationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DuckPlayerFeaturePresentationView.swift; sourceTree = ""; }; 31DE43C32C2C60E800F8C51F /* DuckPlayerModalPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DuckPlayerModalPresenter.swift; sourceTree = ""; }; 31DE43C52C2DA70A00F8C51F /* DuckPlayer-ModalAnimation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "DuckPlayer-ModalAnimation.json"; sourceTree = ""; }; + 31E77B262D038BB9006F1C9F /* OmnibarAccessoryHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OmnibarAccessoryHandlerTests.swift; sourceTree = ""; }; 31EF52E0281B3BDC0034796E /* AutofillLoginListItemViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginListItemViewModel.swift; sourceTree = ""; }; 3712091D2C21E390003ADF3D /* RemoteMessagingStoreErrorHandling.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteMessagingStoreErrorHandling.swift; sourceTree = ""; }; 372A0FEF2B2389590033BF7F /* SyncMetricsEventsHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncMetricsEventsHandler.swift; sourceTree = ""; }; @@ -3528,6 +3532,7 @@ 310EEA2D2CFFCDB60043CA1A /* AIChat */ = { isa = PBXGroup; children = ( + 31E77B262D038BB9006F1C9F /* OmnibarAccessoryHandlerTests.swift */, 310EEA2E2CFFCDBF0043CA1A /* AIChatSettingsTests.swift */, ); path = AIChat; @@ -3536,6 +3541,7 @@ 311C79E22CF790270021196A /* AIChat */ = { isa = PBXGroup; children = ( + 311711902D00E53A0063AC3D /* OmnibarAccessoryHandling.swift */, 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */, 316AA4592CF8E31F00A2ED28 /* AIChatSettings.swift */, ); @@ -7774,6 +7780,7 @@ 98F78B8E22419093007CACF4 /* ThemableNavigationController.swift in Sources */, CBD4F140279EBFB300B20FD7 /* SwiftUICollectionViewCell.swift in Sources */, 31CC224928369B38001654A4 /* AutofillLoginSettingsListViewController.swift in Sources */, + 311711912D00E5500063AC3D /* OmnibarAccessoryHandling.swift in Sources */, F1D796EC1E7AB8930019D451 /* SaveBookmarkActivity.swift in Sources */, F4B0B78C252CAFF700830156 /* OnboardingWidgetsViewController.swift in Sources */, 7BFD5FD52C9DA310000FF959 /* VPNAddWidgetTip.swift in Sources */, @@ -8171,6 +8178,7 @@ 9F6933192C59BB0300CD6A5D /* OnboardingPixelReporterMock.swift in Sources */, CBC88EE12C7F834300F0F8C5 /* SpecialErrorPageUserScriptTests.swift in Sources */, 56D0602D2C383FD2003BAEB5 /* OnboardingSuggestedSearchesProviderTests.swift in Sources */, + 31E77B272D038BBC006F1C9F /* OmnibarAccessoryHandlerTests.swift in Sources */, 569437242BDD405400C0881B /* SyncBookmarksAdapterTests.swift in Sources */, 858479CD2B87964500D156C1 /* HistoryManagerTests.swift in Sources */, CBCCF96828885DEE006F4A71 /* AppPrivacyConfigurationTests.swift in Sources */, diff --git a/DuckDuckGo/AIChat/AIChatSettings.swift b/DuckDuckGo/AIChat/AIChatSettings.swift index 6a0b1e3706..e45021d903 100644 --- a/DuckDuckGo/AIChat/AIChatSettings.swift +++ b/DuckDuckGo/AIChat/AIChatSettings.swift @@ -30,6 +30,7 @@ struct AIChatSettings: AIChatSettingsProvider { var defaultValue: String { switch self { + /// https://app.asana.com/0/1208541424548398/1208567543352020/f case .aiChatURL: return "https://duckduckgo.com/?q=DuckDuckGo+AI+Chat&ia=chat&duckai=4" } } @@ -41,11 +42,14 @@ struct AIChatSettings: AIChatSettingsProvider { } private let internalUserDecider: InternalUserDecider private let userDefaults: UserDefaults + private let notificationCenter: NotificationCenter - init(privacyConfigurationManager: PrivacyConfigurationManaging, internalUserDecider: InternalUserDecider, userDefaults: UserDefaults = .standard) { + init(privacyConfigurationManager: PrivacyConfigurationManaging, internalUserDecider: InternalUserDecider, userDefaults: UserDefaults = .standard, + notificationCenter: NotificationCenter = .default) { self.internalUserDecider = internalUserDecider self.privacyConfigurationManager = privacyConfigurationManager self.userDefaults = userDefaults + self.notificationCenter = notificationCenter } // MARK: - Public @@ -58,26 +62,47 @@ struct AIChatSettings: AIChatSettingsProvider { } var isAIChatBrowsingMenuUserSettingsEnabled: Bool { - userDefaults.showAIChatBrowsingMenu + userDefaults.showAIChatBrowsingMenu && isAIChatBrowsingMenubarShortcutFeatureEnabled + } + + var isAIChatAddressBarUserSettingsEnabled: Bool { + userDefaults.showAIChatAddressBar && isAIChatAddressBarShortcutFeatureEnabled } var isAIChatFeatureEnabled: Bool { privacyConfigurationManager.privacyConfig.isEnabled(featureKey: .aiChat) || internalUserDecider.isInternalUser } - var isAIChatBrowsingToolbarShortcutFeatureEnabled: Bool { - let isBrowsingToolbarShortcutFeatureFlagEnabled = privacyConfigurationManager.privacyConfig.isSubfeatureEnabled(AIChatSubfeature.browsingToolbarShortcut) - let isInternalUser = internalUserDecider.isInternalUser - let isFeatureEnabled = isBrowsingToolbarShortcutFeatureFlagEnabled || isInternalUser - return isFeatureEnabled && isAIChatBrowsingMenuUserSettingsEnabled + var isAIChatAddressBarShortcutFeatureEnabled: Bool { + return isFeatureEnabled(for: .addressBarShortcut) + } + + var isAIChatBrowsingMenubarShortcutFeatureEnabled: Bool { + return isFeatureEnabled(for: .browsingToolbarShortcut) } func enableAIChatBrowsingMenuUserSettings(enable: Bool) { userDefaults.showAIChatBrowsingMenu = enable + triggerSettingsChangedNotification() + } + + func enableAIChatAddressBarUserSettings(enable: Bool) { + userDefaults.showAIChatAddressBar = enable + triggerSettingsChangedNotification() } // MARK: - Private + private func triggerSettingsChangedNotification() { + notificationCenter.post(name: .aiChatSettingsChanged, object: nil) + } + + private func isFeatureEnabled(for subfeature: AIChatSubfeature) -> Bool { + let isSubfeatureFlagEnabled = privacyConfigurationManager.privacyConfig.isSubfeatureEnabled(subfeature) + let isInternalUser = internalUserDecider.isInternalUser + return (isSubfeatureFlagEnabled || isInternalUser) + } + private func getSettingsData(_ value: SettingsValue) -> String { if let value = remoteSettings[value.rawValue] as? String { return value @@ -91,9 +116,11 @@ struct AIChatSettings: AIChatSettingsProvider { private extension UserDefaults { enum Keys { static let showAIChatBrowsingMenu = "aichat.settings.showAIChatBrowsingMenu" + static let showAIChatAddressBar = "aichat.settings.showAIChatAddressBar" } static let showAIChatBrowsingMenuDefaultValue = true + static let showAIChatAddressBarDefaultValue = true @objc dynamic var showAIChatBrowsingMenu: Bool { get { @@ -105,4 +132,19 @@ private extension UserDefaults { set(newValue, forKey: Keys.showAIChatBrowsingMenu) } } + + @objc dynamic var showAIChatAddressBar: Bool { + get { + value(forKey: Keys.showAIChatAddressBar) as? Bool ?? Self.showAIChatAddressBarDefaultValue + } + + set { + guard newValue != showAIChatAddressBar else { return } + set(newValue, forKey: Keys.showAIChatAddressBar) + } + } +} + +public extension NSNotification.Name { + static let aiChatSettingsChanged = Notification.Name("com.duckduckgo.aichat.settings.changed") } diff --git a/DuckDuckGo/AIChat/OmnibarAccessoryHandling.swift b/DuckDuckGo/AIChat/OmnibarAccessoryHandling.swift new file mode 100644 index 0000000000..0aab700967 --- /dev/null +++ b/DuckDuckGo/AIChat/OmnibarAccessoryHandling.swift @@ -0,0 +1,38 @@ +// +// OmnibarAccessoryHandling.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import AIChat + +protocol OmnibarAccessoryHandling { + func omnibarAccessory(for url: URL?) -> OmniBar.AccessoryType +} + +struct OmnibarAccessoryHandler: OmnibarAccessoryHandling { + let settings: AIChatSettingsProvider + + func omnibarAccessory(for url: URL?) -> OmniBar.AccessoryType { + guard settings.isAIChatFeatureEnabled, + settings.isAIChatAddressBarUserSettingsEnabled else { + return .share + } + + return (url?.isDuckDuckGoSearch == true) ? .chat : .share + } +} diff --git a/DuckDuckGo/Base.lproj/OmniBar.xib b/DuckDuckGo/Base.lproj/OmniBar.xib index 0cd7d0a6c2..96af3fcd2b 100644 --- a/DuckDuckGo/Base.lproj/OmniBar.xib +++ b/DuckDuckGo/Base.lproj/OmniBar.xib @@ -1,9 +1,9 @@ - + - + @@ -340,7 +340,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AutofillCredentialProvider/CredentialProvider/Shared/FaviconHelper.swift b/AutofillCredentialProvider/CredentialProvider/Shared/FaviconHelper.swift new file mode 100644 index 0000000000..b1d95ef7a8 --- /dev/null +++ b/AutofillCredentialProvider/CredentialProvider/Shared/FaviconHelper.swift @@ -0,0 +1,87 @@ +// +// FaviconHelper.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation +import Common +import Core +import UIKit + +struct FaviconHelper { + + static func loadImageFromCache(forDomain domain: String?, preferredFakeFaviconLetters: String) -> UIImage? { + guard let domain = domain, + let cacheUrl = FaviconsCacheType.fireproof.cacheLocation() else { return nil } + + let key = FaviconHasher.createHash(ofDomain: domain) + + // Slight leap here to avoid loading Kingfisher as a library for the widgets. + // Once dependency management is fixed, link it and use Favicons directly. + let imageUrl = cacheUrl.appendingPathComponent("com.onevcat.Kingfisher.ImageCache.fireproof").appendingPathComponent(key) + + guard let data = (try? Data(contentsOf: imageUrl)) else { + let image = Self.createFakeFavicon(forDomain: domain, size: 32, backgroundColor: UIColor.forDomain(domain), preferredFakeFaviconLetters: preferredFakeFaviconLetters) + return image + } + + return UIImage(data: data)?.toSRGB() + } + + private static func createFakeFavicon(forDomain domain: String, + size: CGFloat = 192, + backgroundColor: UIColor = UIColor.red, + bold: Bool = true, + preferredFakeFaviconLetters: String? = nil, + letterCount: Int = 2) -> UIImage? { + + let cornerRadius = size * 0.125 + let imageRect = CGRect(x: 0, y: 0, width: size, height: size) + let padding = size * 0.16 + let labelFrame = CGRect(x: padding, y: padding, width: imageRect.width - (2 * padding), height: imageRect.height - (2 * padding)) + + let renderer = UIGraphicsImageRenderer(size: imageRect.size) + let icon = renderer.image { imageContext in + let context = imageContext.cgContext + + context.setFillColor(backgroundColor.cgColor) + context.addPath(CGPath(roundedRect: imageRect, cornerWidth: cornerRadius, cornerHeight: cornerRadius, transform: nil)) + context.fillPath() + + let label = UILabel(frame: labelFrame) + label.numberOfLines = 1 + label.adjustsFontSizeToFitWidth = true + label.minimumScaleFactor = 0.1 + label.baselineAdjustment = .alignCenters + label.font = bold ? UIFont.boldSystemFont(ofSize: size) : UIFont.systemFont(ofSize: size) + label.textColor = .white + label.textAlignment = .center + + if let preferedPrefix = preferredFakeFaviconLetters?.droppingWwwPrefix().prefix(letterCount).capitalized { + label.text = preferedPrefix + } else { + label.text = preferredFakeFaviconLetters?.capitalized ?? "#" + } + + context.translateBy(x: padding, y: padding) + + label.layer.draw(in: context) + } + + return icon.withRenderingMode(.alwaysOriginal) + } +} diff --git a/AutofillCredentialProvider/CredentialProvider/Shared/NibLoading.swift b/AutofillCredentialProvider/CredentialProvider/Shared/NibLoading.swift new file mode 100644 index 0000000000..af24b38f7c --- /dev/null +++ b/AutofillCredentialProvider/CredentialProvider/Shared/NibLoading.swift @@ -0,0 +1,34 @@ +// +// NibLoading.swift +// DuckDuckGo +// +// Copyright © 2017 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +protocol NibLoading { +} + +extension NibLoading where Self: UIView { + static func load(nibName: String) -> Self { + let nib = UINib(nibName: nibName, bundle: nil) + guard let view = nib.instantiate(withOwner: self, options: nil).first as? Self else { + fatalError("Error instantiating view") + } + view.autoresizingMask = [UIView.AutoresizingMask.flexibleWidth, UIView.AutoresizingMask.flexibleHeight] + return view + } +} diff --git a/AutofillCredentialProvider/Info.plist b/AutofillCredentialProvider/Info.plist index cb9ba8ea30..c00abcf6dc 100644 --- a/AutofillCredentialProvider/Info.plist +++ b/AutofillCredentialProvider/Info.plist @@ -12,6 +12,13 @@ $(PRODUCT_MODULE_NAME).CredentialProviderViewController ASCredentialProviderExtensionShowsConfigurationUI + ASCredentialProviderExtensionCapabilities + + ProvidesPasswords + + ProvidesTextToInsert + + NSExtensionPointIdentifier com.apple.authentication-services-credential-provider-ui diff --git a/AutofillCredentialProvider/bg.lproj/InfoPlist.strings b/AutofillCredentialProvider/bg.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/bg.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/bg.lproj/Localizable.strings b/AutofillCredentialProvider/bg.lproj/Localizable.strings new file mode 100644 index 0000000000..82a8dc2b8c --- /dev/null +++ b/AutofillCredentialProvider/bg.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Затваряне"; + +/* Done button title */ +"action.button.done" = "Готово"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Отваряне на DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Автоматичното попълване на пароли е активирано!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "устройство"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Отмени"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Отключете устройството, за да получите достъп до паролите"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Адрес на уебсайта"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Копиране на %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Адресът е копиран"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Бележките са копирани"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Паролата е копирана"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Потребителското име е копирано"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Скриване на паролата"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Последна актуализация %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Заглавие"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Бележки"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Парола"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Показване на паролата"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Потребителско име"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Паролите се съхраняват сигурно на Вашето устройство."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Все още няма запазени пароли"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Избиране на парола, която да бъде използвана за „%@“"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Търсене на пароли"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "за '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Няма резултати"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Предложения"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Пароли"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Задаване на парола на %@ за автоматично попълване на паролите за DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Изисква се парола на устройството"; + diff --git a/AutofillCredentialProvider/cs.lproj/InfoPlist.strings b/AutofillCredentialProvider/cs.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/cs.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/cs.lproj/Localizable.strings b/AutofillCredentialProvider/cs.lproj/Localizable.strings new file mode 100644 index 0000000000..230c19ae1c --- /dev/null +++ b/AutofillCredentialProvider/cs.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Zavřít"; + +/* Done button title */ +"action.button.done" = "Hotovo"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Otevřít DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatické vyplňování hesel je zapnuté."; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "zařízení"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhonu"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPadu"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Zrušit"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Pro přístup k heslům zařízení odemkni"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL webové stránky"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopírovat %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresa zkopírovaná"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Poznámky zkopírované"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Heslo zkopírované"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Uživatelské jméno zkopírované"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Skrýt heslo"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Poslední aktualizace %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Název"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Poznámky"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Heslo"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Zobrazit heslo"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Uživatelské jméno"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Hesla se bezpečně ukládají do tvého zařízení."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Zatím nemáš uložená žádná hesla"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Vyber si, které heslo použiješ pro účet %@"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Prohledat hesla"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "pro „%@“"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Žádné výsledky"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Navrhované"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Hesla"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Nastav si přístupový kód pro zařízení %@ a DuckDuckGo bude automaticky vyplňovat hesla."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Přístupový kód pro zařízení je povinný"; + diff --git a/AutofillCredentialProvider/da.lproj/InfoPlist.strings b/AutofillCredentialProvider/da.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/da.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/da.lproj/Localizable.strings b/AutofillCredentialProvider/da.lproj/Localizable.strings new file mode 100644 index 0000000000..49ea766df6 --- /dev/null +++ b/AutofillCredentialProvider/da.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Luk"; + +/* Done button title */ +"action.button.done" = "Færdig"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Åbn DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatisk udfyldning af adgangskoder er aktiveret!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "enhed"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Annullér"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Lås enheden op for at få adgang til adgangskoder"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL til webstedet"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopiér %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresse kopieret"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Noter kopieret"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Adgangskode kopieret"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Brugernavn kopieret"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Skjul adgangskode"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Sidst opdateret %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Titel"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Noter"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Adgangskode"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Vis adgangskode"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Brugernavn"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Adgangskoder gemmes sikkert på din enhed."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Ingen adgangskoder gemt endnu"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Vælg en adgangskode til \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Søg adgangskoder"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "for '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Ingen resultater"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Foreslået"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Adgangskoder"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Opret en adgangskode på %@ for automatisk at udfylde dine DuckDuckGo-adgangskoder."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Adgangskode til enheden påkrævet"; + diff --git a/AutofillCredentialProvider/de.lproj/InfoPlist.strings b/AutofillCredentialProvider/de.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/de.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/de.lproj/Localizable.strings b/AutofillCredentialProvider/de.lproj/Localizable.strings new file mode 100644 index 0000000000..e36875c16b --- /dev/null +++ b/AutofillCredentialProvider/de.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Schließen"; + +/* Done button title */ +"action.button.done" = "Fertig"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "DuckDuckGo öffnen"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatisches Ausfüllen von Passwörtern aktiviert!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "Gerät"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Abbrechen"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Gerät entsperren, um auf Passwörter zuzugreifen"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL der Website"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "%@ kopieren"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresse kopiert"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Notizen kopiert"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Passwort kopiert"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Benutzername kopiert"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Passwort ausblenden"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Zuletzt aktualisiert %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Titel"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Notizen"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Passwort"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Passwort anzeigen"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Benutzername"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Passwörter werden sicher auf deinem Gerät gespeichert."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Noch keine Passwörter gespeichert"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Wähle ein Passwort, das du für „%@“ verwendest"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Passwörter suchen"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "für „%@“"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Keine Ergebnisse"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Vorgeschlagen"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Passwörter"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Lege einen Passcode für dein %@ fest, um deine DuckDuckGo-Passwörter automatisch auszufüllen."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Geräte-Passcode erforderlich"; + diff --git a/AutofillCredentialProvider/el.lproj/InfoPlist.strings b/AutofillCredentialProvider/el.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/el.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/el.lproj/Localizable.strings b/AutofillCredentialProvider/el.lproj/Localizable.strings new file mode 100644 index 0000000000..cc073f02b6 --- /dev/null +++ b/AutofillCredentialProvider/el.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Κλείσιμο"; + +/* Done button title */ +"action.button.done" = "Ολοκληρώθηκε"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Άνοιγμα του DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Η Αυτόματη συμπλήρωση κωδικών πρόσβασης ενεργοποιήθηκε!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "συσκευή"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Ακύρωση"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Ξεκλειδώστε τη συσκευή για πρόσβαση σε κωδικούς πρόσβασης"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Διεύθυνση URL ιστότοπου"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Αντιγραφή %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Η διεύθυνση αντιγράφηκε"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Οι σημειώσεις αντιγράφηκαν"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Ο κωδικός πρόσβασης αντιγράφηκε"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Το όνομα χρήστη αντιγράφηκε"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Απόκρυψη κωδικού πρόσβασης"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Τελευταία ενημέρωση %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Τίτλος"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Σημειώσεις"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Κωδικός πρόσβασης"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Εμφάνιση κωδικού πρόσβασης"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Όνομα χρήστη"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Οι κωδικοί πρόσβασης αποθηκεύονται με ασφάλεια στη συσκευή σας."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Δεν έχουν αποθηκευτεί ακόμα κωδικοί πρόσβασης"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Επιλέξτε έναν κωδικό πρόσβασης για χρήση στο «%@»"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Αναζήτηση κωδικών πρόσβασης"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "για '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Κανένα αποτέλεσμα"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Προτεινόμενο"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Κωδικός πρόσβασης"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Ορίστε έναν κωδικό πρόσβασης στο %@ για αυτόματη συμπλήρωση των κωδικών πρόσβασης DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Απαιτείται κωδικός πρόσβασης συσκευής"; + diff --git a/AutofillCredentialProvider/es.lproj/InfoPlist.strings b/AutofillCredentialProvider/es.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/es.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/es.lproj/Localizable.strings b/AutofillCredentialProvider/es.lproj/Localizable.strings new file mode 100644 index 0000000000..572db888b4 --- /dev/null +++ b/AutofillCredentialProvider/es.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Cerrar"; + +/* Done button title */ +"action.button.done" = "Hecho"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Abrir DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "¡La función de autocompletar contraseñas está activada!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "dispositivo"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Cancelar"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Desbloquear dispositivo para acceder a contraseñas"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL del sitio web"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Copiar %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Dirección copiada"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Notas copiadas"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Contraseña copiada"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Nombre de usuario copiado"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Ocultar contraseña"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Última actualización % @"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Título"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Notas"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Contraseña"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Mostrar contraseña"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Nombre de usuario"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Las contraseñas se almacenan de forma segura en tu dispositivo."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Aún no hay contraseñas guardadas"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Elige una contraseña para \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Buscar contraseñas"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "para '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Sin resultados"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Sugerencias"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Contraseñas"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Configura un código de acceso en %@ para autocompletar tus contraseñas de DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Se requiere código de acceso del dispositivo"; + diff --git a/AutofillCredentialProvider/et.lproj/InfoPlist.strings b/AutofillCredentialProvider/et.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/et.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/et.lproj/Localizable.strings b/AutofillCredentialProvider/et.lproj/Localizable.strings new file mode 100644 index 0000000000..0e60b0e2e6 --- /dev/null +++ b/AutofillCredentialProvider/et.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Sulge"; + +/* Done button title */ +"action.button.done" = "Valmis"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Ava DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Paroolide automaatne täitmine on aktiveeritud!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "seade"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Tühista"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Paroolidele juurdepääsuks ava seade"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Veebisaidi URL"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopeeri %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Aadress on kopeeritud"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Märkmed on kopeeritud"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Parool on kopeeritud"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Kasutajanimi on kopeeritud"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Peida parool"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Viimati uuendatud %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Pealkiri"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Märkused"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Parool"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Kuva parool"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Kasutajanimi"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Paroolid salvestatakse turvaliselt sinu seadmesse."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Paroole ei ole veel salvestatud"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Valige salasõna, mida kasutada \"%@\" jaoks"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Otsi paroole"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "otsinguga '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Tulemusi pole"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Soovitatud"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Paroolid"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "DuckDuckGo paroolide automaatseks täitmiseks määrake saidile %@ pääsukood."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Nõutav seadme pääsukood"; + diff --git a/AutofillCredentialProvider/fi.lproj/InfoPlist.strings b/AutofillCredentialProvider/fi.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/fi.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/fi.lproj/Localizable.strings b/AutofillCredentialProvider/fi.lproj/Localizable.strings new file mode 100644 index 0000000000..6bbcdd63c0 --- /dev/null +++ b/AutofillCredentialProvider/fi.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Sulje"; + +/* Done button title */ +"action.button.done" = "Valmis"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Avaa DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Salasanojen automaattinen täyttö on nyt käytössä!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "laitteelle"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhonelle"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPadille"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Peruuta"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Avaa laitteen lukitus päästäksesi salasanoihin"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Sivuston URL-osoite"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopioi %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Osoite kopioitu"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Muistiinpanot kopioitu"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Salasana kopioitu"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Käyttäjätunnus kopioitu"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Piilota salasana"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Viimeksi päivitetty %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Otsikko"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Huomautukset"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Salasana"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Näytä salasana"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Käyttäjätunnus"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Salasanat tallennetaan laitteellesi turvallisesti."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Salasanoja ei ole vielä tallennettu"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Valitse sivuston salasana: %@"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Etsi salasanoja"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "kohteelle '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Ei tuloksia"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Ehdotettu"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Salasanat"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Jos haluat, että DuckDuckGo täyttää salasanasi automaattisesti, määritä pääsykoodi laitteessa %@."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Edellyttää laitteen pääsykoodia"; + diff --git a/AutofillCredentialProvider/fr.lproj/InfoPlist.strings b/AutofillCredentialProvider/fr.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/fr.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/fr.lproj/Localizable.strings b/AutofillCredentialProvider/fr.lproj/Localizable.strings new file mode 100644 index 0000000000..8f01a4e036 --- /dev/null +++ b/AutofillCredentialProvider/fr.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Fermer"; + +/* Done button title */ +"action.button.done" = "Terminé"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Ouvrir DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Saisie automatique des mots de passe activée !"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "appareil"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Annuler"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Déverrouiller l'appareil pour accéder aux mots de passe"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL du site Web"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Copier %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresse copiée"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Notes copiées"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Mot de passe copié"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Nom d'utilisateur copié"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Masquer le mot de passe"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Dernière modification : %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Titre"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Notes"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Mot de passe"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Afficher le mot de passe"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Nom d'utilisateur"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Les mots de passe sont stockés en toute sécurité sur votre appareil."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Aucun mot de passe n'a été enregistré"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Choisissez un mot de passe à utiliser pour « %@ »"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Rechercher un mot de passe"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "pour '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Aucun résultat"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Suggéré"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Mots de passe"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Définissez un code d'accès sur %@ pour saisir automatiquement vos mots de passe DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Code d'accès de l'appareil requis"; + diff --git a/AutofillCredentialProvider/hr.lproj/InfoPlist.strings b/AutofillCredentialProvider/hr.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/hr.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/hr.lproj/Localizable.strings b/AutofillCredentialProvider/hr.lproj/Localizable.strings new file mode 100644 index 0000000000..38cc9387d7 --- /dev/null +++ b/AutofillCredentialProvider/hr.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Zatvori"; + +/* Done button title */ +"action.button.done" = "Gotovo"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Otvori DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatsko popunjavanje lozinki je aktivirano!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "uređaj"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Otkaži"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Otključaj uređaj za pristup lozinkama"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL web lokacije"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopiraj %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresa je kopirana"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Bilješke su kopirane"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Lozinka je kopirana"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Korisničko ime je kopirano"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Sakrij lozinku"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Posljednje ažuriranje: %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Naslov"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Bilješke"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Lozinka"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Pokaži lozinku"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Korisničko ime"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Lozinke su sigurno pohranjene na tvom uređaju."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Još nema spremljenih lozinki"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Odaberi lozinku koju ćeš koristiti za \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Pretraživanje lozinki"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "za '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Nema rezultata"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Predloženo"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Lozinke"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Postavi šifru na uređaju %@ kako bi se tvoje DuckDuckGo lozinke popunjavale automatski."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Potrebna je šifra uređaja."; + diff --git a/AutofillCredentialProvider/hu.lproj/InfoPlist.strings b/AutofillCredentialProvider/hu.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/hu.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/hu.lproj/Localizable.strings b/AutofillCredentialProvider/hu.lproj/Localizable.strings new file mode 100644 index 0000000000..c21a3bb9fb --- /dev/null +++ b/AutofillCredentialProvider/hu.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Bezárás"; + +/* Done button title */ +"action.button.done" = "Kész"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Nyisd meg a DuckDuckGo-alkalmazást"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Jelszavak automatikus kitöltése aktiválva!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "eszközön"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone készüléken"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad készüléken"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Mégsem"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Oldd fel az eszközt a jelszavakhoz való hozzáféréshez"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Webhely URL-címe"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "%@ másolása"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Cím másolva"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Megjegyzések másolva"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Jelszó másolva"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Felhasználónév másolva"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Jelszó elrejtése"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Utolsó frissítés: %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Cím"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Megjegyzések"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Jelszó"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Jelszó megjelenítése"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Felhasználónév"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "A jelszavakat az eszközöd biztonságosan tárolja."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Még nincsenek mentett jelszavak"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Válassz egy jelszót ehhez: \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Jelszavak keresése"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "erre: „%@“"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Nincs találat"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Javasolt"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Jelszavak"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "A DuckDuckGo-jelszavak automatikus kitöltéséhez állíts be egy jelkódot itt: %@."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Meg kell adni az eszköz jelkódját"; + diff --git a/AutofillCredentialProvider/it.lproj/InfoPlist.strings b/AutofillCredentialProvider/it.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/it.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/it.lproj/Localizable.strings b/AutofillCredentialProvider/it.lproj/Localizable.strings new file mode 100644 index 0000000000..5b97f6c41c --- /dev/null +++ b/AutofillCredentialProvider/it.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Chiudi"; + +/* Done button title */ +"action.button.done" = "Fatto"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Apri DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Compilazione automatica delle password attivata!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "dispositivo"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Annulla"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Sblocca il dispositivo per accedere alle password"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL del sito Web"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Copia %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Indirizzo copiato"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Appunti copiati"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Password copiata"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Nome utente copiato"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Nascondi password"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Ultimo aggiornamento %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Titolo"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Note"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Password"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Mostra password"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Nome utente"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Le password sono archiviate in modo sicuro sul tuo dispositivo."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Nessuna password ancora salvata"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Scegli una password da usare per \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Cerca password"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "per \"%@\""; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Nessun risultato"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Suggerimenti"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Password"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Imposta un codice di accesso su %@ per inserire automaticamente le tue password DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "È necessario il codice di accesso del dispositivo"; + diff --git a/AutofillCredentialProvider/lt.lproj/InfoPlist.strings b/AutofillCredentialProvider/lt.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/lt.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/lt.lproj/Localizable.strings b/AutofillCredentialProvider/lt.lproj/Localizable.strings new file mode 100644 index 0000000000..9867833bfd --- /dev/null +++ b/AutofillCredentialProvider/lt.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Uždaryti"; + +/* Done button title */ +"action.button.done" = "Atlikta"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Atidaryti „DuckDuckGo“"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatinis slaptažodžių pildymas įjungtas!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "įrenginys"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Atšaukti"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Atrakinkite įrenginį, kad galėtumėte pasiekti slaptažodžius"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Svetainės URL"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopijuoti %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresas nukopijuotas"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Pastabos nukopijuotos"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Slaptažodis nukopijuotas"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Naudotojo vardas nukopijuotas"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Paslėpti slaptažodį"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Paskutinį kartą atnaujinta %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Pavadinimas"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Pastabos"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Slaptažodis"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Rodyti slaptažodį"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Naudotojo vardas"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Slaptažodžiai saugiai saugomi jūsų įrenginyje."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Dar nėra išsaugotų slaptažodžių"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Pasirinkite slaptažodį, kurį naudosite „%@“"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Ieškoti slaptažodžių"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "„%@“"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Rezultatų nerasta"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Siūloma"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Slaptažodžiai"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Nustatykite %@ prieigos kodą, kad automatiškai užpildytumėte „DuckDuckGo“ slaptažodžius."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Reikalingas įrenginio kodas"; + diff --git a/AutofillCredentialProvider/lv.lproj/InfoPlist.strings b/AutofillCredentialProvider/lv.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/lv.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/lv.lproj/Localizable.strings b/AutofillCredentialProvider/lv.lproj/Localizable.strings new file mode 100644 index 0000000000..5c9150e72f --- /dev/null +++ b/AutofillCredentialProvider/lv.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Aizvērt"; + +/* Done button title */ +"action.button.done" = "Gatavs"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Atvērt DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Paroļu automātiskā aizpildīšana ir aktivizēta!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "ierīcē"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Atcelt"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Atbloķē ierīci, lai piekļūtu parolēm"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Tīmekļa vietnes URL"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopēt %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adrese nokopēta"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Piezīmes nokopētas"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Parole nokopēta"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Lietotājvārds nokopēts"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Paslēpt paroli"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Pēdējoreiz atjaunināts %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Nosaukums"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Piezīmes"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Parole"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Rādīt paroli"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Lietotājvārds"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Paroles tiek droši glabātas tavā ierīcē."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Vēl nav saglabāta neviena parole"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Izvēlies paroli, ko izmantot \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Meklēt paroles"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "meklējumam \"%@\""; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Nav rezultātu"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Ieteikts"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Paroles"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Iestati piekļuves kodu %@, lai automātiski aizpildītu savas DuckDuckGo paroles."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Nepieciešams ierīces piekļuves kods"; + diff --git a/AutofillCredentialProvider/nb.lproj/InfoPlist.strings b/AutofillCredentialProvider/nb.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/nb.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/nb.lproj/Localizable.strings b/AutofillCredentialProvider/nb.lproj/Localizable.strings new file mode 100644 index 0000000000..858f84a0d9 --- /dev/null +++ b/AutofillCredentialProvider/nb.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Lukk"; + +/* Done button title */ +"action.button.done" = "Ferdig"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Åpne DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatisk fylling av passord er aktivert!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "enhet"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Avbryt"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Lås opp enheten for å få tilgang til passord"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL-adresse til nettsted"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopier %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adressen er kopiert"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Notatene er kopiert"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Passordet er kopiert"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Brukernavnet er kopiert"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Skjul passord"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Sist oppdatert %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Tittel"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Notater"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Passord"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Vis passord"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Brukernavn"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Passord lagres på enheten din på en sikker måte."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Ingen passord er lagret ennå"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Velg et passord du vil bruke til «%@»"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Søk i passord"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "for «%@»"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Ingen resultater"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Forslag"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Passord"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Angi en kode på %@ for å fylle inn DuckDuckGo-passordene dine automatisk."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Enhetens kode kreves"; + diff --git a/AutofillCredentialProvider/nl.lproj/InfoPlist.strings b/AutofillCredentialProvider/nl.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/nl.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/nl.lproj/Localizable.strings b/AutofillCredentialProvider/nl.lproj/Localizable.strings new file mode 100644 index 0000000000..5737a0c75a --- /dev/null +++ b/AutofillCredentialProvider/nl.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Sluiten"; + +/* Done button title */ +"action.button.done" = "Klaar"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "DuckDuckGo openen"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatisch invullen van wachtwoorden geactiveerd!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "apparaat"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Annuleren"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Ontgrendel het apparaat om toegang te krijgen tot wachtwoorden"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL van de website"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "%@ kopiëren"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adres gekopieerd"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Opmerkingen gekopieerd"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Wachtwoord gekopieerd"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Gebruikersnaam gekopieerd"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Wachtwoord verbergen"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Laatst bijgewerkt op %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Titel"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Opmerkingen"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Wachtwoord"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Wachtwoord weergeven"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Gebruikersnaam"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Wachtwoorden worden veilig opgeslagen op je apparaat."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Nog geen wachtwoorden opgeslagen"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Kies een wachtwoord voor '%@'"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Wachtwoorden zoeken"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "voor '%@'"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Geen resultaten"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Aanbevolen"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Wachtwoorden"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Stel een toegangscode in op %@ om je DuckDuckGo-wachtwoorden automatisch in te vullen."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Toegangscode voor apparaat vereist"; + diff --git a/AutofillCredentialProvider/pl.lproj/InfoPlist.strings b/AutofillCredentialProvider/pl.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/pl.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/pl.lproj/Localizable.strings b/AutofillCredentialProvider/pl.lproj/Localizable.strings new file mode 100644 index 0000000000..b2198855c4 --- /dev/null +++ b/AutofillCredentialProvider/pl.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Zamknij"; + +/* Done button title */ +"action.button.done" = "Gotowe"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Otwórz DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatyczne uzupełnianie haseł zostało aktywowane!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "tym urządzeniu"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "tym telefonie iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "tym iPadzie"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Anuluj"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Odblokuj urządzenie, aby uzyskać dostęp do haseł"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Adres URL witryny"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopiuj %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Skopiowano adres"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Skopiowano notatki"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Skopiowano hasło"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Skopiowano nazwę użytkownika"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Ukryj hasło"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Ostatnia aktualizacja %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Tytuł"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Uwagi"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Hasło"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Pokaż hasło"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Nazwa użytkownika"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Hasła są bezpiecznie przechowywane na Twoim urządzeniu."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Nie zapisano jeszcze żadnych haseł"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Wybierz hasło do wykorzystania z „%@”"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Wyszukaj hasła"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "dla frazy: %@"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Brak wyników"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Sugerowane"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Hasła"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Ustaw kod dostępu na urządzeniu %@, aby automatycznie uzupełniać hasła DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Wymagany kod dostępu urządzenia"; + diff --git a/AutofillCredentialProvider/pt.lproj/InfoPlist.strings b/AutofillCredentialProvider/pt.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/pt.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/pt.lproj/Localizable.strings b/AutofillCredentialProvider/pt.lproj/Localizable.strings new file mode 100644 index 0000000000..6d2929f0ee --- /dev/null +++ b/AutofillCredentialProvider/pt.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Fechar"; + +/* Done button title */ +"action.button.done" = "Feito"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Abrir DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Preenchimento automático de palavras-passe ativado!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "dispositivo"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Cancelar"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Desbloquear dispositivo para aceder às palavras-passe"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL do site"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Copiar %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Endereço copiado"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Notas copiadas"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Palavra-passe copiada"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Nome de utilizador copiado"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Ocultar palavra-passe"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Última atualização em %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Título"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Notas"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Palavra-passe"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Mostrar palavra-passe"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Nome de utilizador"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "As palavras-passe são armazenadas com segurança no teu dispositivo."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Ainda não há palavras-passe guardadas"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Escolhe uma palavra-passe para usar em \"%@\""; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Pesquisar palavras-passe"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "para \"%@\""; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Sem resultados"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Sugerido"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Palavras-passe"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Define um código de acesso em %@ para preencher automaticamente as tuas palavras-passe DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Código de acesso do dispositivo necessário"; + diff --git a/AutofillCredentialProvider/ro.lproj/InfoPlist.strings b/AutofillCredentialProvider/ro.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/ro.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/ro.lproj/Localizable.strings b/AutofillCredentialProvider/ro.lproj/Localizable.strings new file mode 100644 index 0000000000..e90eb1030d --- /dev/null +++ b/AutofillCredentialProvider/ro.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Închidere"; + +/* Done button title */ +"action.button.done" = "Terminat"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Deschide DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Completarea automată a parolelor a fost activată!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "dispozitiv"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Renunță"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Deblochează dispozitivul pentru a accesa parolele"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL-ul site-ului"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Copiază %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresă copiată"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Note copiate"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Parolă copiată"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Numele de utilizator a fost copiat"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Ascunde parola"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Ultima actualizare la %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Titlu"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Note"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Parolă"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Arată parola"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Nume utilizator"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Parolele sunt stocate în siguranță pe dispozitivul tău."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Nici o parolă nu a fost salvată încă"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Alege o parolă pe care să o utilizezi pentru „%@”"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Caută parole"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "pentru „%@”"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Niciun rezultat"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Sugerat"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Parole"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Setează o parolă pe %@ pentru a-ți completa automat parolele DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Codul de acces al dispozitivului este necesar"; + diff --git a/AutofillCredentialProvider/ru.lproj/InfoPlist.strings b/AutofillCredentialProvider/ru.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/ru.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/ru.lproj/Localizable.strings b/AutofillCredentialProvider/ru.lproj/Localizable.strings new file mode 100644 index 0000000000..823459918c --- /dev/null +++ b/AutofillCredentialProvider/ru.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Закрыть"; + +/* Done button title */ +"action.button.done" = "Готово"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Открыть DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Автозаполнение паролей включено!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "устройстве"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Отменить"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Разблокируйте устройство, чтобы получить доступ к паролям"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Адрес сайта"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Копировать %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Адрес скопирован"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Примечания скопированы"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Пароль скопирован"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Имя пользователя скопировано!"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Скрыть пароль"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Последнее обновление: %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Название"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Примечания"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Пароль"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Показать пароль"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Имя пользователя"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Пароли надежно защищены и хранятся на вашем устройстве."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Сохраненных паролей пока нет"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Выберите пароль для сайта %@"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Найти пароль"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "по запросу «%@»"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Нет результатов"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Рекомендации"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Пароли"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Задайте код доступа, и %@ будет заполнять пароли из DuckDuckGo автоматически."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Требуется код доступа к устройству"; + diff --git a/AutofillCredentialProvider/sk.lproj/InfoPlist.strings b/AutofillCredentialProvider/sk.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/sk.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/sk.lproj/Localizable.strings b/AutofillCredentialProvider/sk.lproj/Localizable.strings new file mode 100644 index 0000000000..c704caedba --- /dev/null +++ b/AutofillCredentialProvider/sk.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Zatvoriť"; + +/* Done button title */ +"action.button.done" = "Hotovo"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Otvoriť DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatické dopĺňanie hesiel je aktivované!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "zariadenie"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Zrušiť"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Ak chcete získať prístup k heslám, odomknite zariadenie"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Adresa URL webových stránok"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopírovať %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adresa bola skopírovaná"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Poznámky boli skopírované"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Heslo bolo skopírované"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Meno používateľa bolo skopírované"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Skryť heslo"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Naposledy aktualizované %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Názov"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Poznámky"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Heslo"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Zobraziť heslo"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Používateľské meno"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Heslá sú bezpečne uložené vo vašom zariadení."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Zatiaľ nie sú uložené žiadne heslá"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Vyber si heslo, ktoré chceš použiť pre „%@“"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Vyhľadávanie hesiel"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "pre „%@”"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Žiadne výsledky"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Navrhované"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Heslo"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Nastav prístupový kód na %@ na automatické vypĺňanie tvojich hesiel DuckDuckGo."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Vyžaduje sa prístupový kód zariadenia."; + diff --git a/AutofillCredentialProvider/sl.lproj/InfoPlist.strings b/AutofillCredentialProvider/sl.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/sl.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/sl.lproj/Localizable.strings b/AutofillCredentialProvider/sl.lproj/Localizable.strings new file mode 100644 index 0000000000..2ccec47f15 --- /dev/null +++ b/AutofillCredentialProvider/sl.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Zapri"; + +/* Done button title */ +"action.button.done" = "Končano"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Odpri DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Samodejno izpolnjevanje gesel je aktivirano."; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "naprava"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Prekliči"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Če želite dostopati do gesel, odklenite napravo"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "URL spletnega mesta"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopiraj %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Naslov je bil kopiran"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Opombe so kopirane"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Geslo je bilo kopirano"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Uporabniško ime je bilo kopirano"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Skrij geslo"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Zadnja posodobitev %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Naslov"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Opombe"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Geslo"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Prikaži geslo"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Uporabniško ime"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Gesla so varno shranjena v vaši napravi."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Nobeno geslo še ni shranjeno"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Izberite geslo za »%@«"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Iskanje gesel"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "za »%@«"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Ni rezultatov"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Predlagano"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Gesla"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Za samodejno izpolnjevanje gesel DuckDuckGo nastavite kodo za dostop v svoji napravi (%@)."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Zahtevana je koda za dostop do naprave"; + diff --git a/AutofillCredentialProvider/sv.lproj/InfoPlist.strings b/AutofillCredentialProvider/sv.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/sv.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/sv.lproj/Localizable.strings b/AutofillCredentialProvider/sv.lproj/Localizable.strings new file mode 100644 index 0000000000..04f1b6425c --- /dev/null +++ b/AutofillCredentialProvider/sv.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Stäng"; + +/* Done button title */ +"action.button.done" = "Klart"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "Öppna DuckDuckGo"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Automatisk ifyllning av lösenord har aktiverats!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "enhet"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "Avbryt"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Lås upp enheten för att komma åt lösenord"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Webbplats-URL"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "Kopiera %@"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adress kopierad"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Anteckningar kopierade"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Lösenord kopierat"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Användarnamn kopierat"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Dölj lösenord"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Uppdaterades senast %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Rubrik"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Anteckningar"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Lösenord"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Visa lösenord"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Användarnamn"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Lösenord lagras säkert på din enhet."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Inga lösenord sparade ännu"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "Välj ett lösenord att använda för %@"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Sök lösenord"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "för ”%@”"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Inga resultat"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Förslag"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Lösenord"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "Ställ in en lösenkod på %@ för att automatiskt fylla i dina DuckDuckGo-lösenord."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Enhetens lösenkod krävs"; + diff --git a/AutofillCredentialProvider/tr.lproj/InfoPlist.strings b/AutofillCredentialProvider/tr.lproj/InfoPlist.strings new file mode 100644 index 0000000000..9809aa19f5 --- /dev/null +++ b/AutofillCredentialProvider/tr.lproj/InfoPlist.strings @@ -0,0 +1,9 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "AutofillCredentialProvider"; + +/* Bundle name */ +"CFBundleName" = "AutofillCredentialProvider"; + +/* Copyright (human-readable) */ +"NSHumanReadableCopyright" = "Copyright © 2024 DuckDuckGo. All rights reserved."; + diff --git a/AutofillCredentialProvider/tr.lproj/Localizable.strings b/AutofillCredentialProvider/tr.lproj/Localizable.strings new file mode 100644 index 0000000000..1bf39ce8dc --- /dev/null +++ b/AutofillCredentialProvider/tr.lproj/Localizable.strings @@ -0,0 +1,96 @@ +/* Close button title */ +"action.button.close" = "Kapat"; + +/* Done button title */ +"action.button.done" = "Bitti"; + +/* Title of button to launch the DuckDuckGo app */ +"credential.provider.activated.button" = "DuckDuckGo'yu aç"; + +/* The title of the screen confirming DuckDuckGo can now be used for autofilling passwords */ +"credential.provider.activated.title" = "Şifreleri otomatik doldurma etkinleştirildi!"; + +/* Default string used if users device is not iPhone or iPad */ +"credential.provider.device.type.default" = "cihaz"; + +/* Device type is iPhone */ +"credential.provider.device.type.iphone" = "iPhone"; + +/* Device type is iPad */ +"credential.provider.device.type.pad" = "iPad"; + +/* Cancel button for auth when opening login list */ +"credential.provider.list.auth.cancel" = "İptal"; + +/* Reason for auth when opening screen with list of saved passwords */ +"credential.provider.list.auth.reason" = "Şifrelere erişmek için cihazın kilidini açın"; + +/* Address label for login details on autofill */ +"credential.provider.list.details.address" = "Web sitesi URL'si"; + +/* Menu item text for copying autofill login details */ +"credential.provider.list.details.copy-prompt" = "%@ Ögesini Kopyala"; + +/* Title for toast when copying address */ +"credential.provider.list.details.copy-toast.address-copied" = "Adres kopyalandı"; + +/* Title for toast when copying notes */ +"credential.provider.list.details.copy-toast.notes-copied" = "Notlar kopyalandı"; + +/* Title for toast when copying password */ +"credential.provider.list.details.copy-toast.password-copied" = "Şifre kopyalandı"; + +/* Title for toast when copying username */ +"credential.provider.list.details.copy-toast.username-copied" = "Kullanıcı adı kopyalandı"; + +/* Accessibility title for a Hide Password button replacing displayed password with ***** */ +"credential.provider.list.details.hide-password" = "Parolayı gizle"; + +/* Message displaying when the login was last updated */ +"credential.provider.list.details.last-updated" = "Son güncelleme %@"; + +/* Login name label for login details on autofill */ +"credential.provider.list.details.login-name" = "Title"; + +/* Notes label for login details on autofill */ +"credential.provider.list.details.notes" = "Notlar"; + +/* Password label for login details on autofill */ +"credential.provider.list.details.password" = "Parola"; + +/* Accessibility title for a Show Password button displaying actial password instead of ***** */ +"credential.provider.list.details.show-password" = "Parolayı göster"; + +/* Username label for login details on autofill */ +"credential.provider.list.details.username" = "Kullanıcı adı"; + +/* Footer label displayed below table section with option to enable autofill */ +"credential.provider.list.empty-view.footer" = "Şifreler cihazınızda güvenli bir şekilde saklanır."; + +/* Title for view displayed when autofill has no items */ +"credential.provider.list.empty-view.title" = "Henüz şifre kaydedilmedi"; + +/* Prompt above the title for screen listing autofill logins, example: Choose a password to use for "website.com" */ +"credential.provider.list.prompt" = "\"%@\" için kullanılacak bir şifre seçin"; + +/* Placeholder for search field on autofill login listing */ +"credential.provider.list.search-placeholder" = "Şifreleri ara"; + +/* Subtitle displayed when there are no results on Autofill search, example : No Result (Title) for Duck (Subtitle) */ +"credential.provider.list.search.no-results.subtitle" = "\"%@\" için"; + +/* Title displayed when there are no results on Autofill search */ +"credential.provider.list.search.no-results.title" = "Sonuç yok"; + +/* Section title for group of suggested saved logins */ +"credential.provider.list.suggested" = "Önerilen"; + +/* Title for screen listing autofill logins */ +"credential.provider.list.title" = "Şifreler"; + +/* Message for alert when device authentication is not set, where %@ is iPhone|iPad|device */ +"credential.provider.no-device-auth-set.message" = "DuckDuckGo şifrelerinizi otomatik olarak doldurmak için %@ üzerinde bir parola belirleyin."; + +/* Title for alert when device authentication is not set */ +"credential.provider.no-device-auth-set.title" = "Cihaz Parolası Gerekli"; + diff --git a/DuckDuckGo/AutofillInterfaceEmailTruncator.swift b/Core/AutofillInterfaceEmailTruncator.swift similarity index 91% rename from DuckDuckGo/AutofillInterfaceEmailTruncator.swift rename to Core/AutofillInterfaceEmailTruncator.swift index 2eb28faa1b..41fb28342c 100644 --- a/DuckDuckGo/AutofillInterfaceEmailTruncator.swift +++ b/Core/AutofillInterfaceEmailTruncator.swift @@ -19,8 +19,8 @@ import Foundation -struct AutofillInterfaceEmailTruncator { - static func truncateEmail(_ email: String, maxLength: Int) -> String { +public struct AutofillInterfaceEmailTruncator { + public static func truncateEmail(_ email: String, maxLength: Int) -> String { let emailComponents = email.components(separatedBy: "@") if emailComponents.count > 1 && email.count > maxLength { let ellipsis = "..." diff --git a/DuckDuckGo/PasswordHider.swift b/Core/PasswordHider.swift similarity index 83% rename from DuckDuckGo/PasswordHider.swift rename to Core/PasswordHider.swift index 1849248f24..ffe3a70929 100644 --- a/DuckDuckGo/PasswordHider.swift +++ b/Core/PasswordHider.swift @@ -19,11 +19,15 @@ import Foundation -struct PasswordHider { - let password: String - var hiddenPassword: String { +public struct PasswordHider { + public let password: String + public var hiddenPassword: String { let maximumPasswordDisplayCount = 22 let passwordCount = password.count > maximumPasswordDisplayCount ? maximumPasswordDisplayCount : password.count return String(repeating: "•", count: passwordCount) } + + public init(password: String) { + self.password = password + } } diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index 4c9d909115..29eadee0f7 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -312,6 +312,8 @@ extension Pixel { case autofillOnboardedUser case autofillToggledOn case autofillToggledOff + case autofillExtensionToggledOn + case autofillExtensionToggledOff case autofillLoginsStacked case autofillManagementOpened @@ -332,7 +334,18 @@ extension Pixel { case getDesktopCopy case getDesktopShare - + + case autofillExtensionEnabled + case autofillExtensionDisabled + case autofillExtensionWelcomeDismiss + case autofillExtensionWelcomeLaunchApp + case autofillExtensionQuickTypeConfirmed + case autofillExtensionQuickTypeCancelled + case autofillExtensionPasswordsOpened + case autofillExtensionPasswordsDismissed + case autofillExtensionPasswordSelected + case autofillExtensionPasswordsSearch + case autofillJSPixelFired(_ pixel: AutofillUserScript.JSPixel) case secureVaultError @@ -1203,6 +1216,8 @@ extension Pixel.Event { case .autofillOnboardedUser: return "m_autofill_onboardeduser" case .autofillToggledOn: return "m_autofill_toggled_on" case .autofillToggledOff: return "m_autofill_toggled_off" + case .autofillExtensionToggledOn: return "m_autofill_extension_toggled_on" + case .autofillExtensionToggledOff: return "m_autofill_extension_toggled_off" case .autofillLoginsStacked: return "m_autofill_logins_stacked" @@ -1232,6 +1247,18 @@ extension Pixel.Event { case .getDesktopCopy: return "m_get_desktop_copy" case .getDesktopShare: return "m_get_desktop_share" + // Autofill Credential Provider Extension + case .autofillExtensionEnabled: return "autofill_extension_enabled" + case .autofillExtensionDisabled: return "autofill_extension_disabled" + case .autofillExtensionWelcomeDismiss: return "autofill_extension_welcome_dismiss" + case .autofillExtensionWelcomeLaunchApp: return "autofill_extension_welcome_launch_app" + case .autofillExtensionQuickTypeConfirmed: return "autofill_extension_quicktype_confirmed" + case .autofillExtensionQuickTypeCancelled: return "autofill_extension_quicktype_cancelled" + case .autofillExtensionPasswordsOpened: return "autofill_extension_passwords_opened" + case .autofillExtensionPasswordsDismissed: return "autofill_extension_passwords_dismissed" + case .autofillExtensionPasswordSelected: return "autofill_extension_password_selected" + case .autofillExtensionPasswordsSearch: return "autofill_extension_passwords_search" + case .autofillJSPixelFired(let pixel): return "m_ios_\(pixel.pixelName)" diff --git a/Core/UserDefaultsPropertyWrapper.swift b/Core/UserDefaultsPropertyWrapper.swift index 4858ad964d..4b0b9682ab 100644 --- a/Core/UserDefaultsPropertyWrapper.swift +++ b/Core/UserDefaultsPropertyWrapper.swift @@ -95,6 +95,7 @@ public struct UserDefaultsWrapper { case autofillFillDate = "com.duckduckgo.app.autofill.FillDate" case autofillOnboardedUser = "com.duckduckgo.app.autofill.OnboardedUser" case autofillSurveysCompleted = "com.duckduckgo.app.autofill.SurveysCompleted" + case autofillExtensionEnabled = "com.duckduckgo.app.autofill.ExtensionEnabled" case syncPromoBookmarksDismissed = "com.duckduckgo.app.sync.PromoBookmarksDismissed" case syncPromoPasswordsDismissed = "com.duckduckgo.app.sync.PromoPasswordsDismissed" diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 7257f3f214..fce5b52b68 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -175,7 +175,6 @@ 317F5F982C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 317F5F972C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift */; }; 31860A5B2C57ED2D005561F5 /* DuckPlayerStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31860A5A2C57ED2D005561F5 /* DuckPlayerStorage.swift */; }; 31951E8E2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */; }; - 319A371028299A850079FBCE /* PasswordHider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319A370F28299A850079FBCE /* PasswordHider.swift */; }; 319A37152829A55F0079FBCE /* AutofillListItemTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319A37142829A55F0079FBCE /* AutofillListItemTableViewCell.swift */; }; 319A37172829C8AD0079FBCE /* UITableViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319A37162829C8AD0079FBCE /* UITableViewExtension.swift */; }; 31A42564285A09E800049386 /* FaviconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A42563285A09E800049386 /* FaviconView.swift */; }; @@ -919,6 +918,15 @@ C1BF0BA529B63D7200482B73 /* AutofillLoginPromptHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1BF0BA429B63D7200482B73 /* AutofillLoginPromptHelper.swift */; }; C1BF0BA929B63E2200482B73 /* AutofillLoginPromptViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1BF0BA729B63E1A00482B73 /* AutofillLoginPromptViewModelTests.swift */; }; C1BF26152C74D10F00F6405E /* SyncPromoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1BF26142C74D10F00F6405E /* SyncPromoManager.swift */; }; + C1C1FF452D085A280017ACCE /* CredentialProviderListDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF412D085A280017ACCE /* CredentialProviderListDetailsView.swift */; }; + C1C1FF462D085A280017ACCE /* CredentialProviderListDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF422D085A280017ACCE /* CredentialProviderListDetailsViewController.swift */; }; + C1C1FF472D085A280017ACCE /* CredentialProviderListDetailsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF432D085A280017ACCE /* CredentialProviderListDetailsViewModel.swift */; }; + C1C1FF4A2D085A4C0017ACCE /* AutofillInterfaceEmailTruncator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF482D085A4C0017ACCE /* AutofillInterfaceEmailTruncator.swift */; }; + C1C1FF4B2D085A4C0017ACCE /* PasswordHider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF492D085A4C0017ACCE /* PasswordHider.swift */; }; + C1C1FF502D085AD70017ACCE /* ActionMessageView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C1C1FF4D2D085AD70017ACCE /* ActionMessageView.xib */; }; + C1C1FF512D085AD70017ACCE /* FaviconHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF4E2D085AD70017ACCE /* FaviconHelper.swift */; }; + C1C1FF522D085AD70017ACCE /* ActionMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF4C2D085AD70017ACCE /* ActionMessageView.swift */; }; + C1C1FF532D085AD70017ACCE /* NibLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C1FF4F2D085AD70017ACCE /* NibLoading.swift */; }; C1CAAA6A2CF8BABF00C37EE6 /* CredentialProviderActivatedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1CAAA692CF8BABF00C37EE6 /* CredentialProviderActivatedView.swift */; }; C1CAAA712CF8BC0B00C37EE6 /* UIViewControllerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1CAAA702CF8BC0B00C37EE6 /* UIViewControllerExtension.swift */; }; C1CAAA732CF8BD1C00C37EE6 /* CredentialProviderActivatedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1CAAA722CF8BD1C00C37EE6 /* CredentialProviderActivatedViewModel.swift */; }; @@ -945,6 +953,8 @@ C1D21E2D293A5965006E5A05 /* AutofillLoginSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D21E2C293A5965006E5A05 /* AutofillLoginSession.swift */; }; C1D21E2F293A599C006E5A05 /* AutofillLoginSessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1D21E2E293A599C006E5A05 /* AutofillLoginSessionTests.swift */; }; C1E42C7B2C5CD8AE00509204 /* AutofillCredentialsDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1E42C7A2C5CD8AD00509204 /* AutofillCredentialsDebugViewController.swift */; }; + C1E4E9A62D0861AD00AA39AF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1E4E9A42D0861AD00AA39AF /* InfoPlist.strings */; }; + C1E4E9A92D0861AD00AA39AF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1E4E9A72D0861AD00AA39AF /* Localizable.strings */; }; C1EA86602C74CB6C00E8604D /* SyncPromoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EA865F2C74CB6C00E8604D /* SyncPromoView.swift */; }; C1EA86622C74CB8B00E8604D /* SyncPromoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EA86612C74CB8B00E8604D /* SyncPromoViewModel.swift */; }; C1EF5B232CC0457B002980E6 /* AuthenticationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1EF5B222CC0457B002980E6 /* AuthenticationServices.framework */; }; @@ -1205,7 +1215,6 @@ F486D3382506A225002D07D7 /* OHHTTPStubsSwift in Frameworks */ = {isa = PBXBuildFile; productRef = F486D3372506A225002D07D7 /* OHHTTPStubsSwift */; }; F4B0B78C252CAFF700830156 /* OnboardingWidgetsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4B0B78B252CAFF700830156 /* OnboardingWidgetsViewController.swift */; }; F4B0B796252CB35700830156 /* OnboardingWidgetsDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4B0B795252CB35700830156 /* OnboardingWidgetsDetailsViewController.swift */; }; - F4C9FBF528340DDA002281CC /* AutofillInterfaceEmailTruncator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C9FBF428340DDA002281CC /* AutofillInterfaceEmailTruncator.swift */; }; F4CE6D1B257EA33C00D0A6AA /* FireButtonAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4CE6D1A257EA33C00D0A6AA /* FireButtonAnimator.swift */; }; F4D7221026F29A70007D6193 /* BookmarkDetailsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4D7220F26F29A70007D6193 /* BookmarkDetailsCell.swift */; }; F4D7F634298C00C3006C3AE9 /* FindInPageIOSJSSupport in Frameworks */ = {isa = PBXBuildFile; productRef = F4D7F633298C00C3006C3AE9 /* FindInPageIOSJSSupport */; }; @@ -1542,7 +1551,6 @@ 317F5F972C94A9EB0081666F /* MarketplaceAdPostbackStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarketplaceAdPostbackStorage.swift; sourceTree = ""; }; 31860A5A2C57ED2D005561F5 /* DuckPlayerStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DuckPlayerStorage.swift; sourceTree = ""; }; 31951E8D2823003200CAF535 /* AutofillLoginDetailsHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsHeaderView.swift; sourceTree = ""; }; - 319A370F28299A850079FBCE /* PasswordHider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordHider.swift; sourceTree = ""; }; 319A37142829A55F0079FBCE /* AutofillListItemTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillListItemTableViewCell.swift; sourceTree = ""; }; 319A37162829C8AD0079FBCE /* UITableViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITableViewExtension.swift; sourceTree = ""; }; 31A42563285A09E800049386 /* FaviconView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconView.swift; sourceTree = ""; }; @@ -2707,14 +2715,28 @@ BDFF03242BA3D92E00F324C9 /* NetworkProtectionFeatureVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkProtectionFeatureVisibilityTests.swift; sourceTree = ""; }; C10CB5F22A1A5BDF0048E503 /* AutofillViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillViews.swift; sourceTree = ""; }; C111B26827F579EF006558B1 /* BookmarkOrFolderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkOrFolderTests.swift; sourceTree = ""; }; + C1193F602D08642900CB3239 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + C1193F612D08642900CB3239 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; + C11C4D302D08648100288E85 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/InfoPlist.strings; sourceTree = ""; }; + C11C4D312D08648100288E85 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; C12726ED2A5FF88C00215B02 /* EmailSignupPromptView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailSignupPromptView.swift; sourceTree = ""; }; C12726EF2A5FF89900215B02 /* EmailSignupPromptViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailSignupPromptViewModel.swift; sourceTree = ""; }; C12726F12A5FF8CB00215B02 /* EmailSignupPromptViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailSignupPromptViewController.swift; sourceTree = ""; }; + C12854D82D08636E00C8353F /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/InfoPlist.strings; sourceTree = ""; }; + C12854D92D08636E00C8353F /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = lv.lproj/Localizable.strings; sourceTree = ""; }; + C129DF092D0862D7007AB046 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = ""; }; + C129DF0A2D0862D7007AB046 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; + C132F5A32D0862B8000C81D0 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/InfoPlist.strings; sourceTree = ""; }; + C132F5A42D0862B8000C81D0 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; C13B32D12A0E750700A59236 /* AutofillSettingStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillSettingStatus.swift; sourceTree = ""; }; C13C076B2D00A6B7006386CF /* VaultCredentialManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VaultCredentialManager.swift; sourceTree = ""; }; C13F3F672B7F88100083BE40 /* AuthConfirmationPromptView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthConfirmationPromptView.swift; sourceTree = ""; }; C13F3F692B7F883A0083BE40 /* AuthConfirmationPromptViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthConfirmationPromptViewController.swift; sourceTree = ""; }; C13F3F6B2B7F88470083BE40 /* AuthConfirmationPromptViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthConfirmationPromptViewModel.swift; sourceTree = ""; }; + C1406D862D0862F30082CB50 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/InfoPlist.strings; sourceTree = ""; }; + C1406D872D0862F30082CB50 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; + C1453E322D0863C80024449B /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; + C1453E332D0863C80024449B /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; C14882D727F2011C00D59F0C /* BookmarksExporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarksExporter.swift; sourceTree = ""; }; C14882D927F2011C00D59F0C /* BookmarksImporter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarksImporter.swift; sourceTree = ""; }; C14882E127F20D9A00D59F0C /* BookmarksExporterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarksExporterTests.swift; sourceTree = ""; }; @@ -2722,23 +2744,37 @@ C14882E527F20DAA00D59F0C /* HtmlTestDataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HtmlTestDataLoader.swift; sourceTree = ""; }; C14882E627F20DAB00D59F0C /* TestDataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestDataLoader.swift; sourceTree = ""; }; C14882E927F20DD000D59F0C /* MockBookmarksCoreDataStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockBookmarksCoreDataStorage.swift; sourceTree = ""; }; + C14D37D62D08649E00FCFC59 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = ""; }; + C14D37D72D08649E00FCFC59 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; C14D43002B45D6CD00ACA4DC /* AutofillDebugViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillDebugViewController.swift; sourceTree = ""; }; C14E2F7629DE14EA002AC515 /* AutofillInterfaceUsernameTruncatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceUsernameTruncatorTests.swift; sourceTree = ""; }; + C1588FC42D08644800C9BE70 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/InfoPlist.strings; sourceTree = ""; }; + C1588FC52D08644800C9BE70 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; C158AC7A297AB5DC0008723A /* MockSecureVault.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockSecureVault.swift; sourceTree = ""; }; C159DF062A430B60007834BB /* EmailSignupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailSignupViewController.swift; sourceTree = ""; }; C160544029D6044D00B715A1 /* AutofillInterfaceUsernameTruncator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceUsernameTruncator.swift; sourceTree = ""; }; + C163677A2D08638C001D1094 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = ""; }; + C163677B2D08638C001D1094 /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = ""; }; C1641EAE2BC2F5140012607A /* ImportPasswordsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportPasswordsViewController.swift; sourceTree = ""; }; C1641EB02BC2F52B0012607A /* ImportPasswordsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportPasswordsView.swift; sourceTree = ""; }; C1641EB22BC2F53C0012607A /* ImportPasswordsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportPasswordsViewModel.swift; sourceTree = ""; }; + C164F9472D0861D600BAE88E /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/InfoPlist.strings; sourceTree = ""; }; + C164F9482D0861D600BAE88E /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; + C174E08E2D08625300ACE1AF /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/InfoPlist.strings; sourceTree = ""; }; + C174E08F2D08625300ACE1AF /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; C177D9F52CFDDFEB0039CBF7 /* UIAlertControllerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIAlertControllerExtension.swift; sourceTree = ""; }; C17B59562A03AAD30055F2D1 /* PasswordGenerationPromptViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordGenerationPromptViewModel.swift; sourceTree = ""; }; C17B59572A03AAD30055F2D1 /* PasswordGenerationPromptViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordGenerationPromptViewController.swift; sourceTree = ""; }; C17B59582A03AAD30055F2D1 /* PasswordGenerationPromptView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordGenerationPromptView.swift; sourceTree = ""; }; + C180CAFA2D0863E500ADB0FE /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/InfoPlist.strings; sourceTree = ""; }; + C180CAFB2D0863E500ADB0FE /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; }; C1836CE02C359EC90016D057 /* AutofillBreakageReportCellContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillBreakageReportCellContentView.swift; sourceTree = ""; }; C1836CE42C35A0EA0016D057 /* AutofillBreakageReportTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillBreakageReportTableViewCell.swift; sourceTree = ""; }; C185ED602BD4329700BAE9DC /* ImportPasswordsStatusHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportPasswordsStatusHandler.swift; sourceTree = ""; }; C185ED632BD438AF00BAE9DC /* ImportPasswordsStatusHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportPasswordsStatusHandlerTests.swift; sourceTree = ""; }; C185ED652BD43A5500BAE9DC /* MockDDGSyncing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDDGSyncing.swift; sourceTree = ""; }; + C18D7C412D08620D00FB3F87 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/InfoPlist.strings; sourceTree = ""; }; + C18D7C422D08620D00FB3F87 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; C18ED4392AB6F77600BF3805 /* AutofillSettingsEnableFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillSettingsEnableFooterView.swift; sourceTree = ""; }; C18ED43B2AB8364400BF3805 /* FileTextPreviewDebugViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileTextPreviewDebugViewController.swift; sourceTree = ""; }; C1935A0D2C88D11D001AD72D /* AutofillSurveyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillSurveyView.swift; sourceTree = ""; }; @@ -2748,15 +2784,30 @@ C1935A232C89CC6D001AD72D /* AutofillHeaderViewFactoryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillHeaderViewFactoryTests.swift; sourceTree = ""; }; C1963862283794A000298D4D /* BookmarksCachingSearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarksCachingSearch.swift; sourceTree = ""; }; C19D90D02CFE3A7F00D17DF3 /* AutofillLoginListSectionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginListSectionType.swift; sourceTree = ""; }; + C1A001092D08635100372C87 /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/InfoPlist.strings; sourceTree = ""; }; + C1A0010A2D08635100372C87 /* lt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lt; path = lt.lproj/Localizable.strings; sourceTree = ""; }; C1B0F6412AB08BE9001EAF05 /* MockPrivacyConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockPrivacyConfiguration.swift; sourceTree = ""; }; + C1B783DB2D0863110071C53B /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = ""; }; + C1B783DC2D0863110071C53B /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; C1B7B51B28941E980098FD6A /* HomeMessageViewModelBuilder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeMessageViewModelBuilder.swift; sourceTree = ""; }; C1B7B52128941F2A0098FD6A /* RemoteMessagingClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoteMessagingClient.swift; sourceTree = ""; }; C1B7B52C2894469D0098FD6A /* DefaultVariantManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultVariantManager.swift; sourceTree = ""; }; C1B7B53328944EFA0098FD6A /* CoreDataTestUtilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataTestUtilities.swift; sourceTree = ""; }; + C1B7BF522D08640B0024FF56 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/InfoPlist.strings; sourceTree = ""; }; + C1B7BF532D08640B0024FF56 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; C1B924B62ACD6E6800EE7B06 /* AutofillNeverSavedTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillNeverSavedTableViewCell.swift; sourceTree = ""; }; C1BF0BA429B63D7200482B73 /* AutofillLoginPromptHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillLoginPromptHelper.swift; sourceTree = ""; }; C1BF0BA729B63E1A00482B73 /* AutofillLoginPromptViewModelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillLoginPromptViewModelTests.swift; sourceTree = ""; }; C1BF26142C74D10F00F6405E /* SyncPromoManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncPromoManager.swift; sourceTree = ""; }; + C1C1FF412D085A280017ACCE /* CredentialProviderListDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderListDetailsView.swift; sourceTree = ""; }; + C1C1FF422D085A280017ACCE /* CredentialProviderListDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderListDetailsViewController.swift; sourceTree = ""; }; + C1C1FF432D085A280017ACCE /* CredentialProviderListDetailsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderListDetailsViewModel.swift; sourceTree = ""; }; + C1C1FF482D085A4C0017ACCE /* AutofillInterfaceEmailTruncator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceEmailTruncator.swift; sourceTree = ""; }; + C1C1FF492D085A4C0017ACCE /* PasswordHider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordHider.swift; sourceTree = ""; }; + C1C1FF4C2D085AD70017ACCE /* ActionMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionMessageView.swift; sourceTree = ""; }; + C1C1FF4D2D085AD70017ACCE /* ActionMessageView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ActionMessageView.xib; sourceTree = ""; }; + C1C1FF4E2D085AD70017ACCE /* FaviconHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconHelper.swift; sourceTree = ""; }; + C1C1FF4F2D085AD70017ACCE /* NibLoading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NibLoading.swift; sourceTree = ""; }; C1CAAA672CF8B74200C37EE6 /* AutofillCredentialProviderAlpha.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AutofillCredentialProviderAlpha.entitlements; sourceTree = ""; }; C1CAAA692CF8BABF00C37EE6 /* CredentialProviderActivatedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CredentialProviderActivatedView.swift; sourceTree = ""; }; C1CAAA702CF8BC0B00C37EE6 /* UIViewControllerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewControllerExtension.swift; sourceTree = ""; }; @@ -2776,11 +2827,19 @@ C1CAAAA72CFCBE4800C37EE6 /* EmptySearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptySearchView.swift; sourceTree = ""; }; C1CAAAA92CFCC13E00C37EE6 /* SecureVaultReporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureVaultReporter.swift; sourceTree = ""; }; C1CAAAAB2CFCC91D00C37EE6 /* EmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyView.swift; sourceTree = ""; }; + C1CB0AA52D08629800335287 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/InfoPlist.strings; sourceTree = ""; }; + C1CB0AA62D08629800335287 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; }; C1CDA3152AFB9C7F006D1476 /* AutofillNeverPromptWebsitesManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillNeverPromptWebsitesManager.swift; sourceTree = ""; }; C1CDA31D2AFBF811006D1476 /* AutofillNeverPromptWebsitesManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillNeverPromptWebsitesManagerTests.swift; sourceTree = ""; }; C1D21E2C293A5965006E5A05 /* AutofillLoginSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginSession.swift; sourceTree = ""; }; C1D21E2E293A599C006E5A05 /* AutofillLoginSessionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginSessionTests.swift; sourceTree = ""; }; + C1DCF3502D0862330055F8B0 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = ""; }; + C1DCF3512D0862330055F8B0 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; C1E42C7A2C5CD8AD00509204 /* AutofillCredentialsDebugViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillCredentialsDebugViewController.swift; sourceTree = ""; }; + C1E490582D08646400F86C5A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/InfoPlist.strings; sourceTree = ""; }; + C1E490592D08646400F86C5A /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = sl.lproj/Localizable.strings; sourceTree = ""; }; + C1E4E9A52D0861AD00AA39AF /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/InfoPlist.strings; sourceTree = ""; }; + C1E4E9A82D0861AD00AA39AF /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; C1EA865F2C74CB6C00E8604D /* SyncPromoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncPromoView.swift; sourceTree = ""; }; C1EA86612C74CB8B00E8604D /* SyncPromoViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncPromoViewModel.swift; sourceTree = ""; }; C1EF5B212CC0457B002980E6 /* AutofillCredentialProvider.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = AutofillCredentialProvider.appex; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2791,6 +2850,12 @@ C1F341C42A6924000032057B /* EmailAddressPromptView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailAddressPromptView.swift; sourceTree = ""; }; C1F341C62A6924100032057B /* EmailAddressPromptViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailAddressPromptViewModel.swift; sourceTree = ""; }; C1F341C82A6926920032057B /* EmailAddressPromptViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailAddressPromptViewController.swift; sourceTree = ""; }; + C1F883372D08627900DFF79A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; + C1F883382D08627900DFF79A /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; + C1FE93E52D0863AA009F8F5E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; + C1FE93E62D0863AA009F8F5E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; + C1FEDCEA2D08633100BFBF3F /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = ""; }; + C1FEDCEB2D08633100BFBF3F /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; C1FFBD452C761BE20073622B /* SyncPromoManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncPromoManagerTests.swift; sourceTree = ""; }; C1FFBD472C7749A90073622B /* SyncSettingsViewController+PlatformLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SyncSettingsViewController+PlatformLinks.swift"; sourceTree = ""; }; CB1143DD2AF6D4B600C1CCD3 /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -3076,7 +3141,6 @@ F47E53DA250A9A1C0037C686 /* Onboarding.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Onboarding.xcassets; sourceTree = ""; }; F4B0B78B252CAFF700830156 /* OnboardingWidgetsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingWidgetsViewController.swift; sourceTree = ""; }; F4B0B795252CB35700830156 /* OnboardingWidgetsDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingWidgetsDetailsViewController.swift; sourceTree = ""; }; - F4C9FBF428340DDA002281CC /* AutofillInterfaceEmailTruncator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillInterfaceEmailTruncator.swift; sourceTree = ""; }; F4CE6D1A257EA33C00D0A6AA /* FireButtonAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FireButtonAnimator.swift; sourceTree = ""; }; F4D7220F26F29A70007D6193 /* BookmarkDetailsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarkDetailsCell.swift; sourceTree = ""; }; F4D9C4F925117A0F00814B71 /* HomeMessageStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeMessageStorage.swift; sourceTree = ""; }; @@ -3721,7 +3785,6 @@ 31951E9328230D8900CAF535 /* Shared */ = { isa = PBXGroup; children = ( - F4C9FBF428340DDA002281CC /* AutofillInterfaceEmailTruncator.swift */, 31A42563285A09E800049386 /* FaviconView.swift */, 31A42565285A0A6300049386 /* FaviconViewModel.swift */, C160544029D6044D00B715A1 /* AutofillInterfaceUsernameTruncator.swift */, @@ -5329,6 +5392,16 @@ name = AutofillLoginUI; sourceTree = ""; }; + C1C1FF442D085A280017ACCE /* CredentialProviderListDetails */ = { + isa = PBXGroup; + children = ( + C1C1FF412D085A280017ACCE /* CredentialProviderListDetailsView.swift */, + C1C1FF422D085A280017ACCE /* CredentialProviderListDetailsViewController.swift */, + C1C1FF432D085A280017ACCE /* CredentialProviderListDetailsViewModel.swift */, + ); + path = CredentialProviderListDetails; + sourceTree = ""; + }; C1CAA3D52A630ECB00807703 /* EmailSignup */ = { isa = PBXGroup; children = ( @@ -5355,6 +5428,7 @@ C1EF5B252CC0457B002980E6 /* CredentialProviderViewController.swift */, C1CAAA682CF8B8C400C37EE6 /* CredentialProviderActivation */, C1CAAA862CF9FFBE00C37EE6 /* CredentialProviderList */, + C1C1FF442D085A280017ACCE /* CredentialProviderListDetails */, C1CAAA6E2CF8BBC900C37EE6 /* Extensions */, C1CAAA742CF8BDC400C37EE6 /* Resources */, C1CAAAA42CFCBD6B00C37EE6 /* Shared */, @@ -5398,6 +5472,8 @@ C1CAAA962CFCAB8000C37EE6 /* Autofill */ = { isa = PBXGroup; children = ( + C1C1FF482D085A4C0017ACCE /* AutofillInterfaceEmailTruncator.swift */, + C1C1FF492D085A4C0017ACCE /* PasswordHider.swift */, C19D90D02CFE3A7F00D17DF3 /* AutofillLoginListSectionType.swift */, C1CAAA992CFCAD3E00C37EE6 /* AutofillLoginItem.swift */, C1CAAA9B2CFCB39800C37EE6 /* AutofillLoginListSorting.swift */, @@ -5416,7 +5492,11 @@ C1CAAAA42CFCBD6B00C37EE6 /* Shared */ = { isa = PBXGroup; children = ( + C1C1FF4C2D085AD70017ACCE /* ActionMessageView.swift */, + C1C1FF4D2D085AD70017ACCE /* ActionMessageView.xib */, + C1C1FF4E2D085AD70017ACCE /* FaviconHelper.swift */, C1CAAAA52CFCBD7900C37EE6 /* LockScreenView.swift */, + C1C1FF4F2D085AD70017ACCE /* NibLoading.swift */, C1CAAAA92CFCC13E00C37EE6 /* SecureVaultReporter.swift */, C13C076B2D00A6B7006386CF /* VaultCredentialManager.swift */, ); @@ -5439,6 +5519,8 @@ C1CAAA6D2CF8BBBC00C37EE6 /* CredentialProvider */, C1CAAA672CF8B74200C37EE6 /* AutofillCredentialProviderAlpha.entitlements */, C1EF5B2A2CC0457B002980E6 /* Info.plist */, + C1E4E9A72D0861AD00AA39AF /* Localizable.strings */, + C1E4E9A42D0861AD00AA39AF /* InfoPlist.strings */, C1EF5B2B2CC0457B002980E6 /* AutofillCredentialProvider.entitlements */, ); path = AutofillCredentialProvider; @@ -6633,7 +6715,6 @@ C1D21E2C293A5965006E5A05 /* AutofillLoginSession.swift */, C1CDA3152AFB9C7F006D1476 /* AutofillNeverPromptWebsitesManager.swift */, C13B32D12A0E750700A59236 /* AutofillSettingStatus.swift */, - 319A370F28299A850079FBCE /* PasswordHider.swift */, 31C70B5428045E3500FB6AD1 /* SecureVaultReporter.swift */, C1AFFC4B2B8773060060448E /* AuthConfirmation */, F407605328131910006B1E0B /* AutofillLoginUI */, @@ -7396,6 +7477,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C1C1FF502D085AD70017ACCE /* ActionMessageView.xib in Resources */, + C1E4E9A92D0861AD00AA39AF /* Localizable.strings in Resources */, + C1E4E9A62D0861AD00AA39AF /* InfoPlist.strings in Resources */, C1CAAA7A2CF8BE0200C37EE6 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -7616,7 +7700,6 @@ 6F03CAFE2C32DD08004179A8 /* HomePageMessagesConfiguration.swift in Sources */, 851952682CE2522700578553 /* AutocompleteSuggestionsDataSource.swift in Sources */, EE9D68D12AE00CF300B55EF4 /* NetworkProtectionVPNSettingsView.swift in Sources */, - 319A371028299A850079FBCE /* PasswordHider.swift in Sources */, 982C87C42255559A00919035 /* UITableViewCellExtension.swift in Sources */, B623C1C42862CD670043013E /* WKDownloadSession.swift in Sources */, 6FD1BAE42B87A107000C475C /* AdAttributionPixelReporter.swift in Sources */, @@ -7865,7 +7948,6 @@ 6F5CC0812C2AFFE400AFC840 /* ToggleExpandButtonStyle.swift in Sources */, D68A21462B7EC16200BB372E /* SubscriptionExternalLinkViewModel.swift in Sources */, 31DE43C22C2C480D00F8C51F /* DuckPlayerFeaturePresentationView.swift in Sources */, - F4C9FBF528340DDA002281CC /* AutofillInterfaceEmailTruncator.swift in Sources */, 1E016AB42949FEB500F21625 /* OmniBarNotificationViewModel.swift in Sources */, 6AC6DAB328804F97002723C0 /* BarsAnimator.swift in Sources */, CB4FA44E2C78AACE00A16F5A /* SpecialErrorPageUserScript.swift in Sources */, @@ -8536,8 +8618,14 @@ C1CAAA9E2CFCB78700C37EE6 /* UIColorExtension.swift in Sources */, C1CAAA8A2CF9FFF300C37EE6 /* CredentialProviderListViewModel.swift in Sources */, C1CAAAA02CFCB7C200C37EE6 /* UImageExtension.swift in Sources */, + C1C1FF512D085AD70017ACCE /* FaviconHelper.swift in Sources */, + C1C1FF522D085AD70017ACCE /* ActionMessageView.swift in Sources */, + C1C1FF532D085AD70017ACCE /* NibLoading.swift in Sources */, C177D9F62CFDDFEB0039CBF7 /* UIAlertControllerExtension.swift in Sources */, C1CAAA882CF9FFE100C37EE6 /* CredentialProviderListViewController.swift in Sources */, + C1C1FF452D085A280017ACCE /* CredentialProviderListDetailsView.swift in Sources */, + C1C1FF462D085A280017ACCE /* CredentialProviderListDetailsViewController.swift in Sources */, + C1C1FF472D085A280017ACCE /* CredentialProviderListDetailsViewModel.swift in Sources */, C1CAAAAA2CFCC13E00C37EE6 /* SecureVaultReporter.swift in Sources */, C1CAAAA82CFCBE4800C37EE6 /* EmptySearchView.swift in Sources */, ); @@ -8577,6 +8665,8 @@ 85BDC3192436161C0053DB07 /* LoginFormDetectionUserScript.swift in Sources */, 37DF000A29F9C416002B7D3E /* SyncMetadataDatabase.swift in Sources */, F143C3291E4A9A0E00CFDE3A /* URLExtension.swift in Sources */, + C1C1FF4A2D085A4C0017ACCE /* AutofillInterfaceEmailTruncator.swift in Sources */, + C1C1FF4B2D085A4C0017ACCE /* PasswordHider.swift in Sources */, 85E065BC2C73A54700D73E2A /* UsageSegmentationStorage.swift in Sources */, F143C3271E4A9A0E00CFDE3A /* Logger+Multiple.swift in Sources */, 85372447220DD103009D09CD /* UIKeyCommandExtension.swift in Sources */, @@ -9314,6 +9404,68 @@ name = OmniBar.xib; sourceTree = ""; }; + C1E4E9A42D0861AD00AA39AF /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + C1E4E9A52D0861AD00AA39AF /* bg */, + C164F9472D0861D600BAE88E /* cs */, + C18D7C412D08620D00FB3F87 /* da */, + C1DCF3502D0862330055F8B0 /* de */, + C174E08E2D08625300ACE1AF /* el */, + C1F883372D08627900DFF79A /* es */, + C1CB0AA52D08629800335287 /* et */, + C132F5A32D0862B8000C81D0 /* fi */, + C129DF092D0862D7007AB046 /* fr */, + C1406D862D0862F30082CB50 /* hr */, + C1B783DB2D0863110071C53B /* hu */, + C1FEDCEA2D08633100BFBF3F /* it */, + C1A001092D08635100372C87 /* lt */, + C12854D82D08636E00C8353F /* lv */, + C163677A2D08638C001D1094 /* nb */, + C1FE93E52D0863AA009F8F5E /* nl */, + C1453E322D0863C80024449B /* pl */, + C180CAFA2D0863E500ADB0FE /* pt */, + C1B7BF522D08640B0024FF56 /* ro */, + C1193F602D08642900CB3239 /* ru */, + C1588FC42D08644800C9BE70 /* sk */, + C1E490582D08646400F86C5A /* sl */, + C11C4D302D08648100288E85 /* sv */, + C14D37D62D08649E00FCFC59 /* tr */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + C1E4E9A72D0861AD00AA39AF /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + C1E4E9A82D0861AD00AA39AF /* bg */, + C164F9482D0861D600BAE88E /* cs */, + C18D7C422D08620D00FB3F87 /* da */, + C1DCF3512D0862330055F8B0 /* de */, + C174E08F2D08625300ACE1AF /* el */, + C1F883382D08627900DFF79A /* es */, + C1CB0AA62D08629800335287 /* et */, + C132F5A42D0862B8000C81D0 /* fi */, + C129DF0A2D0862D7007AB046 /* fr */, + C1406D872D0862F30082CB50 /* hr */, + C1B783DC2D0863110071C53B /* hu */, + C1FEDCEB2D08633100BFBF3F /* it */, + C1A0010A2D08635100372C87 /* lt */, + C12854D92D08636E00C8353F /* lv */, + C163677B2D08638C001D1094 /* nb */, + C1FE93E62D0863AA009F8F5E /* nl */, + C1453E332D0863C80024449B /* pl */, + C180CAFB2D0863E500ADB0FE /* pt */, + C1B7BF532D08640B0024FF56 /* ro */, + C1193F612D08642900CB3239 /* ru */, + C1588FC52D08644800C9BE70 /* sk */, + C1E490592D08646400F86C5A /* sl */, + C11C4D312D08648100288E85 /* sv */, + C14D37D72D08649E00FCFC59 /* tr */, + ); + name = Localizable.strings; + sourceTree = ""; + }; CB1143DC2AF6D4B600C1CCD3 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -10357,7 +10509,7 @@ ); MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.AutofillCredentialProvider; + PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.CredentialExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SKIP_INSTALL = YES; @@ -10435,7 +10587,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.alpha.CredentialExtension; PRODUCT_NAME = "$(TARGET_NAME)"; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AdHoc com.duckduckgo.mobile.ios.alpha.CredentialExtension"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.duckduckgo.mobile.ios.alpha.CredentialExtension"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -10472,8 +10624,9 @@ ); LOCALIZATION_PREFERS_STRING_CATALOGS = NO; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.AutofillCredentialProvider; + PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.CredentialExtension; PRODUCT_NAME = "$(TARGET_NAME)"; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore com.duckduckgo.mobile.ios.CredentialExtension"; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; diff --git a/DuckDuckGo/AppDelegate.swift b/DuckDuckGo/AppDelegate.swift index 75296ae8ea..38ff685038 100644 --- a/DuckDuckGo/AppDelegate.swift +++ b/DuckDuckGo/AppDelegate.swift @@ -1108,7 +1108,7 @@ import os.log autofillPixelReporter = AutofillPixelReporter( userDefaults: .standard, autofillEnabled: AppDependencyProvider.shared.appSettings.autofillCredentialsEnabled, - eventMapping: EventMapping {event, _, params, _ in + eventMapping: EventMapping {[weak self] event, _, params, _ in switch event { case .autofillActiveUser: Pixel.fire(pixel: .autofillActiveUser) @@ -1118,8 +1118,16 @@ import os.log Pixel.fire(pixel: .autofillOnboardedUser) case .autofillToggledOn: Pixel.fire(pixel: .autofillToggledOn, withAdditionalParameters: params ?? [:]) + if let autofillExtensionToggled = self?.autofillUsageMonitor.autofillExtensionEnabled { + Pixel.fire(pixel: autofillExtensionToggled ? .autofillExtensionToggledOn : .autofillExtensionToggledOff, + withAdditionalParameters: params ?? [:]) + } case .autofillToggledOff: Pixel.fire(pixel: .autofillToggledOff, withAdditionalParameters: params ?? [:]) + if let autofillExtensionToggled = self?.autofillUsageMonitor.autofillExtensionEnabled { + Pixel.fire(pixel: autofillExtensionToggled ? .autofillExtensionToggledOn : .autofillExtensionToggledOff, + withAdditionalParameters: params ?? [:]) + } case .autofillLoginsStacked: Pixel.fire(pixel: .autofillLoginsStacked, withAdditionalParameters: params ?? [:]) default: diff --git a/DuckDuckGo/AutofillLoginPromptViewModel.swift b/DuckDuckGo/AutofillLoginPromptViewModel.swift index da3a3e551a..4193ba26af 100644 --- a/DuckDuckGo/AutofillLoginPromptViewModel.swift +++ b/DuckDuckGo/AutofillLoginPromptViewModel.swift @@ -20,6 +20,7 @@ import Foundation import UIKit import BrowserServicesKit +import Core protocol AutofillLoginPromptViewModelDelegate: AnyObject { func autofillLoginPromptViewModel(_ viewModel: AutofillLoginPromptViewModel, didSelectAccount account: SecureVaultModels.WebsiteAccount) diff --git a/DuckDuckGo/AutofillUsageMonitor.swift b/DuckDuckGo/AutofillUsageMonitor.swift index 4302aec266..5c9f9bf87f 100644 --- a/DuckDuckGo/AutofillUsageMonitor.swift +++ b/DuckDuckGo/AutofillUsageMonitor.swift @@ -18,13 +18,28 @@ // import Core +import AuthenticationServices final class AutofillUsageMonitor { init() { NotificationCenter.default.addObserver(self, selector: #selector(didReceiveSaveEvent), name: .autofillSaveEvent, object: nil) + + ASCredentialIdentityStore.shared.getState({ state in + if state.isEnabled { + self.autofillExtensionEnabled = true + } else { + if self.autofillExtensionEnabled != nil { + Pixel.fire(pixel: .autofillExtensionDisabled) + self.autofillExtensionEnabled = false + } + } + }) } - + + @UserDefaultsWrapper(key: .autofillExtensionEnabled, defaultValue: nil) + var autofillExtensionEnabled: Bool? + @UserDefaultsWrapper(key: .autofillFirstTimeUser, defaultValue: true) private var autofillFirstTimeUser: Bool diff --git a/DuckDuckGo/DuckDuckGo.entitlements b/DuckDuckGo/DuckDuckGo.entitlements index b798cc1099..ee77dff2bf 100644 --- a/DuckDuckGo/DuckDuckGo.entitlements +++ b/DuckDuckGo/DuckDuckGo.entitlements @@ -2,6 +2,8 @@ + com.apple.developer.authentication-services.autofill-credential-provider + com.apple.developer.browser.app-installation com.apple.developer.networking.networkextension diff --git a/DuckDuckGoTests/AutofillInterfaceEmailTruncatorTests.swift b/DuckDuckGoTests/AutofillInterfaceEmailTruncatorTests.swift index c247ea0d97..a3d9340697 100644 --- a/DuckDuckGoTests/AutofillInterfaceEmailTruncatorTests.swift +++ b/DuckDuckGoTests/AutofillInterfaceEmailTruncatorTests.swift @@ -18,6 +18,7 @@ // import XCTest +import Core @testable import DuckDuckGo class AutofillInterfaceEmailTruncatorTests: XCTestCase { diff --git a/adhocExportOptions.plist b/adhocExportOptions.plist index 8af7edc154..de2b86d155 100644 --- a/adhocExportOptions.plist +++ b/adhocExportOptions.plist @@ -25,6 +25,9 @@ com.duckduckgo.mobile.ios.NetworkExtension match AdHoc com.duckduckgo.mobile.ios.NetworkExtension + + com.duckduckgo.mobile.ios.CredentialExtension + match AdHoc com.duckduckgo.mobile.ios.CredentialExtension diff --git a/appStoreExportOptions.plist b/appStoreExportOptions.plist index ff60631b5c..ed346823e8 100644 --- a/appStoreExportOptions.plist +++ b/appStoreExportOptions.plist @@ -18,6 +18,8 @@ match AppStore com.duckduckgo.mobile.ios.Widgets com.duckduckgo.mobile.ios.NetworkExtension match AppStore com.duckduckgo.mobile.ios.NetworkExtension + com.duckduckgo.mobile.ios.CredentialExtension + match AppStore com.duckduckgo.mobile.ios.CredentialExtension diff --git a/fastlane/Matchfile b/fastlane/Matchfile index 4212b95ef5..f577d97171 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -4,7 +4,7 @@ git_branch "ios" platform "ios" type "appstore" -app_identifier ["com.duckduckgo.mobile.ios", "com.duckduckgo.mobile.ios.ShareExtension", "com.duckduckgo.mobile.ios.OpenAction2", "com.duckduckgo.mobile.ios.Widgets", "com.duckduckgo.mobile.ios.NetworkExtension"] +app_identifier ["com.duckduckgo.mobile.ios", "com.duckduckgo.mobile.ios.ShareExtension", "com.duckduckgo.mobile.ios.OpenAction2", "com.duckduckgo.mobile.ios.Widgets", "com.duckduckgo.mobile.ios.NetworkExtension", "com.duckduckgo.mobile.ios.CredentialExtension"] generate_apple_certs false for_lane :sync_signing_adhoc do @@ -21,7 +21,7 @@ end for_lane :adhoc do type "adhoc" - app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension"] + app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension", "com.duckduckgo.mobile.ios.alpha.CredentialExtension"] force_for_new_devices true template_name "Default Web Browser iOS (Dist)" end @@ -40,11 +40,11 @@ for_lane :alpha_adhoc do end for_lane :sync_signing_alpha do - app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension"] + app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension", "com.duckduckgo.mobile.ios.alpha.CredentialExtension"] template_name "Default Web Browser iOS (Dist)" end for_lane :release_alpha do - app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension"] + app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension", "com.duckduckgo.mobile.ios.alpha.CredentialExtension"] template_name "Default Web Browser iOS (Dist)" end From 759aedbacce499a738cf109868d7f1d79c27d982 Mon Sep 17 00:00:00 2001 From: bwaresiak Date: Tue, 10 Dec 2024 15:03:52 +0100 Subject: [PATCH 30/66] Release 7.149.0-0 (#3708) Please make sure all GH checks passed before merging. It can take around 20 minutes. Briefly review this PR to see if there are no issues or red flags and then merge it. --- fastlane/metadata/default/release_notes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/default/release_notes.txt b/fastlane/metadata/default/release_notes.txt index 098fd1666f..66b16c0810 100644 --- a/fastlane/metadata/default/release_notes.txt +++ b/fastlane/metadata/default/release_notes.txt @@ -1 +1 @@ -- Bug fixes and other improvements. \ No newline at end of file +- Bug fixes and other improvements \ No newline at end of file From d43e29d71b4cd174db2740be3649f289fc70974d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20=C5=9Apiewak?= Date: Tue, 10 Dec 2024 16:48:19 +0100 Subject: [PATCH 31/66] Fix sending pixel when dismissing keyboard on NTP (#3709) Task/Issue URL: https://app.asana.com/0/1206226850447395/1208763673835126/f Tech Design URL: CC: **Description**: Fixed a few issues with sending pixel while dismissing keyboard with a swipe gesture: 1. Prevented sending pixel twice with a long gesture. 2. Fixed `isDragging` to set when swiping upwards. 3. Prevented stuttering of view while doing the scroll gesture with keyboard present. **Steps to test this PR**: Observe a **single** `m.addressbar.focus.dismiss.gesture` being sent while on a NTP with favorites and: 1. Dismissing keyboard by scrolling up 1. Dismissing keyboard by scrolling down 1. Dismissing keyboard by scrolling continuously up and down **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- DuckDuckGo/MainViewController.swift | 5 ++++- DuckDuckGo/NewTabPageView.swift | 4 +++- DuckDuckGo/SimpleNewTabPageView.swift | 4 +++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index 565f096fd9..d142c865e7 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -525,6 +525,7 @@ class MainViewController: UIViewController { var keyboardShowing = false + private var didSendGestureDismissPixel: Bool = false @objc private func keyboardDidShow() { @@ -533,14 +534,16 @@ class MainViewController: UIViewController { @objc private func keyboardWillHide() { - if newTabPageViewController?.isDragging == true, keyboardShowing { + if !didSendGestureDismissPixel, newTabPageViewController?.isDragging == true, keyboardShowing { Pixel.fire(pixel: .addressBarGestureDismiss) + didSendGestureDismissPixel = true } } @objc private func keyboardDidHide() { keyboardShowing = false + didSendGestureDismissPixel = false } private func registerForPageRefreshPatterns() { diff --git a/DuckDuckGo/NewTabPageView.swift b/DuckDuckGo/NewTabPageView.swift index 219ddd9c27..0add43c1c9 100644 --- a/DuckDuckGo/NewTabPageView.swift +++ b/DuckDuckGo/NewTabPageView.swift @@ -76,7 +76,7 @@ struct NewTabPageView: View { .simultaneousGesture( DragGesture() .onChanged({ value in - if value.translation.height > 0 { + if value.translation.height != 0 { viewModel.beginDragging() } }) @@ -154,6 +154,8 @@ private extension NewTabPageView { EmptyView() } } + // Prevent recreating geomery reader when keyboard is shown/hidden. + .ignoresSafeArea(.keyboard) } @ViewBuilder diff --git a/DuckDuckGo/SimpleNewTabPageView.swift b/DuckDuckGo/SimpleNewTabPageView.swift index a228686ef5..a4fae0632b 100644 --- a/DuckDuckGo/SimpleNewTabPageView.swift +++ b/DuckDuckGo/SimpleNewTabPageView.swift @@ -49,7 +49,7 @@ struct SimpleNewTabPageView: View { .simultaneousGesture( DragGesture() .onChanged({ value in - if value.translation.height > 0 { + if value.translation.height != 0.0 { viewModel.beginDragging() } }) @@ -85,6 +85,8 @@ private extension SimpleNewTabPageView { } .withScrollKeyboardDismiss() } + // Prevent recreating geomery reader when keyboard is shown/hidden. + .ignoresSafeArea(.keyboard) } @ViewBuilder From 5a5104b789d18cae63ca9dc7e52c188d0793d56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20=C5=81yp?= Date: Tue, 10 Dec 2024 18:46:03 +0100 Subject: [PATCH 32/66] Add DoubleBackground state (#3710) Task/Issue URL: https://app.asana.com/0/0/1208930420896743/f **Description**: Add DoubleBackground state to discover what events are called after we end up in this weird state. --- .../AppLifecycle/AppStateTransitions.swift | 35 +++++++++++++++++-- .../AppLifecycle/AppStates/Background.swift | 4 +++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/DuckDuckGo/AppLifecycle/AppStateTransitions.swift b/DuckDuckGo/AppLifecycle/AppStateTransitions.swift index a7c2a11f90..e7a5df5fbd 100644 --- a/DuckDuckGo/AppLifecycle/AppStateTransitions.swift +++ b/DuckDuckGo/AppLifecycle/AppStateTransitions.swift @@ -90,17 +90,48 @@ extension Background { return Active(application: application) case .openURL: return self - case .launching, .suspending, .backgrounding: + case .backgrounding: + return DoubleBackground() + case .launching, .suspending: return handleUnexpectedEvent(event) } } } +extension DoubleBackground { + + func apply(event: AppEvent) -> any AppState { + // report event so we know what events can be called at this moment, but do not let SM be stuck in this state just not to be flooded with these events + _ = handleUnexpectedEvent(event) + + switch event { + case .activating(let application): + return Active(application: application) + case .suspending(let application): + return Inactive(application: application) + case .launching, .backgrounding, .openURL: + return self + } + + } + +} + extension InactiveBackground { func apply(event: AppEvent) -> any AppState { - handleUnexpectedEvent(event) + // report event so we know what events can be called at this moment, but do not let SM be stuck in this state just not to be flooded with these events + _ = handleUnexpectedEvent(event) + + switch event { + case .activating(let application): + return Active(application: application) + case .suspending(let application): + return Inactive(application: application) + case .launching, .backgrounding, .openURL: + return self + } } } diff --git a/DuckDuckGo/AppLifecycle/AppStates/Background.swift b/DuckDuckGo/AppLifecycle/AppStates/Background.swift index 9332e41b6b..71b0ab4c1a 100644 --- a/DuckDuckGo/AppLifecycle/AppStates/Background.swift +++ b/DuckDuckGo/AppLifecycle/AppStates/Background.swift @@ -26,3 +26,7 @@ struct Background: AppState { } } + +struct DoubleBackground: AppState { + +} From 8483c96576e023e039a18e3a02d4fc8968b6f1b5 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Wed, 11 Dec 2024 13:17:36 +0100 Subject: [PATCH 33/66] Import VPN translations (#3713) Task/Issue URL: https://app.asana.com/0/0/1208750072186506/f **Description**: Update final batch of VPN related translations related to tool tips **Steps to test this PR**: Verify translations on VPN tooltips. --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- DuckDuckGo/bg.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/cs.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/da.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/de.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/el.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/es.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/et.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/fi.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/fr.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/hr.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/hu.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/it.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/lt.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/lv.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/nb.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/nl.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/pl.lproj/Localizable.strings | 35 ++++++++++++++++++- DuckDuckGo/pt.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/ro.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/ru.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/sk.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/sl.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/sv.lproj/Localizable.strings | 33 +++++++++++++++++ DuckDuckGo/tr.lproj/Localizable.strings | 33 +++++++++++++++++ .../bg.lproj/Localizable.strings | 9 +++++ .../cs.lproj/Localizable.strings | 9 +++++ .../da.lproj/Localizable.strings | 9 +++++ .../de.lproj/Localizable.strings | 9 +++++ .../el.lproj/Localizable.strings | 9 +++++ .../es.lproj/Localizable.strings | 9 +++++ .../et.lproj/Localizable.strings | 9 +++++ .../fi.lproj/Localizable.strings | 9 +++++ .../fr.lproj/Localizable.strings | 9 +++++ .../hr.lproj/Localizable.strings | 9 +++++ .../hu.lproj/Localizable.strings | 9 +++++ .../it.lproj/Localizable.strings | 9 +++++ .../lt.lproj/Localizable.strings | 9 +++++ .../lv.lproj/Localizable.strings | 9 +++++ .../nb.lproj/Localizable.strings | 9 +++++ .../nl.lproj/Localizable.strings | 9 +++++ .../pl.lproj/Localizable.strings | 9 +++++ .../pt.lproj/Localizable.strings | 9 +++++ .../ro.lproj/Localizable.strings | 9 +++++ .../ru.lproj/Localizable.strings | 9 +++++ .../sk.lproj/Localizable.strings | 9 +++++ .../sl.lproj/Localizable.strings | 9 +++++ .../sv.lproj/Localizable.strings | 9 +++++ .../tr.lproj/Localizable.strings | 9 +++++ 48 files changed, 1009 insertions(+), 1 deletion(-) diff --git a/DuckDuckGo/bg.lproj/Localizable.strings b/DuckDuckGo/bg.lproj/Localizable.strings index c9119ecf9c..cd11e8d970 100644 --- a/DuckDuckGo/bg.lproj/Localizable.strings +++ b/DuckDuckGo/bg.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Добави приспособлението"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Можете да включвате и изключвате VPN направо от началния екран."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Добавете приспособлението VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN връзката е прекъсната поради изтекъл абонамент. Абонирайте се за Privacy Pro, за да свържете отново DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN не можа да се свърже. Моля, опитайте отново по-късно."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Често задавани въпроси за DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Можете да персонализирате Вашето VPN местоположение, като се свържете с някой от нашите сървъри по целия свят."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Променете Вашето местоположение"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN беше прекъснат. Извършва се опит за повторно свързване..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Въведете кода за покана, за да започнете."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Отваряне на VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Научете повече"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Можете да използвате сайтове или приложения, които блокират VPN трафика, като изключите временно VPN връзката."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Така ще избегнете на конфликти с VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN е отложен за %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN е включен. Вашето местоположение и онлайн активност са защитени."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Трафикът на устройството се маршрутизира през %@."; diff --git a/DuckDuckGo/cs.lproj/Localizable.strings b/DuckDuckGo/cs.lproj/Localizable.strings index dc284b9e84..7676ec73c4 100644 --- a/DuckDuckGo/cs.lproj/Localizable.strings +++ b/DuckDuckGo/cs.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "VPN DuckDuckGo"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Přidat widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "VPN budeš moct zapnout nebo vypnout přímo na domovské obrazovce."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Přidej si VPN widget"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN byla odpojena kvůli vypršení platnosti předplatného. Předplať si službu Privacy Pro, ať můžeš DuckDuckGo VPN dál používat."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "VPN DuckDuckGo se nepodařilo připojit. Zkus to znovu později."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Nejčastější dotazy ohledně VPN DuckDuckGo"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Polohu VPN si můžeš přizpůsobit připojením ke kterémukoli z našich serverů po celém světě."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Změň si polohu"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "VPN DuckDuckGo byla odpojená. Probíhá pokus o opětovné připojení..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Zadej svůj kód pozvánky, ať můžeš začít."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Otevřít VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Více informací"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Pokud web nebo aplikace blokuje provoz přes VPN, stačí VPN připojení dočasně pozastavit."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Předcházej konfliktům VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je uspaná na %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "VPN DuckDuckGo je zapnutá. Tvoje poloha a online aktivita jsou chráněné."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Směrování provozu zařízení přes %@."; diff --git a/DuckDuckGo/da.lproj/Localizable.strings b/DuckDuckGo/da.lproj/Localizable.strings index 070caec29b..20065306df 100644 --- a/DuckDuckGo/da.lproj/Localizable.strings +++ b/DuckDuckGo/da.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Tilføj widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Slå VPN til og fra direkte fra startskærmen."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Tilføj VPN-widget"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN er afbrudt på grund af et udløbet abonnement. Abonner på Privacy Pro for at genoprette forbindelsen til DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN kunne ikke oprette forbindelse. Prøv igen senere."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Ofte stillede spørgsmål om DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Du kan vælge din VPN-placering ved at oprette forbindelse til hvilken som helst af vores servere i hele verden."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Skift din placering"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN blev afbrudt. Forsøger at genoprette forbindelse ..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Indtast din invitationskode for at komme i gang."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Åbn VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Mere info"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Du kan bruge websteder eller apps, der blokerer VPN-trafik, ved at \"snooze\" VPN-forbindelsen."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Undgå VPN-konflikter"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN er sat på pause i %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN er tændt. Din placering og onlineaktivitet er beskyttet."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Router enhedens trafik gennem %@."; diff --git a/DuckDuckGo/de.lproj/Localizable.strings b/DuckDuckGo/de.lproj/Localizable.strings index 3d80717d2b..6d6b3fe1b7 100644 --- a/DuckDuckGo/de.lproj/Localizable.strings +++ b/DuckDuckGo/de.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo-VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Widget hinzufügen"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Schalte das VPN direkt vom Startbildschirm ein und aus."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "VPN-Widget hinzufügen"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN aufgrund abgelaufenen Abonnements getrennt. Abonniere Privacy Pro, um die Verbindung zum DuckDuckGo-VPN wiederherzustellen."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN konnte keine Verbindung herstellen. Bitte versuche es zu einem späteren Zeitpunkt erneut."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Häufig gestellte Fragen zu DuckDuckGo-VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Du kannst deinen VPN-Standort anpassen, indem du dich mit einem unserer Server weltweit verbindest."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Standort ändern"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN wurde unterbrochen. Verbindung wird wiederhergestellt ..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Gib deinen Einladungscode ein, um loszulegen."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "VPN öffnen"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Mehr erfahren"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Du kannst Websites oder Apps verwenden, die VPN-Verkehr blockieren, indem du die VPN-Verbindung stumm schaltest."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "VPN-Konflikte vermeiden"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN ist für dich für %@ pausiert"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN ist aktiviert. Dein Standort und deine Online-Aktivitäten sind geschützt."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Geräteverkehr wird über %@ geleitet."; diff --git a/DuckDuckGo/el.lproj/Localizable.strings b/DuckDuckGo/el.lproj/Localizable.strings index fa28ef7b4a..ab107a549f 100644 --- a/DuckDuckGo/el.lproj/Localizable.strings +++ b/DuckDuckGo/el.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Προσθήκη γραφικού στοιχείου"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Ενεργοποιήστε και απενεργοποιήστε το VPN απευθείας από την Αρχική οθόνη."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Προσθήκη μικροεφαρμογής VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "Το VPN αποσυνδέθηκε λόγω λήξης της συνδρομής. Εγγραφείτε στο Privacy Pro για να συνδέσετε εκ νέου το DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Η σύνδεση του DuckDuckGo VPN απέτυχε. Ξαναδοκιμάστε αργότερα."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Συχνές ερωτήσεις DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Μπορείτε να προσαρμόσετε την τοποθεσία VPN σας μέσω σύνδεσης σε οποιονδήποτε από τους διακομιστές μας παγκοσμίως."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Αλλαγή της τοποθεσίας σας"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Το DuckDuckGo VPN διακόπηκε. Γίνεται προσπάθεια επανασύνδεσης τώρα..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Εισαγάγετε τον κωδικό πρόσκλησής σου για να αρχίσετε."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Ανοικτό VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Μάθετε περισσότερα"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Μπορείτε να χρησιμοποιήσετε ιστότοπους ή εφαρμογές που εμποδίζουν την κυκλοφορία VPN, αποκλείοντας τη σύνδεση VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Αποφυγή διενέξεων VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Το VPN τέθηκε σε αναστολή για %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Το DuckDuckGo VPN είναι ενεργοποιημένο. Η τοποθεσία και η διαδικτυακή δραστηριότητά σας προστατεύονται."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Δρομολόγηση κυκλοφορίας της συσκευής μέσω %@."; diff --git a/DuckDuckGo/es.lproj/Localizable.strings b/DuckDuckGo/es.lproj/Localizable.strings index 0cf44a3ced..832c808345 100644 --- a/DuckDuckGo/es.lproj/Localizable.strings +++ b/DuckDuckGo/es.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Añadir widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Activa y desactiva la VPN directamente desde la pantalla de inicio."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Añadir widget de VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN desconectada por suscripción caducada. Suscríbete a Privacy Pro para volver a conectar la VPN de DuckDuckGo."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "No se ha podido conectar la VPN de DuckDuckGo. Inténtalo de nuevo más tarde."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Preguntas frecuentes sobre DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Puedes personalizar la ubicación de tu VPN conectándote a cualquiera de nuestros servidores por todo el mundo."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Cambiar tu ubicación"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "La VPN de DuckDuckGo se ha interrumpido. Intentando volver a conectar ahora..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Introduce tu código de invitación para empezar."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Abrir VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Más información"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Puedes utilizar sitios o aplicaciones que bloquean el tráfico de VPN posponiendo la conexión VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Evitar conflictos de VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "La VPN está en modo de suspenso durante %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "La VPN de DuckDuckGo está activada. Tu ubicación y actividad en línea están protegidas."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Redirigiendo el tráfico de dispositivos a través de %@."; diff --git a/DuckDuckGo/et.lproj/Localizable.strings b/DuckDuckGo/et.lproj/Localizable.strings index dff82eb008..debc2d270a 100644 --- a/DuckDuckGo/et.lproj/Localizable.strings +++ b/DuckDuckGo/et.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Lisage vidin"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Lülitage VPN sisse ja välja otse avakuvalt."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "VPN vidina lisamine"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN-ühendus katkestati aegunud tellimuse tõttu. DuckDuckGo VPN-i taasühendamiseks telli Privacy Pro."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN-i ühendamine ebaõnnestus. Proovige hiljem uuesti."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN-i KKK"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Saate oma VPN-i asukohta kohandada, ühendades mõne meie serveriga kogu maailmas."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Muutke oma asukohta"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN katkestati. Proovin uuesti ühendust luua..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Alustamiseks sisesta oma kutsekood."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Ava VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Loe edasi"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "VPN-i liiklust blokeerivaid saite või rakendusi saate kasutada VPN-ühendust uinutades."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Vältige VPN-konflikte"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN on peatatud %@ jooksul"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN on sisse lülitatud. Teie asukoht ja võrgutegevus on kaitstud."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Seadme liiklus suunatakse läbi %@."; diff --git a/DuckDuckGo/fi.lproj/Localizable.strings b/DuckDuckGo/fi.lproj/Localizable.strings index 6c4a9e672a..8b910b5bff 100644 --- a/DuckDuckGo/fi.lproj/Localizable.strings +++ b/DuckDuckGo/fi.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Lisää widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Kytke VPN päälle ja pois päältä suoraan aloitusnäytöstä."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Lisää VPN-widget"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN katkaistu vanhentuneen tilauksen takia. Tilaa Privacy Pro, jotta voit yhdistää DuckDuckGo VPN:n uudelleen."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN ei onnistunut muodostamaan yhteyttä. Yritä myöhemmin uudelleen."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN – usein kysytyt kysymykset"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Voit mukauttaa VPN-sijaintisi muodostamalla yhteyden mihin tahansa palvelimistamme maailmanlaajuisesti."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Vaihda sijaintisi"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN keskeytyi. Yritetään muodostaa yhteys uudelleen..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Aloita antamalla kutsukoodisi."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Avaa VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Lue lisää"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Voit käyttää sivustoja tai sovelluksia, jotka estävät VPN-liikenteen torkuttamalla VPN-yhteyttä."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Vältä VPN-konfliktit"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN on lepotilassa %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN on päällä. Sijaintisi ja verkkotoimintasi on suojattu."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Laitteen liikenne reititetään %@ kautta."; diff --git a/DuckDuckGo/fr.lproj/Localizable.strings b/DuckDuckGo/fr.lproj/Localizable.strings index 3d1872e30b..37dc6fbcdf 100644 --- a/DuckDuckGo/fr.lproj/Localizable.strings +++ b/DuckDuckGo/fr.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "VPN DuckDuckGo"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Ajouter un widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Activez et désactivez le VPN directement depuis l’écran d’accueil."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Ajoutez un widget VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN déconnecté en raison de l'expiration de l'abonnement. Abonnez-vous à Privacy Pro pour reconnecter le VPN DuckDuckGo."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Le VPN DuckDuckGo n'a pas réussi à se connecter. Veuillez réessayer plus tard."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "FAQ VPN DuckDuckGo"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Vous pouvez personnaliser votre emplacement VPN en vous connectant à l’un de nos serveurs dans le monde entier."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Modifiez votre emplacement"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Le VPN DuckDuckGo a été interrompu. Tentative de reconnexion en cours…"; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Saisissez votre code d'invitation pour commencer."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Ouvrir le VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "En savoir plus"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Vous pouvez utiliser des sites ou des applications qui bloquent le trafic VPN en mettant en pause la connexion VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Évitez les conflits VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Le VPN est en veille pendant %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Le VPN DuckDuckGo est activé. Votre emplacement et votre activité en ligne sont protégés."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Routage du trafic de l'appareil via %@."; diff --git a/DuckDuckGo/hr.lproj/Localizable.strings b/DuckDuckGo/hr.lproj/Localizable.strings index 5fcc25d15b..5c79140a66 100644 --- a/DuckDuckGo/hr.lproj/Localizable.strings +++ b/DuckDuckGo/hr.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Dodaj widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Uključite i isključite VPN izravno s početnog zaslona."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Dodaj VPN widget"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN je prekinut zbog istekle pretplate. Pretplati se na Privacy Pro kako bi ponovno povezao DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN nije se mogao povezati. Pokušaj ponovno nešto kasnije."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Česta pitanja o DuckDuckGo VPN-u"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Svoju VPN lokaciju možete prilagoditi povezivanjem s bilo kojim od naših poslužitelja širom svijeta."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Promijeni svoju lokaciju"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN je prekinut. Sada se pokušava ponovno povezati..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Za početak, unesi svoj pozivni kôd."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Otvori VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Saznajte više"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Web stranice ili aplikacije koje blokiraju VPN promet možete upotrijebiti pauziranjem VPN veze."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Izbjegavaj VPN sukobe"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je u stanju mirovanja %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN je uključen. Tvoja lokacija i aktivnosti na internetu zaštićeni su."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Usmjeravanje prometa uređaja kroz %@."; diff --git a/DuckDuckGo/hu.lproj/Localizable.strings b/DuckDuckGo/hu.lproj/Localizable.strings index a653377e74..fa1d7a213b 100644 --- a/DuckDuckGo/hu.lproj/Localizable.strings +++ b/DuckDuckGo/hu.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Minialkalmazás hozzáadása"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Kapcsold be vagy ki a VPN-t közvetlenül a kezdőképernyőn."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "VPN-minialkalmazás hozzáadása"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "A VPN-kapcsolat megszakadt, mert lejárt az előfizetésed. Fizess elő a Privacy Pro szolgáltatásra a DuckDuckGo VPN újracsatlakoztatásához."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "A DuckDuckGo VPN nem tudott csatlakozni. Próbálkozz újra később."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN – gyakori kérdések"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Megválaszthatod a VPN szerinti tartózkodási helyedet, ha csatlakozol bármely, a világ különböző pontjain lévő szerverünkhöz."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Tartózkodási hely módosítása"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "A DuckDuckGo VPN-kapcsolat megszakadt. Újracsatlakozási kísérlet folyamatban…"; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "A kezdéshez írd be a meghívókódodat."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "VPN megnyitása"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "További részletek"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Olyan weboldalakat vagy alkalmazásokat is használhatsz, amelyek blokkolják a VPN-forgalmat, ha ideiglenesen szünetelteted a VPN-kapcsolatot."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "VPN-konfliktusok elkerülése"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN szüneteltetve ennyi időre: %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "A DuckDuckGo VPN be van kapcsolva. A tartózkodási helyed és az online tevékenységed védelme aktív."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Az eszköz forgalmának átirányítási helyszíne: %@."; diff --git a/DuckDuckGo/it.lproj/Localizable.strings b/DuckDuckGo/it.lproj/Localizable.strings index ea06160062..546e285a6f 100644 --- a/DuckDuckGo/it.lproj/Localizable.strings +++ b/DuckDuckGo/it.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "VPN DuckDuckGo"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Aggiungi widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Attiva e disattiva la VPN direttamente dalla schermata iniziale."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Aggiungi widget VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "La VPN si è scollegata perché l'abbonamento è scaduto. Iscriviti a Privacy Pro per riconnettere la VPN di DuckDuckGo."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "La VPN di DuckDuckGo non è riuscita a connettersi. Riprova in seguito."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Domande frequenti su DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Puoi personalizzare la tua posizione VPN connettendoti a uno qualsiasi dei nostri server in tutto il mondo."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Cambia posizione"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "La VPN di DuckDuckGo è stata interrotta. Tentativo di riconnessione in corso..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Inserisci il tuo codice invito per iniziare."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Apri VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Ulteriori informazioni"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Puoi utilizzare siti o app che bloccano il traffico VPN disattivando temporaneamente la connessione VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Evita i conflitti VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "La VPN è sospesa per %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "La VPN di DuckDuckGo è attiva. La tua posizione e le tue attività online sono protette."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Instradamento del traffico del dispositivo tramite %@."; diff --git a/DuckDuckGo/lt.lproj/Localizable.strings b/DuckDuckGo/lt.lproj/Localizable.strings index 9d04673094..ec407015d1 100644 --- a/DuckDuckGo/lt.lproj/Localizable.strings +++ b/DuckDuckGo/lt.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Pridėti valdiklį"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Įjungti ir išjungti VPN tiesiai iš pagrindinio ekrano."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Pridėti VPN valdiklį"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN atjungtas dėl pasibaigusios prenumeratos. „DuckDuckGo“ VPN galima naudoti nemokamai, kol veikia beta versija."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "„DuckDuckGo“ VPN nepavyko prisijungti. Bandykite dar kartą vėliau."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "„DuckDuckGo“ VPN DUK"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Galite pritaikyti savo VPN vietą prisijungdami prie bet kurio mūsų serverio visame pasaulyje."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Keisti savo vietą"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "„DuckDuckGo“ VPN buvo pertrauktas. Dabar bandome prisijungti..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Norėdami pradėti, įveskite kvietimo kodą."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Atviras VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Sužinoti daugiau"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Galite naudoti svetaines ar programas, kurios blokuoja VPN srautą, sulėtindamos VPN ryšį."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Vengti VPN konfliktų"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN pristabdytas %@ laikui"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "„DuckDuckGo“ VPN įjungtas. Jūsų vieta ir veikla internete yra apsaugota."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Nukreipiamas įrenginio srautas per %@."; diff --git a/DuckDuckGo/lv.lproj/Localizable.strings b/DuckDuckGo/lv.lproj/Localizable.strings index 1650416a2e..636cfb7053 100644 --- a/DuckDuckGo/lv.lproj/Localizable.strings +++ b/DuckDuckGo/lv.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Pievienot logrīku"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Ieslēdz un izslēdz VPN tieši no sākuma ekrāna."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Pievienot VPN logrīku"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN atvienots, jo ir beidzies abonements. Abonē Privacy Pro, lai atkārtoti izveidotu savienojumu ar DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Neizdevās izveidot savienojumu ar DuckDuckGo VPN. Lūdzu, mēģini vēlreiz vēlāk."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Bieži uzdotie jautājumi par DuckDuckGo VPN "; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Tu vari pielāgot savu VPN atrašanās vietu, izveidojot savienojumu ar jebkuru no mūsu serveriem visā pasaulē."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Mainīt atrašanās vietu"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN savienojums ir pārtraukts. Mēģina atjaunot savienojumu..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Ievadi savu ielūguma kodu, lai sāktu."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Atvērt VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Uzzināt vairāk"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Vari izmantot vietnes vai lietotnes, kas bloķē VPN trafiku, uz laiku pārtraucot VPN savienojumu."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Izvairīties no VPN konfliktiem"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN ir atslēgts uz %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN ir ieslēgts. Tava atrašanās vieta un darbības tiešsaistē ir aizsargātas."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Ierīces datplūsma tiek maršrutēta caur: %@."; diff --git a/DuckDuckGo/nb.lproj/Localizable.strings b/DuckDuckGo/nb.lproj/Localizable.strings index c7d4421dad..ccd9ca0330 100644 --- a/DuckDuckGo/nb.lproj/Localizable.strings +++ b/DuckDuckGo/nb.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Legg til widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Slå VPN av og på direkte på startskjermen."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Legg til VPN-widget"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN ble frakoblet på grunn av et utløpt abonnement. Abonner på Privacy Pro for å koble til DuckDuckGo-VPN igjen."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN mislyktes i å koble til. Prøv igjen senere."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Vanlige spørsmål om DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Du kan tilpasse VPN-plasseringen din ved å koble til en hvilken som helst av våre servere over hele verden."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Endre plassering"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN ble avbrutt. Prøver å koble til igjen nå..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Skriv inn invitasjonskoden din for å komme i gang."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Åpne VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Finn ut mer"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Du kan bruke nettsteder eller apper som blokkerer VPN-trafikk, ved å slumre VPN-tilkoblingen."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Unngå VPN-konflikter"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN satt på slumring i %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN er på. Plasseringen og nettaktiviteten din er beskyttet."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Omdirigerer enhetstrafikk gjennom %@."; diff --git a/DuckDuckGo/nl.lproj/Localizable.strings b/DuckDuckGo/nl.lproj/Localizable.strings index 3e161645f1..08efcd53a0 100644 --- a/DuckDuckGo/nl.lproj/Localizable.strings +++ b/DuckDuckGo/nl.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Widget toevoegen"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Schakel de VPN rechtstreeks vanaf het startscherm in en uit."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "VPN-widget toevoegen"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "De VPN-verbinding is verbroken omdat het abonnement is verlopen. Abonneer je op Privacy Pro om opnieuw verbinding te maken met DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN kon geen verbinding maken. Probeer het later opnieuw."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN FAQ"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Je kunt je VPN-locatie aanpassen door verbinding te maken met een van onze servers wereldwijd."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Wijzig je locatie"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN werd onderbroken. Er wordt geprobeerd opnieuw verbinding te maken ..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Voer je uitnodigingscode in om te beginnen."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "VPN openen"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Meer informatie"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Je kunt sites of apps gebruiken die VPN-verkeer blokkeren door de VPN-verbinding in sluimerstand te zetten."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "VPN-conflicten vermijden"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN in sluimerstand voor %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN is ingeschakeld. Je locatie en online-activiteiten zijn beschermd."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Apparaatverkeer routeren via %@."; diff --git a/DuckDuckGo/pl.lproj/Localizable.strings b/DuckDuckGo/pl.lproj/Localizable.strings index 2491e14b48..c91457fda0 100644 --- a/DuckDuckGo/pl.lproj/Localizable.strings +++ b/DuckDuckGo/pl.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Dodaj widżet"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Włączaj i wyłączaj VPN bezpośrednio z ekranu głównego."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Dodaj widżet VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "Sieć VPN została rozłączona z powodu wygasłej subskrypcji. Subskrybuj Privacy Pro, aby ponownie połączyć się z siecią DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Nie udało się nawiązać połączenia DuckDuckGo VPN. Spróbuj ponownie później."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN — często zadawane pytania"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Możesz dostosować lokalizację sieci VPN, łącząc się z dowolnym z naszych serwerów na całym świecie."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Zmień lokalizację"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Usługa DuckDuckGo VPN została przerwana. Próba ponownego połączenia..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Wprowadź swój kod zaproszenia, aby rozpocząć."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Otwórz VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Dowiedz się więcej"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Możesz korzystać z witryn lub aplikacji, które blokują ruch VPN, wstrzymując połączenie VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Unikaj konfliktów VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Wstrzymano VPN na %@"; @@ -1713,7 +1743,7 @@ "network.protection.status.snoozing.format" = "Wstrzymano, pozostało %@"; /* Snooze button title shown in NetworkProtection's status view. */ -"network.protection.status.view.action.snooze" = "Wstrzymano na 20 minut"; +"network.protection.status.view.action.snooze" = "Wstrzymaj na 20 minut"; /* Wake Up button title shown in NetworkProtection's status view. */ "network.protection.status.view.action.wake-up" = "Przywróć"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Usługa DuckDuckGo VPN jest włączona. Twoja lokalizacja i aktywność w Internecie są chronione."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Przekierowanie ruchu urządzenia przez %@."; diff --git a/DuckDuckGo/pt.lproj/Localizable.strings b/DuckDuckGo/pt.lproj/Localizable.strings index a4749d5bb0..5cf8042b4a 100644 --- a/DuckDuckGo/pt.lproj/Localizable.strings +++ b/DuckDuckGo/pt.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "VPN do DuckDuckGo"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Adicionar widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Ativa e desativa a VPN diretamente no ecrã inicial."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Adicionar widget de VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN desativada devido a subscrição expirada. Subscreve o Privacy Pro para voltar a ligar a DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "A VPN DuckDuckGo não conseguiu estabelecer ligação. Tenta novamente mais tarde."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Perguntas frequentes sobre a DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Podes personalizar a localização da tua VPN ligando-te a qualquer um dos nossos servidores em todo o mundo."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Alterar a localização"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "A VPN DuckDuckGo foi interrompida. A tentar ligar novamente…"; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Introduz o código de convite para começares."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Abrir VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Saiba mais"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Podes utilizar sites ou aplicações que bloqueiam o tráfego da VPN suspendendo a ligação VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Evitar conflitos de VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN suspensa por %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "A VPN DuckDuckGo está ativada. A tua localização e atividade online estão protegidas."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "A encaminhar o tráfego do dispositivo através de %@."; diff --git a/DuckDuckGo/ro.lproj/Localizable.strings b/DuckDuckGo/ro.lproj/Localizable.strings index 24bbf37dda..9bfa277d90 100644 --- a/DuckDuckGo/ro.lproj/Localizable.strings +++ b/DuckDuckGo/ro.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Adăugare widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Activează și dezactivează VPN-ul chiar din ecranul de pornire."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Adaugă widgetul VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN deconectat din cauza expirării abonamentului. Abonează-te la Privacy Pro pentru a reconecta DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN nu a reușit să se conecteze. Încearcă din nou mai târziu."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Întrebări frecvente despre DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Poți personaliza locația VPN-ului tău, conectându-te la oricare dintre serverele noastre din întreaga lume."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Schimbă-ți locația"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN a fost întrerupt. Se încearcă reconectarea acum..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Completează codul de invitație pentru a începe."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Deschide VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Află mai multe"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Poți utiliza site-uri sau aplicații care blochează traficul VPN, amânând conectarea la VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Evită conflictele VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN-ul este amânat pentru %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN este activat. Locația și activitatea ta online sunt protejate."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Dirijarea traficului dispozitivului prin %@."; diff --git a/DuckDuckGo/ru.lproj/Localizable.strings b/DuckDuckGo/ru.lproj/Localizable.strings index 369fe3b6f1..660e9b547e 100644 --- a/DuckDuckGo/ru.lproj/Localizable.strings +++ b/DuckDuckGo/ru.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Добавить виджет"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Включать и выключать VPN можно прямо с домашнего экрана."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Специальный VPN-виджет"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN отключен ввиду окончания подписки. Чтобы вновь подключиться к DuckDuckGo VPN, оформите подписку Privacy Pro."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Подключиться к DuckDuckGo VPN не удалось. Повторите попытку позже."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Часто задаваемые вопросы по DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Чтобы изменить свою VPN-геопозицию, достаточно подключиться к одному из наших серверов, расположенных по всему миру."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Выбор геопозиции"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Работа DuckDuckGo VPN была прервана. Выполняется попытка повторного подключения..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Для начала введите пригласительный код."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Открыть настройки VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Подробнее"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "VPN-соединение можно приостановить для посещения сайтов и приложений, которые блокируют трафик по VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Без проблем из-за VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Работа VPN отложена на %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN включен. Ваши геопозиция и онлайн-активность скрыты от посторонних глаз."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Трафик устройства направляется через: %@"; diff --git a/DuckDuckGo/sk.lproj/Localizable.strings b/DuckDuckGo/sk.lproj/Localizable.strings index 93d694f769..e8cd577412 100644 --- a/DuckDuckGo/sk.lproj/Localizable.strings +++ b/DuckDuckGo/sk.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Pridať miniaplikáciu"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Zapnite a vypnite sieť VPN priamo z úvodnej obrazovky."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Pridať miniaplikáciu VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN bola odpojená kvôli vypršaniu platnosti predplatného. Predplať si Privacy Pro, aby si znova pripojil/a DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN sa nepodarilo pripojiť. Skús to neskôr znova, prosím."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN - často kladené otázky"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Svoju polohu VPN môžete prispôsobiť pripojením k ktorémukoľvek z našich serverov na celom svete."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Zmeniť vašu polohu"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN bola prerušená. Prebieha pokus o opätovné pripojenie..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Začni zadaním pozývacieho kódu."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Otvoriť VPN sieť"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Zistite viac"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Môžete použiť stránky alebo aplikácie blokujúce prevádzku VPN tak, že prerušíte pripojenie VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Vyhýbanie sa konfliktom VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je pozastavená na %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN je zapnutá. Tvoja poloha a online aktivita sú chránené."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Smerovanie komunikácie zariadenia cez %@."; diff --git a/DuckDuckGo/sl.lproj/Localizable.strings b/DuckDuckGo/sl.lproj/Localizable.strings index 0b0a31f73f..eb3046fb6b 100644 --- a/DuckDuckGo/sl.lproj/Localizable.strings +++ b/DuckDuckGo/sl.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "VPN DuckDuckGo"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Dodaj gradnik"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Vklopite in izklopite VPN kar na začetnem zaslonu."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Dodajte pripomoček VPN"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN je prekinjen zaradi potekle naročnine. Naročite se na Privacy Pro, da znova povežete DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN se ni mogel povezati. Poskusite znova pozneje."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Pogosta vprašanja o omrežju VPN DuckDuckGo"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Svojo lokacijo VPN lahko prilagodite tako, da se povežete s katerim koli od naših strežnikov po vsem svetu."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Spremenite svojo lokacijo"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN je bil prekinjen. Poskušam se znova povezati zdaj ..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Za začetek vnesite kodo povabila."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Odpri VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Več"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Uporabljate lahko spletna mesta ali aplikacije, ki blokirajo promet VPN tako, da preložijo povezavo VPN."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Izogibanje konfliktom v omrežju VPN"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je preložen za %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Omrežje VPN DuckDuckGo je vklopljeno. Vaša lokacija in spletna dejavnost sta zaščiteni."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Usmerjanje prometa naprave prek kraja %@."; diff --git a/DuckDuckGo/sv.lproj/Localizable.strings b/DuckDuckGo/sv.lproj/Localizable.strings index a0b4cc2a22..77e833357c 100644 --- a/DuckDuckGo/sv.lproj/Localizable.strings +++ b/DuckDuckGo/sv.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Lägg till widget"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "Slå på och av VPN direkt från startskärmen."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "Lägg till VPN-widget"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN har kopplats från på grund av att abonnemanget har gått ut. Prenumerera på Privacy Pro för att återansluta DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN kunde inte ansluta. Försök igen senare."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "Vanliga frågor om DuckDuckGo VPN"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Du kan anpassa din VPN-plats genom att ansluta till någon av våra servrar som finns över hela världen."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Ändra din plats"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN avbröts. Försöker återuppta kontakten nu ..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Ange din inbjudningskod för att komma igång."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "Öppna VPN"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Läs mer"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "Du pausa VPN-anslutningen för att använda webbplatser eller appar som blockerar VPN-trafik."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "Undvik VPN-konflikter"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN har pausats i %@"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN är på. Din plats och onlineaktivitet är skyddad."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Dirigera enhetstrafik genom %@."; diff --git a/DuckDuckGo/tr.lproj/Localizable.strings b/DuckDuckGo/tr.lproj/Localizable.strings index d74006f752..d787a57ece 100644 --- a/DuckDuckGo/tr.lproj/Localizable.strings +++ b/DuckDuckGo/tr.lproj/Localizable.strings @@ -1646,12 +1646,33 @@ /* Title for the DuckDuckGo VPN feature */ "netP.title" = "DuckDuckGo VPN"; +/* Button title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.action" = "Widget ekle"; + +/* Message for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.message" = "VPN'i doğrudan Ana Ekrandan açın ve kapatın."; + +/* Title for tooltip about adding VPN widget */ +"network.protection.addwidget.tip.title" = "VPN Widget'ı Ekleyin"; + /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "Abonelik süresi dolduğu için VPN bağlantısı kesildi. DuckDuckGo VPN'e yeniden bağlanmak için Privacy Pro'ya abone olun."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN bağlanamadı. Lütfen daha sonra tekrar deneyin."; + /* Title for the VPN FAQ screen. */ "network.protection.faq.title" = "DuckDuckGo VPN Sıkça Sorulan Sorular"; +/* Message for tooltip about geoswitching */ +"network.protection.geoswitching.tip.message" = "Dünya genelindeki sunucularımızdan herhangi birine bağlanarak VPN konumunuzu özelleştirebilirsiniz."; + +/* Title for tooltip about geoswitching */ +"network.protection.geoswitching.tip.title" = "Konumunuzu Değiştirin"; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN kesintiye uğradı. Şimdi yeniden bağlanmaya çalışılıyor..."; + /* Message for the network protection invite dialog */ "network.protection.invite.dialog.message" = "Başlamak için davet kodunuzu girin."; @@ -1673,6 +1694,15 @@ /* Title text for an iOS quick action that opens VPN settings */ "network.protection.quick-action.open-vpn" = "VPN'i aç"; +/* Button title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.action" = "Daha fazla bilgi"; + +/* Message for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.message" = "VPN bağlantısını askıya alarak, VPN trafiğini engelleyen siteleri veya uygulamaları kullanabilirsiniz."; + +/* Title for tooltip about VPN snooze mode */ +"network.protection.snooze.tip.title" = "VPN Çakışmalarını Engelleyin"; + /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN %@ için uyku moduna alındı"; @@ -1742,6 +1772,9 @@ /* Title label text for the status view when netP is disconnected */ "network.protection.status.view.title" = "VPN"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN Açık. Konumunuz ve çevrimiçi etkinliğiniz korunuyor."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Cihaz trafiği %@ üzerinden yönlendiriliyor."; diff --git a/PacketTunnelProvider/bg.lproj/Localizable.strings b/PacketTunnelProvider/bg.lproj/Localizable.strings index c59fbcfef4..b4194a286c 100644 --- a/PacketTunnelProvider/bg.lproj/Localizable.strings +++ b/PacketTunnelProvider/bg.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN връзката е прекъсната поради изтекъл абонамент. Абонирайте се за Privacy Pro, за да свържете отново DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN не можа да се свърже. Моля, опитайте отново по-късно."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN беше прекъснат. Извършва се опит за повторно свързване..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN е отложен за %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN е включен. Вашето местоположение и онлайн активност са защитени."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Трафикът на устройството се маршрутизира през %@."; diff --git a/PacketTunnelProvider/cs.lproj/Localizable.strings b/PacketTunnelProvider/cs.lproj/Localizable.strings index 216fba3a8a..421f470f4d 100644 --- a/PacketTunnelProvider/cs.lproj/Localizable.strings +++ b/PacketTunnelProvider/cs.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN byla odpojena kvůli vypršení platnosti předplatného. Předplať si službu Privacy Pro, ať můžeš DuckDuckGo VPN dál používat."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "VPN DuckDuckGo se nepodařilo připojit. Zkus to znovu později."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "VPN DuckDuckGo byla odpojená. Probíhá pokus o opětovné připojení..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je uspaná na %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "VPN DuckDuckGo je zapnutá. Tvoje poloha a online aktivita jsou chráněné."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Směrování provozu zařízení přes %@."; diff --git a/PacketTunnelProvider/da.lproj/Localizable.strings b/PacketTunnelProvider/da.lproj/Localizable.strings index 2a772962d5..527fdc337d 100644 --- a/PacketTunnelProvider/da.lproj/Localizable.strings +++ b/PacketTunnelProvider/da.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN er afbrudt på grund af et udløbet abonnement. Abonner på Privacy Pro for at genoprette forbindelsen til DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN kunne ikke oprette forbindelse. Prøv igen senere."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN blev afbrudt. Forsøger at genoprette forbindelse ..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN er sat på pause i %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN er tændt. Din placering og onlineaktivitet er beskyttet."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Router enhedens trafik gennem %@."; diff --git a/PacketTunnelProvider/de.lproj/Localizable.strings b/PacketTunnelProvider/de.lproj/Localizable.strings index 3805046ef1..08398dccd0 100644 --- a/PacketTunnelProvider/de.lproj/Localizable.strings +++ b/PacketTunnelProvider/de.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN aufgrund abgelaufenen Abonnements getrennt. Abonniere Privacy Pro, um die Verbindung zum DuckDuckGo-VPN wiederherzustellen."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN konnte keine Verbindung herstellen. Bitte versuche es zu einem späteren Zeitpunkt erneut."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN wurde unterbrochen. Verbindung wird wiederhergestellt ..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN ist für dich für %@ pausiert"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN ist aktiviert. Dein Standort und deine Online-Aktivitäten sind geschützt."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Geräteverkehr wird über %@ geleitet."; diff --git a/PacketTunnelProvider/el.lproj/Localizable.strings b/PacketTunnelProvider/el.lproj/Localizable.strings index 64661e3caf..0d7bb891d0 100644 --- a/PacketTunnelProvider/el.lproj/Localizable.strings +++ b/PacketTunnelProvider/el.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "Το VPN αποσυνδέθηκε λόγω λήξης της συνδρομής. Εγγραφείτε στο Privacy Pro για να συνδέσετε εκ νέου το DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Η σύνδεση του DuckDuckGo VPN απέτυχε. Ξαναδοκιμάστε αργότερα."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Το DuckDuckGo VPN διακόπηκε. Γίνεται προσπάθεια επανασύνδεσης τώρα..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Το VPN τέθηκε σε αναστολή για %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Το DuckDuckGo VPN είναι ενεργοποιημένο. Η τοποθεσία και η διαδικτυακή δραστηριότητά σας προστατεύονται."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Δρομολόγηση κυκλοφορίας της συσκευής μέσω %@."; diff --git a/PacketTunnelProvider/es.lproj/Localizable.strings b/PacketTunnelProvider/es.lproj/Localizable.strings index 233ef0af28..91ac1cde9c 100644 --- a/PacketTunnelProvider/es.lproj/Localizable.strings +++ b/PacketTunnelProvider/es.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN desconectada por suscripción caducada. Suscríbete a Privacy Pro para volver a conectar la VPN de DuckDuckGo."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "No se ha podido conectar la VPN de DuckDuckGo. Inténtalo de nuevo más tarde."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "La VPN de DuckDuckGo se ha interrumpido. Intentando volver a conectar ahora..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "La VPN está en modo de suspenso durante %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "La VPN de DuckDuckGo está activada. Tu ubicación y actividad en línea están protegidas."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Redirigiendo el tráfico de dispositivos a través de %@."; diff --git a/PacketTunnelProvider/et.lproj/Localizable.strings b/PacketTunnelProvider/et.lproj/Localizable.strings index c94caf57f1..3bb5425b7b 100644 --- a/PacketTunnelProvider/et.lproj/Localizable.strings +++ b/PacketTunnelProvider/et.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN-ühendus katkestati aegunud tellimuse tõttu. DuckDuckGo VPN-i taasühendamiseks telli Privacy Pro."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN-i ühendamine ebaõnnestus. Proovige hiljem uuesti."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN katkestati. Proovin uuesti ühendust luua..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN on peatatud %@ jooksul"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN on sisse lülitatud. Teie asukoht ja võrgutegevus on kaitstud."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Seadme liiklus suunatakse läbi %@."; diff --git a/PacketTunnelProvider/fi.lproj/Localizable.strings b/PacketTunnelProvider/fi.lproj/Localizable.strings index 3f5ab4bd52..b0ff0c55df 100644 --- a/PacketTunnelProvider/fi.lproj/Localizable.strings +++ b/PacketTunnelProvider/fi.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN katkaistu vanhentuneen tilauksen takia. Tilaa Privacy Pro, jotta voit yhdistää DuckDuckGo VPN:n uudelleen."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN ei onnistunut muodostamaan yhteyttä. Yritä myöhemmin uudelleen."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN keskeytyi. Yritetään muodostaa yhteys uudelleen..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN on lepotilassa %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN on päällä. Sijaintisi ja verkkotoimintasi on suojattu."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Laitteen liikenne reititetään %@ kautta."; diff --git a/PacketTunnelProvider/fr.lproj/Localizable.strings b/PacketTunnelProvider/fr.lproj/Localizable.strings index f0b137eb7d..8f4b99e091 100644 --- a/PacketTunnelProvider/fr.lproj/Localizable.strings +++ b/PacketTunnelProvider/fr.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN déconnecté en raison de l'expiration de l'abonnement. Abonnez-vous à Privacy Pro pour reconnecter le VPN DuckDuckGo."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Le VPN DuckDuckGo n'a pas réussi à se connecter. Veuillez réessayer plus tard."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Le VPN DuckDuckGo a été interrompu. Tentative de reconnexion en cours…"; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Le VPN est en veille pendant %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Le VPN DuckDuckGo est activé. Votre emplacement et votre activité en ligne sont protégés."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Routage du trafic de l'appareil via %@."; diff --git a/PacketTunnelProvider/hr.lproj/Localizable.strings b/PacketTunnelProvider/hr.lproj/Localizable.strings index 1d07f3b970..dbfa65a212 100644 --- a/PacketTunnelProvider/hr.lproj/Localizable.strings +++ b/PacketTunnelProvider/hr.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN je prekinut zbog istekle pretplate. Pretplati se na Privacy Pro kako bi ponovno povezao DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN nije se mogao povezati. Pokušaj ponovno nešto kasnije."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN je prekinut. Sada se pokušava ponovno povezati..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je u stanju mirovanja %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN je uključen. Tvoja lokacija i aktivnosti na internetu zaštićeni su."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Usmjeravanje prometa uređaja kroz %@."; diff --git a/PacketTunnelProvider/hu.lproj/Localizable.strings b/PacketTunnelProvider/hu.lproj/Localizable.strings index 06905c0cfe..ae90002b96 100644 --- a/PacketTunnelProvider/hu.lproj/Localizable.strings +++ b/PacketTunnelProvider/hu.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "A VPN-kapcsolat megszakadt, mert lejárt az előfizetésed. Fizess elő a Privacy Pro szolgáltatásra a DuckDuckGo VPN újracsatlakoztatásához."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "A DuckDuckGo VPN nem tudott csatlakozni. Próbálkozz újra később."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "A DuckDuckGo VPN-kapcsolat megszakadt. Újracsatlakozási kísérlet folyamatban…"; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN szüneteltetve ennyi időre: %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "A DuckDuckGo VPN be van kapcsolva. A tartózkodási helyed és az online tevékenységed védelme aktív."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Az eszköz forgalmának átirányítási helyszíne: %@."; diff --git a/PacketTunnelProvider/it.lproj/Localizable.strings b/PacketTunnelProvider/it.lproj/Localizable.strings index d1b312dabf..cc09e4ae7b 100644 --- a/PacketTunnelProvider/it.lproj/Localizable.strings +++ b/PacketTunnelProvider/it.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "La VPN si è scollegata perché l'abbonamento è scaduto. Iscriviti a Privacy Pro per riconnettere la VPN di DuckDuckGo."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "La VPN di DuckDuckGo non è riuscita a connettersi. Riprova in seguito."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "La VPN di DuckDuckGo è stata interrotta. Tentativo di riconnessione in corso..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "La VPN è sospesa per %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "La VPN di DuckDuckGo è attiva. La tua posizione e le tue attività online sono protette."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Instradamento del traffico del dispositivo tramite %@."; diff --git a/PacketTunnelProvider/lt.lproj/Localizable.strings b/PacketTunnelProvider/lt.lproj/Localizable.strings index 541fa2ac1d..df0ec64a6b 100644 --- a/PacketTunnelProvider/lt.lproj/Localizable.strings +++ b/PacketTunnelProvider/lt.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN atjungtas dėl pasibaigusios prenumeratos. „DuckDuckGo“ VPN galima naudoti nemokamai, kol veikia beta versija."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "„DuckDuckGo“ VPN nepavyko prisijungti. Bandykite dar kartą vėliau."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "„DuckDuckGo“ VPN buvo pertrauktas. Dabar bandome prisijungti..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "„DuckDuckGo“"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN pristabdytas %@ laikui"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "„DuckDuckGo“ VPN įjungtas. Jūsų vieta ir veikla internete yra apsaugota."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Nukreipiamas įrenginio srautas per %@."; diff --git a/PacketTunnelProvider/lv.lproj/Localizable.strings b/PacketTunnelProvider/lv.lproj/Localizable.strings index 067f5defc2..afd274958e 100644 --- a/PacketTunnelProvider/lv.lproj/Localizable.strings +++ b/PacketTunnelProvider/lv.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN atvienots, jo ir beidzies abonements. Abonē Privacy Pro, lai atkārtoti izveidotu savienojumu ar DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Neizdevās izveidot savienojumu ar DuckDuckGo VPN. Lūdzu, mēģini vēlreiz vēlāk."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN savienojums ir pārtraukts. Mēģina atjaunot savienojumu..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN ir atslēgts uz %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN ir ieslēgts. Tava atrašanās vieta un darbības tiešsaistē ir aizsargātas."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Ierīces datplūsma tiek maršrutēta caur: %@."; diff --git a/PacketTunnelProvider/nb.lproj/Localizable.strings b/PacketTunnelProvider/nb.lproj/Localizable.strings index c1646b6777..9b71aa7160 100644 --- a/PacketTunnelProvider/nb.lproj/Localizable.strings +++ b/PacketTunnelProvider/nb.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN ble frakoblet på grunn av et utløpt abonnement. Abonner på Privacy Pro for å koble til DuckDuckGo-VPN igjen."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN mislyktes i å koble til. Prøv igjen senere."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN ble avbrutt. Prøver å koble til igjen nå..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN satt på slumring i %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN er på. Plasseringen og nettaktiviteten din er beskyttet."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Omdirigerer enhetstrafikk gjennom %@."; diff --git a/PacketTunnelProvider/nl.lproj/Localizable.strings b/PacketTunnelProvider/nl.lproj/Localizable.strings index 85df35ae55..e16ade9000 100644 --- a/PacketTunnelProvider/nl.lproj/Localizable.strings +++ b/PacketTunnelProvider/nl.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "De VPN-verbinding is verbroken omdat het abonnement is verlopen. Abonneer je op Privacy Pro om opnieuw verbinding te maken met DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN kon geen verbinding maken. Probeer het later opnieuw."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN werd onderbroken. Er wordt geprobeerd opnieuw verbinding te maken ..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN in sluimerstand voor %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN is ingeschakeld. Je locatie en online-activiteiten zijn beschermd."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Apparaatverkeer routeren via %@."; diff --git a/PacketTunnelProvider/pl.lproj/Localizable.strings b/PacketTunnelProvider/pl.lproj/Localizable.strings index 734cc8e275..7c42b1409a 100644 --- a/PacketTunnelProvider/pl.lproj/Localizable.strings +++ b/PacketTunnelProvider/pl.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "Sieć VPN została rozłączona z powodu wygasłej subskrypcji. Subskrybuj Privacy Pro, aby ponownie połączyć się z siecią DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Nie udało się nawiązać połączenia DuckDuckGo VPN. Spróbuj ponownie później."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Usługa DuckDuckGo VPN została przerwana. Próba ponownego połączenia..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Wstrzymano VPN na %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Usługa DuckDuckGo VPN jest włączona. Twoja lokalizacja i aktywność w Internecie są chronione."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Przekierowanie ruchu urządzenia przez %@."; diff --git a/PacketTunnelProvider/pt.lproj/Localizable.strings b/PacketTunnelProvider/pt.lproj/Localizable.strings index 134f8f6119..1461824952 100644 --- a/PacketTunnelProvider/pt.lproj/Localizable.strings +++ b/PacketTunnelProvider/pt.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN desativada devido a subscrição expirada. Subscreve o Privacy Pro para voltar a ligar a DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "A VPN DuckDuckGo não conseguiu estabelecer ligação. Tenta novamente mais tarde."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "A VPN DuckDuckGo foi interrompida. A tentar ligar novamente…"; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN suspensa por %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "A VPN DuckDuckGo está ativada. A tua localização e atividade online estão protegidas."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "A encaminhar o tráfego do dispositivo através de %@."; diff --git a/PacketTunnelProvider/ro.lproj/Localizable.strings b/PacketTunnelProvider/ro.lproj/Localizable.strings index e60af37c84..6f1601ea02 100644 --- a/PacketTunnelProvider/ro.lproj/Localizable.strings +++ b/PacketTunnelProvider/ro.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN deconectat din cauza expirării abonamentului. Abonează-te la Privacy Pro pentru a reconecta DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN nu a reușit să se conecteze. Încearcă din nou mai târziu."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN a fost întrerupt. Se încearcă reconectarea acum..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN-ul este amânat pentru %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN este activat. Locația și activitatea ta online sunt protejate."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Dirijarea traficului dispozitivului prin %@."; diff --git a/PacketTunnelProvider/ru.lproj/Localizable.strings b/PacketTunnelProvider/ru.lproj/Localizable.strings index c1cc9a6b28..19d3bdbc3d 100644 --- a/PacketTunnelProvider/ru.lproj/Localizable.strings +++ b/PacketTunnelProvider/ru.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN отключен ввиду окончания подписки. Чтобы вновь подключиться к DuckDuckGo VPN, оформите подписку Privacy Pro."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "Подключиться к DuckDuckGo VPN не удалось. Повторите попытку позже."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "Работа DuckDuckGo VPN была прервана. Выполняется попытка повторного подключения..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "Работа VPN отложена на %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN включен. Ваши геопозиция и онлайн-активность скрыты от посторонних глаз."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Трафик устройства направляется через: %@"; diff --git a/PacketTunnelProvider/sk.lproj/Localizable.strings b/PacketTunnelProvider/sk.lproj/Localizable.strings index a88b7ccea1..9d8522b1d9 100644 --- a/PacketTunnelProvider/sk.lproj/Localizable.strings +++ b/PacketTunnelProvider/sk.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN bola odpojená kvôli vypršaniu platnosti predplatného. Predplať si Privacy Pro, aby si znova pripojil/a DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN sa nepodarilo pripojiť. Skús to neskôr znova, prosím."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN bola prerušená. Prebieha pokus o opätovné pripojenie..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je pozastavená na %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN je zapnutá. Tvoja poloha a online aktivita sú chránené."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Smerovanie komunikácie zariadenia cez %@."; diff --git a/PacketTunnelProvider/sl.lproj/Localizable.strings b/PacketTunnelProvider/sl.lproj/Localizable.strings index d48899fa38..e164cac1b8 100644 --- a/PacketTunnelProvider/sl.lproj/Localizable.strings +++ b/PacketTunnelProvider/sl.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN je prekinjen zaradi potekle naročnine. Naročite se na Privacy Pro, da znova povežete DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN se ni mogel povezati. Poskusite znova pozneje."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN je bil prekinjen. Poskušam se znova povezati zdaj ..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN je preložen za %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "Omrežje VPN DuckDuckGo je vklopljeno. Vaša lokacija in spletna dejavnost sta zaščiteni."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Usmerjanje prometa naprave prek kraja %@."; diff --git a/PacketTunnelProvider/sv.lproj/Localizable.strings b/PacketTunnelProvider/sv.lproj/Localizable.strings index c052df4e79..c71eac0124 100644 --- a/PacketTunnelProvider/sv.lproj/Localizable.strings +++ b/PacketTunnelProvider/sv.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "VPN har kopplats från på grund av att abonnemanget har gått ut. Prenumerera på Privacy Pro för att återansluta DuckDuckGo VPN."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN kunde inte ansluta. Försök igen senare."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN avbröts. Försöker återuppta kontakten nu ..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN har pausats i %@"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN är på. Din plats och onlineaktivitet är skyddad."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Dirigera enhetstrafik genom %@."; diff --git a/PacketTunnelProvider/tr.lproj/Localizable.strings b/PacketTunnelProvider/tr.lproj/Localizable.strings index ee748bbd1f..73225a865b 100644 --- a/PacketTunnelProvider/tr.lproj/Localizable.strings +++ b/PacketTunnelProvider/tr.lproj/Localizable.strings @@ -1,12 +1,21 @@ /* The body of the notification when Privacy Pro subscription expired */ "network.protection.entitlement.expired.notification.body" = "Abonelik süresi dolduğu için VPN bağlantısı kesildi. DuckDuckGo VPN'e yeniden bağlanmak için Privacy Pro'ya abone olun."; +/* The body of the notification shown when VPN fails to reconnect */ +"network.protection.failure.notification.body" = "DuckDuckGo VPN bağlanamadı. Lütfen daha sonra tekrar deneyin."; + +/* The body of the notification shown when VPN connection is interrupted */ +"network.protection.interrupted.notification.body" = "DuckDuckGo VPN kesintiye uğradı. Şimdi yeniden bağlanmaya çalışılıyor..."; + /* The title of the notifications shown from VPN */ "network.protection.notification.title" = "DuckDuckGo"; /* The body of the notification when the VPN is snoozed, with a duration string as parameter (e.g, 30 minutes) */ "network.protection.snoozed.notification.body" = "VPN %@ için uyku moduna alındı"; +/* The body of the notification shown when VPN reconnects successfully */ +"network.protection.success.notification.body" = "DuckDuckGo VPN Açık. Konumunuz ve çevrimiçi etkinliğiniz korunuyor."; + /* The body of the notification shown when VPN connects successfully with the city + state/country as formatted parameter */ "network.protection.success.notification.subtitle.including.serverLocation" = "Cihaz trafiği %@ üzerinden yönlendiriliyor."; From b2220e14b6a16d77ec6779dfcb6f88f90a663fe3 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Wed, 11 Dec 2024 13:43:56 +0100 Subject: [PATCH 34/66] Release 7.149.0-1 (#3714) Please make sure all GH checks passed before merging. It can take around 20 minutes. Briefly review this PR to see if there are no issues or red flags and then merge it. --- DuckDuckGo.xcodeproj/project.pbxproj | 64 ++++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index fce5b52b68..0d8bd1db19 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9670,7 +9670,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9707,7 +9707,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9797,7 +9797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9824,7 +9824,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9972,7 +9972,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9998,7 +9998,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10065,7 +10065,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10099,7 +10099,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10132,7 +10132,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10162,7 +10162,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10493,7 +10493,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10531,7 +10531,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10568,7 +10568,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10607,7 +10607,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10705,7 +10705,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10736,7 +10736,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10764,7 +10764,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10797,7 +10797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10827,7 +10827,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10860,11 +10860,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11096,7 +11096,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11124,7 +11124,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11156,7 +11156,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11193,7 +11193,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11228,7 +11228,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11263,11 +11263,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11439,11 +11439,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11472,10 +11472,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; From 7273be84d88247175fadd1d9234921ee3bb95b23 Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Wed, 11 Dec 2024 11:55:10 -0300 Subject: [PATCH 35/66] Ship review feedback - Color + Orientation (#3715) Task/Issue URL: https://app.asana.com/0/1204167627774280/1208947094200047/f **Description**: Remove landscape mode for iPhone Change the background color for the AI Chat webview --- DuckDuckGo/MainViewController.swift | 3 +- ...ndedPageSheetContainerViewController.swift | 26 +++++++------ LocalPackages/AIChat/Package.swift | 10 +++-- .../AIChat/AIChatWebViewController.swift | 2 +- .../Resources/Assets.xcassets/Contents.json | 6 +++ .../Contents.json | 38 +++++++++++++++++++ .../Sources/AIChat/UIColor+Extension.swift | 26 +++++++++++++ 7 files changed, 95 insertions(+), 16 deletions(-) create mode 100644 LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/Contents.json create mode 100644 LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/webViewBackgroundColor.colorset/Contents.json create mode 100644 LocalPackages/AIChat/Sources/AIChat/UIColor+Extension.swift diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index d142c865e7..db55cc9565 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -1719,7 +1719,8 @@ class MainViewController: UIViewController { let roundedPageSheet = RoundedPageSheetContainerViewController( contentViewController: aiChatViewController, logoImage: logoImage, - title: title) + title: title, + allowedOrientation: .portrait) present(roundedPageSheet, animated: true, completion: nil) } diff --git a/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift b/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift index 880f474802..a9cb54dc7e 100644 --- a/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift +++ b/DuckDuckGo/RoundedPageContainer/RoundedPageSheetContainerViewController.swift @@ -23,6 +23,7 @@ final class RoundedPageSheetContainerViewController: UIViewController { let contentViewController: UIViewController private let logoImage: UIImage? private let titleText: String + private let allowedOrientation: UIInterfaceOrientationMask private lazy var titleBarView: TitleBarView = { let titleBarView = TitleBarView(logoImage: logoImage, title: titleText) { [weak self] in @@ -31,13 +32,13 @@ final class RoundedPageSheetContainerViewController: UIViewController { return titleBarView }() - init(contentViewController: UIViewController, logoImage: UIImage?, title: String) { + init(contentViewController: UIViewController, logoImage: UIImage?, title: String, allowedOrientation: UIInterfaceOrientationMask = .all) { self.contentViewController = contentViewController self.logoImage = logoImage self.titleText = title + self.allowedOrientation = allowedOrientation super.init(nibName: nil, bundle: nil) modalPresentationStyle = .custom - transitioningDelegate = self } @@ -45,6 +46,18 @@ final class RoundedPageSheetContainerViewController: UIViewController { fatalError("init(coder:) has not been implemented") } + override var shouldAutorotate: Bool { + return false + } + + override var supportedInterfaceOrientations: UIInterfaceOrientationMask { + return allowedOrientation + } + + override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { + return UIInterfaceOrientation.portrait + } + override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .black @@ -53,15 +66,6 @@ final class RoundedPageSheetContainerViewController: UIViewController { setupContentViewController() } - override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransition(to: size, with: coordinator) - - coordinator.animate(alongsideTransition: { _ in - // Update layout or constraints here - }, completion: nil) - } - - private func setupTitleBar() { view.addSubview(titleBarView) titleBarView.translatesAutoresizingMaskIntoConstraints = false diff --git a/LocalPackages/AIChat/Package.swift b/LocalPackages/AIChat/Package.swift index 70d6f9499d..478b4b4705 100644 --- a/LocalPackages/AIChat/Package.swift +++ b/LocalPackages/AIChat/Package.swift @@ -1,6 +1,5 @@ // swift-tools-version: 6.0 // The swift-tools-version declares the minimum version of Swift required to build this package. - import PackageDescription let package = Package( @@ -11,10 +10,15 @@ let package = Package( products: [ .library( name: "AIChat", - targets: ["AIChat"]), + targets: ["AIChat"] + ), ], targets: [ .target( - name: "AIChat"), + name: "AIChat", + resources: [ + .process("Resources/Assets.xcassets") + ] + ), ] ) diff --git a/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift b/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift index ec0d1d5d2d..2c2e47fa20 100644 --- a/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift +++ b/LocalPackages/AIChat/Sources/AIChat/AIChatWebViewController.swift @@ -30,7 +30,7 @@ final class AIChatWebViewController: UIViewController { private lazy var webView: WKWebView = { let webView = WKWebView(frame: .zero, configuration: chatModel.webViewConfiguration) webView.isOpaque = false /// Required to make the background color visible - webView.backgroundColor = .systemBackground + webView.backgroundColor = .webViewBackgroundColor webView.navigationDelegate = self webView.translatesAutoresizingMaskIntoConstraints = false return webView diff --git a/LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/Contents.json b/LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/webViewBackgroundColor.colorset/Contents.json b/LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/webViewBackgroundColor.colorset/Contents.json new file mode 100644 index 0000000000..ed36c62a6f --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/Resources/Assets.xcassets/webViewBackgroundColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.086", + "green" : "0.086", + "red" : "0.086" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/LocalPackages/AIChat/Sources/AIChat/UIColor+Extension.swift b/LocalPackages/AIChat/Sources/AIChat/UIColor+Extension.swift new file mode 100644 index 0000000000..f78e43ecca --- /dev/null +++ b/LocalPackages/AIChat/Sources/AIChat/UIColor+Extension.swift @@ -0,0 +1,26 @@ +// +// UIColor+Extension.swift +// DuckDuckGo +// +// Copyright © 2024 DuckDuckGo. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +extension UIColor { + static var webViewBackgroundColor: UIColor { + return UIColor(named: "webViewBackgroundColor", in: Bundle.module, compatibleWith: nil) ?? UIColor.clear + } +} From e0da1b9745bc78505f71477f7aa5b3ab815b9c72 Mon Sep 17 00:00:00 2001 From: Pete Smith <5278441+aataraxiaa@users.noreply.github.com> Date: Wed, 11 Dec 2024 15:58:29 +0000 Subject: [PATCH 36/66] Privacy Pro Free Trials - Models and API (#3691) Task/Issue URL: https://app.asana.com/0/1208114992212396/1208796999534221/f Tech Design URL: https://app.asana.com/0/481882893211075/1208773437150501/f **Description**: Bumps BSK which includes changes [here](https://github.com/duckduckgo/BrowserServicesKit/pull/1120) --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 0d8bd1db19..b57f50cb8c 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11723,7 +11723,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 221.0.0; + version = 221.1.0; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e696bd0530..9923aefe90 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "9975e63265e617ce9c25ae1be6d531f6de5e6592", - "version" : "221.0.0" + "revision" : "e8654e1a51bd20fa8fa234a4155a9aec37411ed1", + "version" : "221.1.0" } }, { From 52343e228da18fdc28d5adb6cd90cdfe48b1ce72 Mon Sep 17 00:00:00 2001 From: Christopher Brind Date: Thu, 12 Dec 2024 12:06:51 +0000 Subject: [PATCH 37/66] re-add settings pixels (#3716) Task/Issue URL: https://app.asana.com/0/392891325557410/1207818776591137/f Tech Design URL: CC: **Description**: Add pixels for various actions and views in settings. **Steps to test this PR**: 1. Go through the list of pixels in the linked Asana task and check they fire at the correct time 2. A pixel fired when a view is opened should not fire again if the user pops the stack back to that view 3. None of the pixels should have any addition parameters other than the default (ie app version) --- Core/PixelEvent.swift | 46 ++++++++++++++++++- .../AutoClearSettingsViewController.swift | 9 +++- DuckDuckGo/EmailProtectionView.swift | 8 +++- .../HomeRowInstructionsViewController.swift | 1 + DuckDuckGo/PrivateSearchView.swift | 3 ++ DuckDuckGo/SettingsAppearanceView.swift | 3 ++ DuckDuckGo/SettingsDataClearingView.swift | 3 ++ DuckDuckGo/SettingsGeneralView.swift | 3 ++ DuckDuckGo/SettingsViewModel.swift | 5 ++ DuckDuckGo/SyncSettingsViewController.swift | 5 ++ DuckDuckGo/WidgetEducationView.swift | 6 ++- 11 files changed, 88 insertions(+), 4 deletions(-) diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index 29eadee0f7..1ed63812bc 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -773,6 +773,8 @@ extension Pixel { // MARK: Pixel Experiment case pixelExperimentEnrollment + + // MARK: Settings case settingsPresented case settingsSetAsDefault case settingsVoiceSearchOn @@ -790,6 +792,26 @@ extension Pixel { case settingsAccessibilityOpen case settingsAccessiblityTextZoom + case settingsPrivateSearchOpen + case settingsEmailProtectionOpen + case settingsEmailProtectionEnable + case settingsGeneralOpen + case settingsSyncOpen + case settingsAppearanceOpen + case settingsThemeSelectorPressed + case settingsAddressBarTopSelected + case settingsAddressBarBottomSelected + case settingsShowFullURLOn + case settingsShowFullURLOff + case settingsDataClearingOpen + case settingsFireButtonSelectorPressed + case settingsDataClearingClearDataOpen + case settingsAutomaticallyClearDataOn + case settingsAutomaticallyClearDataOff + case settingsNextStepsAddAppToDock + case settingsNextStepsAddWidget + case settingsMoreSearchSettings + // Web pixels case privacyProOfferMonthlyPriceClick case privacyProOfferYearlyPriceClick @@ -970,7 +992,27 @@ extension Pixel.Event { case .settingsAutoconsentShown: return "m_settings_autoconsent_shown" case .settingsAutoconsentOn: return "m_settings_autoconsent_on" case .settingsAutoconsentOff: return "m_settings_autoconsent_off" - + + case .settingsPrivateSearchOpen: return "m_settings_private_search_open" + case .settingsEmailProtectionOpen: return "m_settings_email_protection_open" + case .settingsEmailProtectionEnable: return "m_settings_email_protection_enable" + case .settingsGeneralOpen: return "m_settings_general_open" + case .settingsSyncOpen: return "m_settings_sync_open" + case .settingsAppearanceOpen: return "m_settings_appearance_open" + case .settingsThemeSelectorPressed: return "m_settings_theme_selector_pressed" + case .settingsAddressBarTopSelected: return "m_settings_address_bar_top_selected" + case .settingsAddressBarBottomSelected: return "m_settings_address_bar_bottom_selected" + case .settingsShowFullURLOn: return "m_settings_show_full_url_on" + case .settingsShowFullURLOff: return "m_settings_show_full_url_off" + case .settingsDataClearingOpen: return "m_settings_data_clearing_open" + case .settingsFireButtonSelectorPressed: return "m_settings_fire_button_selector_pressed" + case .settingsDataClearingClearDataOpen: return "m_settings_data_clearing_clear_data_open" + case .settingsAutomaticallyClearDataOn: return "m_settings_automatically_clear_data_on" + case .settingsAutomaticallyClearDataOff: return "m_settings_automatically_clear_data_off" + case .settingsNextStepsAddAppToDock: return "m_settings_next_steps_add_app_to_dock" + case .settingsNextStepsAddWidget: return "m_settings_next_steps_add_widget" + case .settingsMoreSearchSettings: return "m_settings_more_search_settings" + case .browsingMenuOpened: return "mb" case .browsingMenuNewTab: return "mb_tb" case .browsingMenuAddToBookmarks: return "mb_abk" @@ -1673,6 +1715,8 @@ extension Pixel.Event { // MARK: Pixel Experiment case .pixelExperimentEnrollment: return "pixel_experiment_enrollment" + + // MARK: Settings case .settingsPresented: return "m_settings_presented" case .settingsSetAsDefault: return "m_settings_set_as_default" case .settingsVoiceSearchOn: return "m_settings_voice_search_on" diff --git a/DuckDuckGo/AutoClearSettingsViewController.swift b/DuckDuckGo/AutoClearSettingsViewController.swift index 14c4178ac0..a5c4eb934a 100644 --- a/DuckDuckGo/AutoClearSettingsViewController.swift +++ b/DuckDuckGo/AutoClearSettingsViewController.swift @@ -55,7 +55,12 @@ class AutoClearSettingsViewController: UITableViewController { decorate() } - + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + Pixel.fire(pixel: .settingsDataClearingClearDataOpen) + } + private func loadClearDataSettings() -> AutoClearSettingsModel? { return AutoClearSettingsModel(settings: appSettings) } @@ -152,6 +157,8 @@ class AutoClearSettingsViewController: UITableViewController { } @IBAction func onClearDataToggled(_ sender: UISwitch) { + Pixel.fire(pixel: sender.isOn ? .settingsAutomaticallyClearDataOn : .settingsAutomaticallyClearDataOff) + if sender.isOn { clearDataSettings = AutoClearSettingsModel() tableView.insertSections(.init(integersIn: Sections.action.rawValue...Sections.timing.rawValue), with: .fade) diff --git a/DuckDuckGo/EmailProtectionView.swift b/DuckDuckGo/EmailProtectionView.swift index 022d4f4b3a..f20fc29f89 100644 --- a/DuckDuckGo/EmailProtectionView.swift +++ b/DuckDuckGo/EmailProtectionView.swift @@ -56,6 +56,9 @@ struct EmailProtectionView: View { .onChange(of: viewModel.shouldShowEmailAlert) { value in shouldShowEmailAlert = value } + .onFirstAppear { + Pixel.fire(pixel: .settingsEmailProtectionOpen) + } } } @@ -90,7 +93,10 @@ struct EmailProtectionViewSettings: View { // Enable Email Protection Section { SettingsCellView(label: UserText.enableEmailProtection, - action: { viewModel.openEmailProtection() }, + action: { + viewModel.openEmailProtection() + Pixel.fire(pixel: .settingsEmailProtectionEnable) + }, webLinkIndicator: true, isButton: true) } diff --git a/DuckDuckGo/HomeRowInstructionsViewController.swift b/DuckDuckGo/HomeRowInstructionsViewController.swift index 20356827a9..d40b4a2383 100644 --- a/DuckDuckGo/HomeRowInstructionsViewController.swift +++ b/DuckDuckGo/HomeRowInstructionsViewController.swift @@ -60,6 +60,7 @@ class HomeRowInstructionsViewController: UIViewController { override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) HomeRowReminder().setShown() + Pixel.fire(pixel: .settingsNextStepsAddAppToDock) } @IBAction func dismiss() { diff --git a/DuckDuckGo/PrivateSearchView.swift b/DuckDuckGo/PrivateSearchView.swift index 43190bb81e..cf00930e85 100644 --- a/DuckDuckGo/PrivateSearchView.swift +++ b/DuckDuckGo/PrivateSearchView.swift @@ -40,6 +40,9 @@ struct PrivateSearchView: View { .applySettingsListModifiers(title: UserText.privateSearch, displayMode: .inline, viewModel: viewModel) + .onFirstAppear { + Pixel.fire(pixel: .settingsPrivateSearchOpen) + } } } diff --git a/DuckDuckGo/SettingsAppearanceView.swift b/DuckDuckGo/SettingsAppearanceView.swift index e29a2d2169..2a1dfcd4ae 100644 --- a/DuckDuckGo/SettingsAppearanceView.swift +++ b/DuckDuckGo/SettingsAppearanceView.swift @@ -58,5 +58,8 @@ struct SettingsAppearanceView: View { .applySettingsListModifiers(title: UserText.settingsAppearanceSection, displayMode: .inline, viewModel: viewModel) + .onFirstAppear { + Pixel.fire(pixel: .settingsAppearanceOpen) + } } } diff --git a/DuckDuckGo/SettingsDataClearingView.swift b/DuckDuckGo/SettingsDataClearingView.swift index 5a73902537..5054381edc 100644 --- a/DuckDuckGo/SettingsDataClearingView.swift +++ b/DuckDuckGo/SettingsDataClearingView.swift @@ -54,5 +54,8 @@ struct SettingsDataClearingView: View { .applySettingsListModifiers(title: UserText.dataClearing, displayMode: .inline, viewModel: viewModel) + .onFirstAppear { + Pixel.fire(pixel: .settingsDataClearingOpen) + } } } diff --git a/DuckDuckGo/SettingsGeneralView.swift b/DuckDuckGo/SettingsGeneralView.swift index 427ec3bfc3..115c88a0fb 100644 --- a/DuckDuckGo/SettingsGeneralView.swift +++ b/DuckDuckGo/SettingsGeneralView.swift @@ -89,5 +89,8 @@ struct SettingsGeneralView: View { .applySettingsListModifiers(title: UserText.general, displayMode: .inline, viewModel: viewModel) + .onFirstAppear { + Pixel.fire(pixel: .settingsGeneralOpen) + } } } diff --git a/DuckDuckGo/SettingsViewModel.swift b/DuckDuckGo/SettingsViewModel.swift index 6808303d43..cfdc9ae43c 100644 --- a/DuckDuckGo/SettingsViewModel.swift +++ b/DuckDuckGo/SettingsViewModel.swift @@ -109,6 +109,7 @@ final class SettingsViewModel: ObservableObject { Binding( get: { self.state.appTheme }, set: { + Pixel.fire(pixel: .settingsThemeSelectorPressed) self.state.appTheme = $0 ThemeManager.shared.enableTheme(with: $0) } @@ -118,6 +119,7 @@ final class SettingsViewModel: ObservableObject { Binding( get: { self.state.fireButtonAnimation }, set: { + Pixel.fire(pixel: .settingsFireButtonSelectorPressed) self.appSettings.currentFireButtonAnimation = $0 self.state.fireButtonAnimation = $0 NotificationCenter.default.post(name: AppUserDefaults.Notifications.currentFireButtonAnimationChange, object: self) @@ -138,6 +140,7 @@ final class SettingsViewModel: ObservableObject { self.state.addressBar.position }, set: { + Pixel.fire(pixel: $0 == .top ? .settingsAddressBarTopSelected : .settingsAddressBarBottomSelected) self.appSettings.currentAddressBarPosition = $0 self.state.addressBar.position = $0 } @@ -148,6 +151,7 @@ final class SettingsViewModel: ObservableObject { Binding( get: { self.state.showsFullURL }, set: { + Pixel.fire(pixel: $0 ? .settingsShowFullURLOn : .settingsShowFullURLOff) self.state.showsFullURL = $0 self.appSettings.showFullSiteAddress = $0 } @@ -598,6 +602,7 @@ extension SettingsViewModel { } func openMoreSearchSettings() { + Pixel.fire(pixel: .settingsMoreSearchSettings) UIApplication.shared.open(URL.searchSettings) } diff --git a/DuckDuckGo/SyncSettingsViewController.swift b/DuckDuckGo/SyncSettingsViewController.swift index c71fc4d0f9..925b291897 100644 --- a/DuckDuckGo/SyncSettingsViewController.swift +++ b/DuckDuckGo/SyncSettingsViewController.swift @@ -244,6 +244,11 @@ class SyncSettingsViewController: UIHostingController { syncService.scheduler.requestSyncImmediately() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + Pixel.fire(pixel: .settingsSyncOpen) + } + func updateOptions() { syncService.scheduler.requestSyncImmediately() } diff --git a/DuckDuckGo/WidgetEducationView.swift b/DuckDuckGo/WidgetEducationView.swift index b4bbca2e2c..81095e78b8 100644 --- a/DuckDuckGo/WidgetEducationView.swift +++ b/DuckDuckGo/WidgetEducationView.swift @@ -72,7 +72,11 @@ struct WidgetEducationView: View { .padding(.horizontal) .padding(.top, Const.Padding.top) } - }.navigationBarTitle(navBarTitle, displayMode: .inline) + } + .navigationBarTitle(navBarTitle, displayMode: .inline) + .onFirstAppear { + Pixel.fire(pixel: .settingsNextStepsAddWidget) + } } private var secondParagraphText: Text { From d70d5cd648dccc4907dcb7e5bfc55484a895916f Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Thu, 12 Dec 2024 09:39:37 -0300 Subject: [PATCH 38/66] Fix AI Chat address bar pixel (#3720) Task/Issue URL: https://app.asana.com/0/414235014887631/1208965876736143/f **Description**: Fire AI Chat address bar pixel Fixes share button pixel --- Core/PixelEvent.swift | 2 ++ DuckDuckGo/MainViewController.swift | 2 ++ DuckDuckGo/OmniBar.swift | 1 - 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index 29eadee0f7..0dd6d65ac7 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -916,6 +916,7 @@ extension Pixel { case openAIChatBefore10min case openAIChatAfter10min case aiChatNoRemoteSettingsFound(settings: String) + case openAIChatFromAddressBar // MARK: Lifecycle case appDidTransitionToUnexpectedState @@ -1833,6 +1834,7 @@ extension Pixel.Event { case .openAIChatBefore10min: return "m_aichat_open_before_10_min" case .aiChatNoRemoteSettingsFound(let settings): return "m_aichat_no_remote_settings_found-\(settings.lowercased())" + case .openAIChatFromAddressBar: return "m_aichat_addressbar_icon" // MARK: Lifecycle case .appDidTransitionToUnexpectedState: return "m_debug_app-did-transition-to-unexpected-state" diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index db55cc9565..c129c44057 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -2089,7 +2089,9 @@ extension MainViewController: OmniBarDelegate { switch accessoryType { case .chat: openAIChat() + Pixel.fire(pixel: .openAIChatFromAddressBar) case .share: + Pixel.fire(pixel: .addressBarShare) currentTab?.onShareAction(forLink: link, fromView: viewCoordinator.omniBar.accessoryButton) } } diff --git a/DuckDuckGo/OmniBar.swift b/DuckDuckGo/OmniBar.swift index 01415d572d..6f20b39507 100644 --- a/DuckDuckGo/OmniBar.swift +++ b/DuckDuckGo/OmniBar.swift @@ -546,7 +546,6 @@ class OmniBar: UIView { } @IBAction func onAccessoryPressed(_ sender: Any) { - Pixel.fire(pixel: .addressBarShare) omniDelegate?.onAccessoryPressed(accessoryType: accessoryType) } From 02a965700f706a9de22de523a1dbeb510cb52b08 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Thu, 12 Dec 2024 14:03:42 +0100 Subject: [PATCH 39/66] Only attempt to refresh auth token when user is authenticated (#3721) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/414709148257752/1208966018277167/f **Description**: Following [Increase of 401s in auth api - Darwin](https://app.asana.com/0/0/1208959507432558) we found that the refreshAuthTokenIfNeeded is being called without a proper check if user is authenticated (and tokens are present). It also includes BSK check -> https://github.com/duckduckgo/BrowserServicesKit/commit/fb809edc28e809aba8a17aaf3e1c4b37086d9cd4 **Steps to test this PR**: 1. Ensure no PP is on the device 2. Open PP purchase page 3. Check if `refreshAuthTokenIfNeeded` was not called and no calls to `validate_token` endpoint were made. 4. Purchase or activate subscription 5. Open add/edit email page 6. Check if `refreshAuthTokenIfNeeded` was properly called with a call to `validate_token` endpoint. **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? **Copy Testing**: * [ ] Use of correct apostrophes in new copy, ie `’` rather than `'` **Orientation Testing**: * [ ] Portrait * [ ] Landscape **Device Testing**: * [ ] iPhone SE (1st Gen) * [ ] iPhone 8 * [ ] iPhone X * [ ] iPhone 14 Pro * [ ] iPad **OS Testing**: * [ ] iOS 15 * [ ] iOS 16 * [ ] iOS 17 **Theme Testing**: * [ ] Light theme * [ ] Dark theme --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 6 +++--- .../SubscriptionPagesUseSubscriptionFeature.swift | 10 +++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 0d8bd1db19..3fa1704664 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11723,7 +11723,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 221.0.0; + version = "221.0.0-1"; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e696bd0530..6035300ed3 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "9975e63265e617ce9c25ae1be6d531f6de5e6592", - "version" : "221.0.0" + "revision" : "276754fc1efab85c39a77da64e68439e7f105de3", + "version" : "221.0.0-1" } }, { @@ -138,7 +138,7 @@ { "identity" : "swift-argument-parser", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser", + "location" : "https://github.com/apple/swift-argument-parser.git", "state" : { "revision" : "0fbc8848e389af3bb55c182bc19ca9d5dc2f255b", "version" : "1.4.0" diff --git a/DuckDuckGo/Subscription/UserScripts/SubscriptionPagesUseSubscriptionFeature.swift b/DuckDuckGo/Subscription/UserScripts/SubscriptionPagesUseSubscriptionFeature.swift index 7792b22677..03412bae5a 100644 --- a/DuckDuckGo/Subscription/UserScripts/SubscriptionPagesUseSubscriptionFeature.swift +++ b/DuckDuckGo/Subscription/UserScripts/SubscriptionPagesUseSubscriptionFeature.swift @@ -194,10 +194,14 @@ final class SubscriptionPagesUseSubscriptionFeature: Subfeature, ObservableObjec // MARK: Broker Methods (Called from WebView via UserScripts) func getSubscription(params: Any, original: WKScriptMessage) async -> Encodable? { - await appStoreAccountManagementFlow.refreshAuthTokenIfNeeded() - let authToken = accountManager.authToken ?? Constants.empty + guard accountManager.isUserAuthenticated else { return [Constants.token: Constants.empty] } - return [Constants.token: authToken] + switch await appStoreAccountManagementFlow.refreshAuthTokenIfNeeded() { + case .success(let currentAuthToken): + return [Constants.token: currentAuthToken] + case .failure: + return [Constants.token: Constants.empty] + } } func getSubscriptionOptions(params: Any, original: WKScriptMessage) async -> Encodable? { From 1560b5e7e547c451e12716ea2692a9e673edf2c9 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Thu, 12 Dec 2024 14:39:08 +0100 Subject: [PATCH 40/66] Update BSK to latest (#3723) Task/Issue URL: https://app.asana.com/0/414235014887631/1208827075841585/f Description: Add 'locale' to report broken site params was merged in to https://github.com/duckduckgo/iOS/tree/release/7.149.0 in a BSK hotfix release. This PR updates BSK to latest to introduce this change on main. --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index b57f50cb8c..c655af07ad 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11723,7 +11723,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 221.1.0; + version = 221.2.0; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 9923aefe90..7e19b6e338 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "e8654e1a51bd20fa8fa234a4155a9aec37411ed1", - "version" : "221.1.0" + "revision" : "08c3dca42c5f943d45136823f264ba14bbcc0eb9", + "version" : "221.2.0" } }, { @@ -138,7 +138,7 @@ { "identity" : "swift-argument-parser", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-argument-parser", + "location" : "https://github.com/apple/swift-argument-parser.git", "state" : { "revision" : "0fbc8848e389af3bb55c182bc19ca9d5dc2f255b", "version" : "1.4.0" From da81425100db0173e7b357294ad7748a063e05ec Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Thu, 12 Dec 2024 15:28:44 +0100 Subject: [PATCH 41/66] Release 7.149.0-2 (#3724) Please make sure all GH checks passed before merging. It can take around 20 minutes. Briefly review this PR to see if there are no issues or red flags and then merge it. --- DuckDuckGo.xcodeproj/project.pbxproj | 64 ++++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 3fa1704664..943f4e0894 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9670,7 +9670,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9707,7 +9707,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9797,7 +9797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9824,7 +9824,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9972,7 +9972,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9998,7 +9998,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10065,7 +10065,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10099,7 +10099,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10132,7 +10132,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10162,7 +10162,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10493,7 +10493,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10531,7 +10531,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10568,7 +10568,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10607,7 +10607,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10705,7 +10705,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10736,7 +10736,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10764,7 +10764,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10797,7 +10797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10827,7 +10827,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10860,11 +10860,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11096,7 +11096,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11124,7 +11124,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11156,7 +11156,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11193,7 +11193,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11228,7 +11228,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11263,11 +11263,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11439,11 +11439,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11472,10 +11472,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_CURRENT_VERSION = 2; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; From 8017c33bd3d30502bc9e3dc5335d25be421a5b3f Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Thu, 12 Dec 2024 11:22:27 -0800 Subject: [PATCH 42/66] Update Fastfile to wrap lanes in a platform block (#3711) Task/Issue URL: https://app.asana.com/0/0/1208949587447312/f Tech Design URL: CC: Description: This PR updates the iOS Fastfile to wrap lanes in a platform block. This introduces zero changes to the usability of the Fastfile as it is only intended to lay the groundwork for the move to the monorepo. However, the diff is noisy since wrapping all lanes in a block caused an indentation change. Sorry! --- fastlane/Fastfile | 618 +++++++++++++++++++++++----------------------- 1 file changed, 310 insertions(+), 308 deletions(-) diff --git a/fastlane/Fastfile b/fastlane/Fastfile index c185c7bfed..d0da0e60c7 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,217 +1,217 @@ default_platform :ios -before_all do - setup_ci if is_ci -end +platform :ios do -################################################# -# Public lanes -################################################# + before_all do + setup_ci if is_ci + end -desc 'Fetches and updates certificates and provisioning profiles for App Store distribution' -lane :sync_signing do |options| - do_sync_signing(options) -end + ################################################# + # Public lanes + ################################################# -desc 'Fetches and updates certificates and provisioning profiles for Ad-Hoc distribution' -lane :sync_signing_adhoc do |options| - do_sync_signing(options) -end + desc 'Fetches and updates certificates and provisioning profiles for App Store distribution' + lane :sync_signing do |options| + do_sync_signing(options) + end -desc 'Fetches and updates certificates and provisioning profiles for Alpha distribution' -lane :sync_signing_alpha do |options| - do_sync_signing(options) -end + desc 'Fetches and updates certificates and provisioning profiles for Ad-Hoc distribution' + lane :sync_signing_adhoc do |options| + do_sync_signing(options) + end -desc 'Fetches and updates certificates and provisioning profiles for Ad-Hoc distribution' -lane :sync_signing_alpha_adhoc do |options| - do_sync_signing(options) -end + desc 'Fetches and updates certificates and provisioning profiles for Alpha distribution' + lane :sync_signing_alpha do |options| + do_sync_signing(options) + end -desc 'Makes Ad-Hoc build with a specified name and alpha bundle ID in a given directory' -lane :adhoc do |options| - alpha_adhoc(options) -end + desc 'Fetches and updates certificates and provisioning profiles for Ad-Hoc distribution' + lane :sync_signing_alpha_adhoc do |options| + do_sync_signing(options) + end -desc 'Makes Ad-Hoc build with a specified name and release bundle ID in a given directory' -lane :release_adhoc do |options| - - # Workaround for match + gym failing at build phase https://forums.swift.org/t/xcode-14-beta-code-signing-issues-when-spm-targets-include-resources/59685/32 - if is_ci - configurations = [ - { - targets: ["DuckDuckGo"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios" - }, - { - targets: ["ShareExtension"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.ShareExtension" - }, - { - targets: ["OpenAction"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.OpenAction2" - }, - { - targets: ["WidgetsExtension"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.Widgets" - }, - { - targets: ["PacketTunnelProvider"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.NetworkExtension" - }, - { - targets: ["AutofillCredentialProvider"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.CredentialExtension" - } - ] - - configurations.each do |config| - update_code_signing_settings( - use_automatic_signing: false, - build_configurations: ["Release"], - code_sign_identity: "iPhone Distribution", - **config - ) - end + desc 'Makes Ad-Hoc build with a specified name and alpha bundle ID in a given directory' + lane :adhoc do |options| + alpha_adhoc(options) end - sync_signing_adhoc(options) + desc 'Makes Ad-Hoc build with a specified name and release bundle ID in a given directory' + lane :release_adhoc do |options| + + # Workaround for match + gym failing at build phase https://forums.swift.org/t/xcode-14-beta-code-signing-issues-when-spm-targets-include-resources/59685/32 + if is_ci + configurations = [ + { + targets: ["DuckDuckGo"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios" + }, + { + targets: ["ShareExtension"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.ShareExtension" + }, + { + targets: ["OpenAction"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.OpenAction2" + }, + { + targets: ["WidgetsExtension"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.Widgets" + }, + { + targets: ["PacketTunnelProvider"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.NetworkExtension" + }, + { + targets: ["AutofillCredentialProvider"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.CredentialExtension" + } + ] + + configurations.each do |config| + update_code_signing_settings( + use_automatic_signing: false, + build_configurations: ["Release"], + code_sign_identity: "iPhone Distribution", + **config + ) + end + end - suffix = "" - if options[:suffix] - suffix = "#{options[:suffix]}-" - end + sync_signing_adhoc(options) - timestamp = Time.now.strftime("%Y-%m-%d-%H-%M") - output_name = "DuckDuckGo-#{suffix}#{timestamp}" - - build_app( - output_directory: options[:output], - output_name: output_name, - export_method: "ad-hoc", - scheme: "DuckDuckGo", - export_options: "adhocExportOptions.plist", - derived_data_path: "DerivedData", - xcargs: "-skipPackagePluginValidation -skipMacroValidation" - ) - - if is_ci - sh("echo output_name=#{output_name} >> $GITHUB_ENV") - end + suffix = "" + if options[:suffix] + suffix = "#{options[:suffix]}-" + end - Dir.chdir("..") do - sh("open", "#{options[:output]}") unless is_ci - end -end + timestamp = Time.now.strftime("%Y-%m-%d-%H-%M") + output_name = "DuckDuckGo-#{suffix}#{timestamp}" + + build_app( + output_directory: options[:output], + output_name: output_name, + export_method: "ad-hoc", + scheme: "DuckDuckGo", + export_options: "adhocExportOptions.plist", + derived_data_path: "DerivedData", + xcargs: "-skipPackagePluginValidation -skipMacroValidation" + ) -desc 'Makes Ad-Hoc build for alpha with a specified name and alpha bundle ID in a given directory' -lane :alpha_adhoc do |options| - - # Workaround for match + gym failing at build phase https://forums.swift.org/t/xcode-14-beta-code-signing-issues-when-spm-targets-include-resources/59685/32 - if is_ci - configurations = [ - { - targets: ["DuckDuckGo"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha" - }, - { - targets: ["ShareExtension"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.ShareExtension" - }, - { - targets: ["OpenAction"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.OpenAction2" - }, - { - targets: ["WidgetsExtension"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.Widgets" - }, - { - targets: ["PacketTunnelProvider"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.NetworkExtension" - }, - { - targets: ["AutofillCredentialProvider"], - profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.CredentialExtension" - } - ] - - configurations.each do |config| - update_code_signing_settings( - use_automatic_signing: false, - build_configurations: ["Alpha"], - code_sign_identity: "iPhone Distribution", - **config - ) + if is_ci + sh("echo output_name=#{output_name} >> $GITHUB_ENV") + end + + Dir.chdir("..") do + sh("open", "#{options[:output]}") unless is_ci end end - sync_signing_alpha_adhoc(options) + desc 'Makes Ad-Hoc build for alpha with a specified name and alpha bundle ID in a given directory' + lane :alpha_adhoc do |options| + + # Workaround for match + gym failing at build phase https://forums.swift.org/t/xcode-14-beta-code-signing-issues-when-spm-targets-include-resources/59685/32 + if is_ci + configurations = [ + { + targets: ["DuckDuckGo"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha" + }, + { + targets: ["ShareExtension"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.ShareExtension" + }, + { + targets: ["OpenAction"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.OpenAction2" + }, + { + targets: ["WidgetsExtension"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.Widgets" + }, + { + targets: ["PacketTunnelProvider"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.NetworkExtension" + }, + { + targets: ["AutofillCredentialProvider"], + profile_name: "match AdHoc com.duckduckgo.mobile.ios.alpha.CredentialExtension" + } + ] + + configurations.each do |config| + update_code_signing_settings( + use_automatic_signing: false, + build_configurations: ["Alpha"], + code_sign_identity: "iPhone Distribution", + **config + ) + end + end - suffix = "" - if options[:suffix] - suffix = "#{options[:suffix]}-" - end + sync_signing_alpha_adhoc(options) - timestamp = Time.now.strftime("%Y-%m-%d-%H-%M") - output_name = "DuckDuckGo-Alpha-#{suffix}#{timestamp}" - - build_app( - output_directory: options[:output], - output_name: output_name, - export_method: "ad-hoc", - configuration: "Alpha", - scheme: "DuckDuckGo-Alpha", - export_options: "alphaAdhocExportOptions.plist", - derived_data_path: "DerivedData", - xcargs: "-skipPackagePluginValidation" - ) - - if is_ci - sh("echo output_name=#{output_name} >> $GITHUB_ENV") - end + suffix = "" + if options[:suffix] + suffix = "#{options[:suffix]}-" + end - Dir.chdir("..") do - sh("open", "#{options[:output]}") unless is_ci - end -end + timestamp = Time.now.strftime("%Y-%m-%d-%H-%M") + output_name = "DuckDuckGo-Alpha-#{suffix}#{timestamp}" + + build_app( + output_directory: options[:output], + output_name: output_name, + export_method: "ad-hoc", + configuration: "Alpha", + scheme: "DuckDuckGo-Alpha", + export_options: "alphaAdhocExportOptions.plist", + derived_data_path: "DerivedData", + xcargs: "-skipPackagePluginValidation" + ) + if is_ci + sh("echo output_name=#{output_name} >> $GITHUB_ENV") + end + Dir.chdir("..") do + sh("open", "#{options[:output]}") unless is_ci + end + end -desc 'Promotes the latest TestFlight build to App Store without submitting for review' -lane :promote_latest_testflight_to_appstore do |options| + desc 'Promotes the latest TestFlight build to App Store without submitting for review' + lane :promote_latest_testflight_to_appstore do |options| - app_identifier = options[:alpha] ? "com.duckduckgo.mobile.ios.alpha" : "com.duckduckgo.mobile.ios" + app_identifier = options[:alpha] ? "com.duckduckgo.mobile.ios.alpha" : "com.duckduckgo.mobile.ios" - latest_testflight_build_number( - api_key: get_api_key, - username: get_username(options), - platform: 'ios', - app_identifier: app_identifier - ) + latest_testflight_build_number( + api_key: get_api_key, + username: get_username(options), + platform: 'ios', + app_identifier: app_identifier + ) - latest_build_number = lane_context[SharedValues::LATEST_TESTFLIGHT_BUILD_NUMBER] - latest_build_version = lane_context[SharedValues::LATEST_TESTFLIGHT_VERSION] + latest_build_number = lane_context[SharedValues::LATEST_TESTFLIGHT_BUILD_NUMBER] + latest_build_version = lane_context[SharedValues::LATEST_TESTFLIGHT_VERSION] - UI.message("The latest build number #{latest_build_number} of the latest version: #{latest_build_version} for app identifier: #{app_identifier}") + UI.message("The latest build number #{latest_build_number} of the latest version: #{latest_build_version} for app identifier: #{app_identifier}") - upload_metadata({ - build_number: latest_build_number.to_s, - app_version: latest_build_version.to_s, - app_identifier: app_identifier - }) -end + upload_metadata({ + build_number: latest_build_number.to_s, + app_version: latest_build_version.to_s, + app_identifier: app_identifier + }) + end -desc 'Makes App Store release build and uploads it to App Store Connect' -lane :release_appstore do |options| - build_release(options) + desc 'Makes App Store release build and uploads it to App Store Connect' + lane :release_appstore do |options| + build_release(options) - deliver(common_deliver_arguments.merge(options)) + deliver(common_deliver_arguments.merge(options)) - begin - upload_metadata(options) - rescue => exception - UI.user_error! %{Failed to upload metadata: #{exception} + begin + upload_metadata(options) + rescue => exception + UI.user_error! %{Failed to upload metadata: #{exception} 1. Your build has been successfully uploaded, it's only a problem with App Store metadata. 2. It's possible that there is a submission for another platform (macOS) in a non-editable state (e.g. Pending Developer Release, Developer Rejected, Rejected or Metadata Rejected). @@ -220,153 +220,155 @@ lane :release_appstore do |options| to update metadata manually. 4. Use upload_metadata lane to only handle metadata (without building the release and uploading a build): $ bundle exec fastlane upload_metadata - } + } + end end -end - -desc 'Updates App Store metadata' -lane :upload_metadata do |options| - deliver(common_deliver_arguments.merge(options).merge({ - skip_binary_upload: true, - skip_metadata: false, - version_check_wait_retry_limit: 1 - })) -end -desc 'Makes App Store release build and uploads it to TestFlight' -lane :release_testflight do - build_release + desc 'Updates App Store metadata' + lane :upload_metadata do |options| + deliver(common_deliver_arguments.merge(options).merge({ + skip_binary_upload: true, + skip_metadata: false, + version_check_wait_retry_limit: 1 + })) + end - upload_to_testflight( - api_key: get_api_key - ) -end + desc 'Makes App Store release build and uploads it to TestFlight' + lane :release_testflight do + build_release -desc 'Makes Alpha release build and uploads it to TestFlight' -lane :release_alpha do |options| - build_alpha(options) + upload_to_testflight( + api_key: get_api_key + ) + end - upload_to_testflight( - api_key: get_api_key, - groups: options[:groups], - skip_waiting_for_build_processing: true - ) -end + desc 'Makes Alpha release build and uploads it to TestFlight' + lane :release_alpha do |options| + build_alpha(options) -desc 'Latest build number for version' -lane :latest_build_number_for_version do |options| - if options[:app_identifier] - app_identifier = options[:app_identifier] + upload_to_testflight( + api_key: get_api_key, + groups: options[:groups], + skip_waiting_for_build_processing: true + ) end - build_number = latest_testflight_build_number( - api_key: get_api_key, - version: options[:version], - initial_build_number: -1, - username: get_username(options)) - if options[:file_name] - File.write(options[:file_name], build_number) + + desc 'Latest build number for version' + lane :latest_build_number_for_version do |options| + if options[:app_identifier] + app_identifier = options[:app_identifier] + end + build_number = latest_testflight_build_number( + api_key: get_api_key, + version: options[:version], + initial_build_number: -1, + username: get_username(options)) + if options[:file_name] + File.write(options[:file_name], build_number) + end end -end -desc 'Increment build number based on version in App Store Connect' -lane :increment_build_number_for_version do |options| - if options[:app_identifier] - app_identifier = options[:app_identifier] + desc 'Increment build number based on version in App Store Connect' + lane :increment_build_number_for_version do |options| + if options[:app_identifier] + app_identifier = options[:app_identifier] + end + increment_build_number({ + build_number: + latest_testflight_build_number( + api_key: get_api_key, + version: options[:version], + app_identifier: app_identifier, + initial_build_number: -1, + username: get_username(options)) + 1, + skip_info_plist: "true" + }) end - increment_build_number({ - build_number: - latest_testflight_build_number( - api_key: get_api_key, - version: options[:version], - app_identifier: app_identifier, - initial_build_number: -1, - username: get_username(options)) + 1, - skip_info_plist: "true" - }) -end -################################################# -# Private lanes -################################################# + ################################################# + # Private lanes + ################################################# -private_lane :build_release do |options| - sync_signing(options) + private_lane :build_release do |options| + sync_signing(options) - build_app( - export_method: "app-store", - scheme: "DuckDuckGo", - export_options: "appStoreExportOptions.plist", - derived_data_path: "DerivedData", - xcargs: "-skipPackagePluginValidation -skipMacroValidation" - ) -end + build_app( + export_method: "app-store", + scheme: "DuckDuckGo", + export_options: "appStoreExportOptions.plist", + derived_data_path: "DerivedData", + xcargs: "-skipPackagePluginValidation -skipMacroValidation" + ) + end -private_lane :build_alpha do |options| - sync_signing_alpha(options) - - build_app( - export_method: "app-store", - configuration: "Alpha", - scheme: "DuckDuckGo-Alpha", - export_options: "alphaExportOptions.plist", - derived_data_path: "DerivedData", - xcargs: "-skipPackagePluginValidation -skipMacroValidation" - ) -end + private_lane :build_alpha do |options| + sync_signing_alpha(options) -private_lane :get_api_key do - has_api_key = [ - "APPLE_API_KEY_ID", - "APPLE_API_KEY_ISSUER", - "APPLE_API_KEY_BASE64" - ].map {|x| ENV.has_key? x}.reduce(&:&) - - if has_api_key - app_store_connect_api_key( - key_id: ENV["APPLE_API_KEY_ID"], - issuer_id: ENV["APPLE_API_KEY_ISSUER"], - key_content: ENV["APPLE_API_KEY_BASE64"], - is_key_content_base64: true + build_app( + export_method: "app-store", + configuration: "Alpha", + scheme: "DuckDuckGo-Alpha", + export_options: "alphaExportOptions.plist", + derived_data_path: "DerivedData", + xcargs: "-skipPackagePluginValidation -skipMacroValidation" ) - else - nil end -end -private_lane :get_username do |options| - if options[:username] - options[:username] - elsif is_ci - nil # don't make assumptions in CI - else - git_user_email = Action.sh("git", "config", "user.email").chomp - if git_user_email.end_with? "@duckduckgo.com" - git_user_email + private_lane :get_api_key do + has_api_key = [ + "APPLE_API_KEY_ID", + "APPLE_API_KEY_ISSUER", + "APPLE_API_KEY_BASE64" + ].map {|x| ENV.has_key? x}.reduce(&:&) + + if has_api_key + app_store_connect_api_key( + key_id: ENV["APPLE_API_KEY_ID"], + issuer_id: ENV["APPLE_API_KEY_ISSUER"], + key_content: ENV["APPLE_API_KEY_BASE64"], + is_key_content_base64: true + ) + else + nil end end -end -private_lane :do_sync_signing do |options| - is_adhoc = lane_context[SharedValues::LANE_NAME].include?("adhoc") - sync_code_signing( - api_key: get_api_key, - username: get_username(options), - readonly: is_ci && !is_adhoc - ) -end + private_lane :get_username do |options| + if options[:username] + options[:username] + elsif is_ci + nil # don't make assumptions in CI + else + git_user_email = Action.sh("git", "config", "user.email").chomp + if git_user_email.end_with? "@duckduckgo.com" + git_user_email + end + end + end -def common_deliver_arguments - { - api_key: get_api_key, - submit_for_review: false, - automatic_release: false, - phased_release: true, - force: true, - skip_screenshots: true, - skip_metadata: true, - precheck_include_in_app_purchases: false, - submission_information: { - add_id_info_uses_idfa: false + private_lane :do_sync_signing do |options| + is_adhoc = lane_context[SharedValues::LANE_NAME].include?("adhoc") + sync_code_signing( + api_key: get_api_key, + username: get_username(options), + readonly: is_ci && !is_adhoc + ) + end + + def common_deliver_arguments + { + api_key: get_api_key, + submit_for_review: false, + automatic_release: false, + phased_release: true, + force: true, + skip_screenshots: true, + skip_metadata: true, + precheck_include_in_app_purchases: false, + submission_information: { + add_id_info_uses_idfa: false + } } - } + end + end From e06161932974ae3668d0dd16f57519ab087d7826 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Fri, 13 Dec 2024 09:39:53 +0100 Subject: [PATCH 43/66] Properly set state when user cancelled the purchase (#3725) Task/Issue URL: https://app.asana.com/0/414709148257752/1208967366086507/f **Description**: Do not trigger 'm_privacy-pro_app_subscription-purchase_failure_other' pixel when cancelling the purchase. **Steps to test this PR**: _(Since steps do not involve purchase it can be verified on simulator)_ 1. Ensure no Privacy Pro is on the device 2. Open Settings -> "Get Privacy Pro" 3. Select one of the two options (monthly or annual) 4. Select "Subscribe" to confirm ToS 5. When iOS shows alert prompting to confirm purchase and/or to sign into Apple ID account tap "Cancel" to stop the purchase flow. 6. Ensure that the cancel action is not triggering `m_privacy-pro_app_subscription-purchase_failure_other` pixel to be fired **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- .../Subscription/ViewModel/SubscriptionFlowViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuckDuckGo/Subscription/ViewModel/SubscriptionFlowViewModel.swift b/DuckDuckGo/Subscription/ViewModel/SubscriptionFlowViewModel.swift index 5dc11256ab..fd9ae97268 100644 --- a/DuckDuckGo/Subscription/ViewModel/SubscriptionFlowViewModel.swift +++ b/DuckDuckGo/Subscription/ViewModel/SubscriptionFlowViewModel.swift @@ -183,7 +183,7 @@ final class SubscriptionFlowViewModel: ObservableObject { isBackendError = true state.transactionError = .hasActiveSubscription case .cancelledByUser: - state.transactionError = nil + state.transactionError = .cancelledByUser case .accountCreationFailed: DailyPixel.fireDailyAndCount(pixel: .privacyProPurchaseFailureAccountNotCreated, pixelNameSuffixes: DailyPixel.Constant.legacyDailyPixelSuffixes) From d9b7c14f79b36f697748a65a50d5c00501e09f88 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Fri, 13 Dec 2024 11:50:49 +0100 Subject: [PATCH 44/66] Release 7.149.0-3 (#3726) Please make sure all GH checks passed before merging. It can take around 20 minutes. Briefly review this PR to see if there are no issues or red flags and then merge it. --- DuckDuckGo.xcodeproj/project.pbxproj | 64 ++++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 943f4e0894..fbe80bb961 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9670,7 +9670,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9707,7 +9707,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9797,7 +9797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9824,7 +9824,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9972,7 +9972,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9998,7 +9998,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10065,7 +10065,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10099,7 +10099,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10132,7 +10132,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10162,7 +10162,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10493,7 +10493,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10531,7 +10531,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10568,7 +10568,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10607,7 +10607,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10705,7 +10705,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10736,7 +10736,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10764,7 +10764,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10797,7 +10797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10827,7 +10827,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10860,11 +10860,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11096,7 +11096,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11124,7 +11124,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11156,7 +11156,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11193,7 +11193,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11228,7 +11228,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11263,11 +11263,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11439,11 +11439,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11472,10 +11472,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2; + CURRENT_PROJECT_VERSION = 3; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 2; + DYLIB_CURRENT_VERSION = 3; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; From 4d78d097cc71babcfe81a7ed10d19f87f3e6be4e Mon Sep 17 00:00:00 2001 From: Christopher Brind Date: Fri, 13 Dec 2024 12:21:47 +0000 Subject: [PATCH 45/66] fire tab switcher / manager sources pixel (#3722) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/392891325557410/1208882840835128/f Tech Design URL: CC: **Description**: Fires a pixel depending on what is going on when the user opens the tab switcher. Also renames a couple of pixels for clarity. **Steps to test this PR**: 1. Open the tab switcher from anywhere should fire `m_tab_manager_opened_daily` but only the first time during in a day 2. Open the tab switcher from anywhere should fire `m_tab_manager_opened` every time 1. Open the tab switcher on the new tab page should fire `m_tab_manager_open_from_newtabpage` every time 2. Open the tab switcher while on the serp should fire `m_tab_manager_open_from_serp` every time 3. Open the tab switcher while on a website should fire `m_tab_manager_open_from_website` every time --- Core/PixelEvent.swift | 16 ++++++++++++---- DuckDuckGo/MainViewController.swift | 11 +++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index caf2b9f04e..8e6f1c3beb 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -60,7 +60,11 @@ extension Pixel { case tabSwitcherClickCloseTab case tabSwitcherSwipeCloseTab case tabSwitchLongPressNewTab - case tabSwitcherOpenDaily + case tabSwitcherOpenedDaily + + case tabSwitcherOpenedFromSerp + case tabSwitcherOpenedFromWebsite + case tabSwitcherOpenedFromNewTabPage case settingsDoNotSellShown case settingsDoNotSellOn @@ -118,7 +122,7 @@ extension Pixel { case tabBarForwardPressed case bookmarksButtonPressed case tabBarBookmarksLongPressed - case tabBarTabSwitcherPressed + case tabBarTabSwitcherOpened case homeScreenShown case homeScreenEditFavorite @@ -984,7 +988,11 @@ extension Pixel.Event { case .tabSwitcherClickCloseTab: return "m_tab_manager_close_tab_click" case .tabSwitcherSwipeCloseTab: return "m_tab_manager_close_tab_swipe" case .tabSwitchLongPressNewTab: return "m_tab_manager_long_press_new_tab" - case .tabSwitcherOpenDaily: return "m_tab_manager_clicked_daily" + case .tabSwitcherOpenedDaily: return "m_tab_manager_opened_daily" + + case .tabSwitcherOpenedFromSerp: return "m_tab_manager_open_from_serp" + case .tabSwitcherOpenedFromWebsite: return "m_tab_manager_open_from_website" + case .tabSwitcherOpenedFromNewTabPage: return "m_tab_manager_open_from_newtabpage" case .settingsDoNotSellShown: return "ms_dns" case .settingsDoNotSellOn: return "ms_dns_on" @@ -1064,7 +1072,7 @@ extension Pixel.Event { case .tabBarForwardPressed: return "mt_fw" case .bookmarksButtonPressed: return "mt_bm" case .tabBarBookmarksLongPressed: return "mt_bl" - case .tabBarTabSwitcherPressed: return "mt_tb" + case .tabBarTabSwitcherOpened: return "m_tab_manager_opened" case .bookmarkLaunchList: return "m_bookmark_launch_list" case .bookmarkLaunchScored: return "m_bookmark_launch_scored" diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index c129c44057..42a9bc7ea8 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -2611,8 +2611,15 @@ extension MainViewController: TabSwitcherButtonDelegate { } func showTabSwitcher(_ button: TabSwitcherButton) { - Pixel.fire(pixel: .tabBarTabSwitcherPressed) - DailyPixel.fireDaily(.tabSwitcherOpenDaily, withAdditionalParameters: TabSwitcherOpenDailyPixel().parameters(with: tabManager.model.tabs)) + Pixel.fire(pixel: .tabBarTabSwitcherOpened) + DailyPixel.fireDaily(.tabSwitcherOpenedDaily, withAdditionalParameters: TabSwitcherOpenDailyPixel().parameters(with: tabManager.model.tabs)) + if currentTab?.url?.isDuckDuckGoSearch == true { + Pixel.fire(pixel: .tabSwitcherOpenedFromSerp) + } else if currentTab?.url != nil { + Pixel.fire(pixel: .tabSwitcherOpenedFromWebsite) + } else { + Pixel.fire(pixel: .tabSwitcherOpenedFromNewTabPage) + } performCancel() showTabSwitcher() From 24c093e6fe0ccf4c2f986b904dfc9b453417da3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20=C5=9Apiewak?= Date: Mon, 16 Dec 2024 09:03:23 +0100 Subject: [PATCH 46/66] Reduce number of buckets for open tabs daily pixel (#3663) Task/Issue URL: https://app.asana.com/0/1206226850447395/1208866352354120/f Tech Design URL: CC: **Description**: Reduces the temporary high granularity of opened tabs buckets. **Steps to test this PR**: 1. Verify the validity of unit tests for daily open tabs pixel and whether they pass. **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- DuckDuckGo/TabSwitcherOpenDailyPixel.swift | 7 +------ DuckDuckGoTests/TabSwitcherOpenDailyPixelTests.swift | 8 ++------ 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/DuckDuckGo/TabSwitcherOpenDailyPixel.swift b/DuckDuckGo/TabSwitcherOpenDailyPixel.swift index c46735c497..b3dab0a802 100644 --- a/DuckDuckGo/TabSwitcherOpenDailyPixel.swift +++ b/DuckDuckGo/TabSwitcherOpenDailyPixel.swift @@ -49,12 +49,7 @@ struct TabSwitcherOpenDailyPixel { case 21...40: return "21-40" case 41...60: return "41-60" case 61...80: return "61-80" - case 81...100: return "81-100" - case 101...125: return "101-125" - case 126...150: return "126-150" - case 151...250: return "151-250" - case 251...500: return "251-500" - default: return "501+" + default: return "81+" } } diff --git a/DuckDuckGoTests/TabSwitcherOpenDailyPixelTests.swift b/DuckDuckGoTests/TabSwitcherOpenDailyPixelTests.swift index 9d5d9c984c..4b8aae8e9a 100644 --- a/DuckDuckGoTests/TabSwitcherOpenDailyPixelTests.swift +++ b/DuckDuckGoTests/TabSwitcherOpenDailyPixelTests.swift @@ -51,12 +51,8 @@ final class TabSwitcherOpenDailyPixelTests: XCTestCase { 21...40: "21-40", 41...60: "41-60", 61...80: "61-80", - 81...100: "81-100", - 101...125: "101-125", - 126...150: "126-150", - 151...250: "151-250", - 251...500: "251-500", - 501...504: "501+"] + 81...90: "81+", + 501...504: "81+"] for bucket in bucketValues { for value in bucket.key { From 63988627542507ff496116941334ba02c9a948d6 Mon Sep 17 00:00:00 2001 From: Dax Mobile <44842493+daxmobile@users.noreply.github.com> Date: Mon, 16 Dec 2024 22:49:32 +1100 Subject: [PATCH 47/66] Update autoconsent to v12.3.0 (#3728) Task/Issue URL: https://app.asana.com/0/1208976603817279/1208976603817279 Autoconsent Release: https://github.com/duckduckgo/autoconsent/releases/tag/v12.3.0 ## Description Updates Autoconsent to version [v12.3.0](https://github.com/duckduckgo/autoconsent/releases/tag/v12.3.0). ### Autoconsent v12.3.0 release notes See release notes [here](https://github.com/duckduckgo/autoconsent/blob/v12.3.0/CHANGELOG.md) --- DuckDuckGo/Autoconsent/autoconsent-bundle.js | 4 ++-- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/DuckDuckGo/Autoconsent/autoconsent-bundle.js b/DuckDuckGo/Autoconsent/autoconsent-bundle.js index 9d01909f60..1f3db588b9 100644 --- a/DuckDuckGo/Autoconsent/autoconsent-bundle.js +++ b/DuckDuckGo/Autoconsent/autoconsent-bundle.js @@ -1,4 +1,4 @@ -!function(){"use strict";var e=class e{static setBase(t){e.base=t}static findElement(t,o=null,i=!1){let n=null;return n=null!=o?Array.from(o.querySelectorAll(t.selector)):null!=e.base?Array.from(e.base.querySelectorAll(t.selector)):Array.from(document.querySelectorAll(t.selector)),null!=t.textFilter&&(n=n.filter((e=>{const o=e.textContent.toLowerCase();if(Array.isArray(t.textFilter)){let e=!1;for(const i of t.textFilter)if(-1!==o.indexOf(i.toLowerCase())){e=!0;break}return e}return null!=t.textFilter&&-1!==o.indexOf(t.textFilter.toLowerCase())}))),null!=t.styleFilters&&(n=n.filter((e=>{const o=window.getComputedStyle(e);let i=!0;for(const e of t.styleFilters){const t=o[e.option];i=e.negated?i&&t!==e.value:i&&t===e.value}return i}))),null!=t.displayFilter&&(n=n.filter((e=>t.displayFilter?0!==e.offsetHeight:0===e.offsetHeight))),null!=t.iframeFilter&&(n=n.filter((()=>t.iframeFilter?window.location!==window.parent.location:window.location===window.parent.location))),null!=t.childFilter&&(n=n.filter((o=>{const i=e.base;e.setBase(o);const n=e.find(t.childFilter);return e.setBase(i),null!=n.target}))),i?n:(n.length>1&&console.warn("Multiple possible targets: ",n,t,o),n[0])}static find(t,o=!1){const i=[];if(null!=t.parent){const n=e.findElement(t.parent,null,o);if(null!=n){if(n instanceof Array)return n.forEach((n=>{const s=e.findElement(t.target,n,o);s instanceof Array?s.forEach((e=>{i.push({parent:n,target:e})})):i.push({parent:n,target:s})})),i;{const s=e.findElement(t.target,n,o);s instanceof Array?s.forEach((e=>{i.push({parent:n,target:e})})):i.push({parent:n,target:s})}}}else{const n=e.findElement(t.target,null,o);n instanceof Array?n.forEach((e=>{i.push({parent:null,target:e})})):i.push({parent:null,target:n})}return 0===i.length&&i.push({parent:null,target:null}),o?i:(1!==i.length&&console.warn("Multiple results found, even though multiple false",i),i[0])}};e.base=null;var t=e;function o(e){const o=t.find(e);return"css"===e.type?!!o.target:"checkbox"===e.type?!!o.target&&o.target.checked:void 0}async function i(e,c){switch(e.type){case"click":return async function(e){const o=t.find(e);null!=o.target&&o.target.click();return s(n)}(e);case"list":return async function(e,t){for(const o of e.actions)await i(o,t)}(e,c);case"consent":return async function(e,t){for(const n of e.consents){const e=-1!==t.indexOf(n.type);if(n.matcher&&n.toggleAction){o(n.matcher)!==e&&await i(n.toggleAction)}else e?await i(n.trueAction):await i(n.falseAction)}}(e,c);case"ifcss":return async function(e,o){const n=t.find(e);n.target?e.falseAction&&await i(e.falseAction,o):e.trueAction&&await i(e.trueAction,o)}(e,c);case"waitcss":return async function(e){await new Promise((o=>{let i=e.retries||10;const n=e.waitTime||250,s=()=>{const c=t.find(e);(e.negated&&c.target||!e.negated&&!c.target)&&i>0?(i-=1,setTimeout(s,n)):o()};s()}))}(e);case"foreach":return async function(e,o){const n=t.find(e,!0),s=t.base;for(const s of n)s.target&&(t.setBase(s.target),await i(e.action,o));t.setBase(s)}(e,c);case"hide":return async function(e){const o=t.find(e);o.target&&o.target.classList.add("Autoconsent-Hidden")}(e);case"slide":return async function(e){const o=t.find(e),i=t.find(e.dragTarget);if(o.target){const e=o.target.getBoundingClientRect(),t=i.target.getBoundingClientRect();let n=t.top-e.top,s=t.left-e.left;"y"===this.config.axis.toLowerCase()&&(s=0),"x"===this.config.axis.toLowerCase()&&(n=0);const c=window.screenX+e.left+e.width/2,r=window.screenY+e.top+e.height/2,a=e.left+e.width/2,l=e.top+e.height/2,p=document.createEvent("MouseEvents");p.initMouseEvent("mousedown",!0,!0,window,0,c,r,a,l,!1,!1,!1,!1,0,o.target);const d=document.createEvent("MouseEvents");d.initMouseEvent("mousemove",!0,!0,window,0,c+s,r+n,a+s,l+n,!1,!1,!1,!1,0,o.target);const u=document.createEvent("MouseEvents");u.initMouseEvent("mouseup",!0,!0,window,0,c+s,r+n,a+s,l+n,!1,!1,!1,!1,0,o.target),o.target.dispatchEvent(p),await this.waitTimeout(10),o.target.dispatchEvent(d),await this.waitTimeout(10),o.target.dispatchEvent(u)}}(e);case"close":return async function(){window.close()}();case"wait":return async function(e){await s(e.waitTime)}(e);case"eval":return async function(e){return console.log("eval!",e.code),new Promise((t=>{try{e.async?(window.eval(e.code),setTimeout((()=>{t(window.eval("window.__consentCheckResult"))}),e.timeout||250)):t(window.eval(e.code))}catch(o){console.warn("eval error",o,e.code),t(!1)}}))}(e);default:throw new Error("Unknown action type: "+e.type)}}var n=0;function s(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function c(){return crypto&&void 0!==crypto.randomUUID?crypto.randomUUID():Math.random().toString()}var r=class{constructor(e,t=1e3){this.id=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),this.timer=window.setTimeout((()=>{this.reject(new Error("timeout"))}),t)}},a={pending:new Map,sendContentMessage:null};var l={EVAL_0:()=>console.log(1),EVAL_CONSENTMANAGER_1:()=>window.__cmp&&"object"==typeof __cmp("getCMPData"),EVAL_CONSENTMANAGER_2:()=>!__cmp("consentStatus").userChoiceExists,EVAL_CONSENTMANAGER_3:()=>__cmp("setConsent",0),EVAL_CONSENTMANAGER_4:()=>__cmp("setConsent",1),EVAL_CONSENTMANAGER_5:()=>__cmp("consentStatus").userChoiceExists,EVAL_COOKIEBOT_1:()=>!!window.Cookiebot,EVAL_COOKIEBOT_2:()=>!window.Cookiebot.hasResponse&&!0===window.Cookiebot.dialog?.visible,EVAL_COOKIEBOT_3:()=>window.Cookiebot.withdraw()||!0,EVAL_COOKIEBOT_4:()=>window.Cookiebot.hide()||!0,EVAL_COOKIEBOT_5:()=>!0===window.Cookiebot.declined,EVAL_KLARO_1:()=>{const e=globalThis.klaroConfig||globalThis.klaro?.getManager&&globalThis.klaro.getManager().config;if(!e)return!0;const t=(e.services||e.apps).filter((e=>!e.required)).map((e=>e.name));if(klaro&&klaro.getManager){const e=klaro.getManager();return t.every((t=>!e.consents[t]))}if(klaroConfig&&"cookie"===klaroConfig.storageMethod){const e=klaroConfig.cookieName||klaroConfig.storageName,o=JSON.parse(decodeURIComponent(document.cookie.split(";").find((t=>t.trim().startsWith(e))).split("=")[1]));return Object.keys(o).filter((e=>t.includes(e))).every((e=>!1===o[e]))}},EVAL_KLARO_OPEN_POPUP:()=>{klaro.show(void 0,!0)},EVAL_KLARO_TRY_API_OPT_OUT:()=>{if(window.klaro&&"function"==typeof klaro.show&&"function"==typeof klaro.getManager)try{return klaro.getManager().changeAll(!1),klaro.getManager().saveAndApplyConsents(),!0}catch(e){return console.warn(e),!1}return!1},EVAL_ONETRUST_1:()=>window.OnetrustActiveGroups.split(",").filter((e=>e.length>0)).length<=1,EVAL_TRUSTARC_TOP:()=>window&&window.truste&&"0"===window.truste.eu.bindMap.prefCookie,EVAL_TRUSTARC_FRAME_TEST:()=>window&&window.QueryString&&"0"===window.QueryString.preferences,EVAL_TRUSTARC_FRAME_GTM:()=>window&&window.QueryString&&"1"===window.QueryString.gtm,EVAL_ABC_TEST:()=>document.cookie.includes("trackingconsent"),EVAL_ADROLL_0:()=>!document.cookie.includes("__adroll_fpc"),EVAL_ALMACMP_0:()=>document.cookie.includes('"name":"Google","consent":false'),EVAL_AFFINITY_SERIF_COM_0:()=>document.cookie.includes("serif_manage_cookies_viewed")&&!document.cookie.includes("serif_allow_analytics"),EVAL_ARBEITSAGENTUR_TEST:()=>document.cookie.includes("cookie_consent=denied"),EVAL_AXEPTIO_0:()=>document.cookie.includes("axeptio_authorized_vendors=%2C%2C"),EVAL_BAHN_TEST:()=>1===utag.gdpr.getSelectedCategories().length,EVAL_BING_0:()=>document.cookie.includes("AD=0"),EVAL_BLOCKSY_0:()=>document.cookie.includes("blocksy_cookies_consent_accepted=no"),EVAL_BORLABS_0:()=>!JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("borlabs-cookie"))).split("=",2)[1])).consents.statistics,EVAL_BUNDESREGIERUNG_DE_0:()=>document.cookie.match("cookie-allow-tracking=0"),EVAL_CANVA_0:()=>!document.cookie.includes("gtm_fpc_engagement_event"),EVAL_CC_BANNER2_0:()=>!!document.cookie.match(/sncc=[^;]+D%3Dtrue/),EVAL_CLICKIO_0:()=>document.cookie.includes("__lxG__consent__v2_daisybit="),EVAL_CLINCH_0:()=>document.cookie.includes("ctc_rejected=1"),EVAL_COOKIECONSENT2_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COOKIECONSENT3_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COINBASE_0:()=>JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent.length<=1,EVAL_COMPLIANZ_BANNER_0:()=>document.cookie.includes("cmplz_banner-status=dismissed"),EVAL_COOKIE_LAW_INFO_0:()=>CLI.disableAllCookies()||CLI.reject_close()||!0,EVAL_COOKIE_LAW_INFO_1:()=>-1===document.cookie.indexOf("cookielawinfo-checkbox-non-necessary=yes"),EVAL_COOKIE_LAW_INFO_DETECT:()=>!!window.CLI,EVAL_COOKIE_MANAGER_POPUP_0:()=>!1===JSON.parse(document.cookie.split(";").find((e=>e.trim().startsWith("CookieLevel"))).split("=")[1]).social,EVAL_COOKIEALERT_0:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_1:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_2:()=>!0===window.CookieConsent.declined,EVAL_COOKIEFIRST_0:()=>{return!1===(e=JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("cookiefirst"))).trim()).split("=")[1])).performance&&!1===e.functional&&!1===e.advertising;var e},EVAL_COOKIEFIRST_1:()=>document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((e=>"true"===e.getAttribute("aria-checked")&&e.click()))||!0,EVAL_COOKIEINFORMATION_0:()=>CookieInformation.declineAllCategories()||!0,EVAL_COOKIEINFORMATION_1:()=>CookieInformation.submitAllCategories()||!0,EVAL_COOKIEINFORMATION_2:()=>document.cookie.includes("CookieInformationConsent="),EVAL_COOKIEYES_0:()=>document.cookie.includes("advertisement:no"),EVAL_DAILYMOTION_0:()=>!!document.cookie.match("dm-euconsent-v2"),EVAL_DNDBEYOND_TEST:()=>document.cookie.includes("cookie-consent=denied"),EVAL_DSGVO_0:()=>!document.cookie.includes("sp_dsgvo_cookie_settings"),EVAL_DUNELM_0:()=>document.cookie.includes("cc_functional=0")&&document.cookie.includes("cc_targeting=0"),EVAL_ETSY_0:()=>document.querySelectorAll(".gdpr-overlay-body input").forEach((e=>{e.checked=!1}))||!0,EVAL_ETSY_1:()=>document.querySelector(".gdpr-overlay-view button[data-wt-overlay-close]").click()||!0,EVAL_EU_COOKIE_COMPLIANCE_0:()=>-1===document.cookie.indexOf("cookie-agreed=2"),EVAL_EU_COOKIE_LAW_0:()=>!document.cookie.includes("euCookie"),EVAL_EZOIC_0:()=>ezCMP.handleAcceptAllClick(),EVAL_EZOIC_1:()=>!!document.cookie.match(/ez-consent-tcf/),EVAL_FIDES_DETECT_POPUP:()=>window.Fides?.initialized,EVAL_GOOGLE_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_HEMA_TEST_0:()=>document.cookie.includes("cookies_rejected=1"),EVAL_IUBENDA_0:()=>document.querySelectorAll(".purposes-item input[type=checkbox]:not([disabled])").forEach((e=>{e.checked&&e.click()}))||!0,EVAL_IUBENDA_1:()=>!!document.cookie.match(/_iub_cs-\d+=/),EVAL_IWINK_TEST:()=>document.cookie.includes("cookie_permission_granted=no"),EVAL_JQUERY_COOKIEBAR_0:()=>!document.cookie.includes("cookies-state=accepted"),EVAL_KETCH_TEST:()=>document.cookie.includes("_ketch_consent_v1_"),EVAL_MEDIAVINE_0:()=>document.querySelectorAll('[data-name="mediavine-gdpr-cmp"] input[type=checkbox]').forEach((e=>e.checked&&e.click()))||!0,EVAL_MICROSOFT_0:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Reject|Ablehnen")))[0].click()||!0,EVAL_MICROSOFT_1:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Accept|Annehmen")))[0].click()||!0,EVAL_MICROSOFT_2:()=>!!document.cookie.match("MSCC|GHCC"),EVAL_MOOVE_0:()=>document.querySelectorAll("#moove_gdpr_cookie_modal input").forEach((e=>{e.disabled||(e.checked="moove_gdpr_strict_cookies"===e.name||"moove_gdpr_strict_cookies"===e.id)}))||!0,EVAL_ONENINETWO_0:()=>document.cookie.includes("CC_ADVERTISING=NO")&&document.cookie.includes("CC_ANALYTICS=NO"),EVAL_OPENAI_TEST:()=>document.cookie.includes("oai-allow-ne=false"),EVAL_OPERA_0:()=>document.cookie.includes("cookie_consent_essential=true")&&!document.cookie.includes("cookie_consent_marketing=true"),EVAL_PAYPAL_0:()=>!0===document.cookie.includes("cookie_prefs"),EVAL_PRIMEBOX_0:()=>!document.cookie.includes("cb-enabled=accepted"),EVAL_PUBTECH_0:()=>document.cookie.includes("euconsent-v2")&&(document.cookie.match(/.YAAAAAAAAAAA/)||document.cookie.match(/.aAAAAAAAAAAA/)||document.cookie.match(/.YAAACFgAAAAA/)),EVAL_REDDIT_0:()=>document.cookie.includes("eu_cookie={%22opted%22:true%2C%22nonessential%22:false}"),EVAL_ROBLOX_TEST:()=>document.cookie.includes("RBXcb"),EVAL_SKYSCANNER_TEST:()=>document.cookie.match(/gdpr=[^;]*adverts:::false/)&&!document.cookie.match(/gdpr=[^;]*init:::true/),EVAL_SIRDATA_UNBLOCK_SCROLL:()=>(document.documentElement.classList.forEach((e=>{e.startsWith("sd-cmp-")&&document.documentElement.classList.remove(e)})),!0),EVAL_SNIGEL_0:()=>!!document.cookie.match("snconsent"),EVAL_STEAMPOWERED_0:()=>2===JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>e.trim().startsWith("cookieSettings"))).split("=")[1])).preference_state,EVAL_SVT_TEST:()=>document.cookie.includes('cookie-consent-1={"optedIn":true,"functionality":false,"statistics":false}'),EVAL_TAKEALOT_0:()=>document.body.classList.remove("freeze")||(document.body.style="")||!0,EVAL_TARTEAUCITRON_0:()=>tarteaucitron.userInterface.respondAll(!1)||!0,EVAL_TARTEAUCITRON_1:()=>tarteaucitron.userInterface.respondAll(!0)||!0,EVAL_TARTEAUCITRON_2:()=>document.cookie.match(/tarteaucitron=[^;]*/)?.[0].includes("false"),EVAL_TAUNTON_TEST:()=>document.cookie.includes("taunton_user_consent_submitted=true"),EVAL_TEALIUM_0:()=>void 0!==window.utag&&"object"==typeof utag.gdpr,EVAL_TEALIUM_1:()=>utag.gdpr.setConsentValue(!1)||!0,EVAL_TEALIUM_DONOTSELL:()=>utag.gdpr.dns?.setDnsState(!1)||!0,EVAL_TEALIUM_2:()=>utag.gdpr.setConsentValue(!0)||!0,EVAL_TEALIUM_3:()=>1!==utag.gdpr.getConsentState(),EVAL_TEALIUM_DONOTSELL_CHECK:()=>1!==utag.gdpr.dns?.getDnsState(),EVAL_TESLA_TEST:()=>document.cookie.includes("tsla-cookie-consent=rejected"),EVAL_TESTCMP_STEP:()=>!!document.querySelector("#reject-all"),EVAL_TESTCMP_0:()=>"button_clicked"===window.results.results[0],EVAL_TESTCMP_COSMETIC_0:()=>"banner_hidden"===window.results.results[0],EVAL_THEFREEDICTIONARY_0:()=>cmpUi.showPurposes()||cmpUi.rejectAll()||!0,EVAL_THEFREEDICTIONARY_1:()=>cmpUi.allowAll()||!0,EVAL_THEVERGE_0:()=>document.cookie.includes("_duet_gdpr_acknowledged=1"),EVAL_TWCC_TEST:()=>document.cookie.includes("twCookieConsent="),EVAL_UBUNTU_COM_0:()=>document.cookie.includes("_cookies_accepted=essential"),EVAL_UK_COOKIE_CONSENT_0:()=>!document.cookie.includes("catAccCookies"),EVAL_USERCENTRICS_API_0:()=>"object"==typeof UC_UI,EVAL_USERCENTRICS_API_1:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_2:()=>!!UC_UI.denyAllConsents(),EVAL_USERCENTRICS_API_3:()=>!!UC_UI.acceptAllConsents(),EVAL_USERCENTRICS_API_4:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_5:()=>!0===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_API_6:()=>!1===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_BUTTON_0:()=>JSON.parse(localStorage.getItem("usercentrics")).consents.every((e=>e.isEssential||!e.consentStatus)),EVAL_WAITROSE_0:()=>Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e=>e.click()))||!0,EVAL_WAITROSE_1:()=>document.cookie.includes("wtr_cookies_advertising=0")&&document.cookie.includes("wtr_cookies_analytics=0"),EVAL_WP_COOKIE_NOTICE_0:()=>document.cookie.includes("wpl_viewed_cookie=no"),EVAL_XE_TEST:()=>document.cookie.includes("xeConsentState={%22performance%22:false%2C%22marketing%22:false%2C%22compliance%22:false}"),EVAL_XING_0:()=>document.cookie.includes("userConsent=%7B%22marketing%22%3Afalse"),EVAL_YOUTUBE_DESKTOP_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_YOUTUBE_MOBILE_0:()=>!!document.cookie.match(/SOCS=CAE/)};var p={main:!0,frame:!1,urlPattern:""},d=class{constructor(e){this.runContext=p,this.autoconsent=e}get hasSelfTest(){throw new Error("Not Implemented")}get isIntermediate(){throw new Error("Not Implemented")}get isCosmetic(){throw new Error("Not Implemented")}mainWorldEval(e){const t=l[e];if(!t)return console.warn("Snippet not found",e),Promise.resolve(!1);const o=this.autoconsent.config.logs;if(this.autoconsent.config.isMainWorld){o.evals&&console.log("inline eval:",e,t);let i=!1;try{i=!!t.call(globalThis)}catch(t){o.evals&&console.error("error evaluating rule",e,t)}return Promise.resolve(i)}const i=`(${t.toString()})()`;return o.evals&&console.log("async eval:",e,i),function(e,t){const o=c();a.sendContentMessage({type:"eval",id:o,code:e,snippetId:t});const i=new r(o);return a.pending.set(i.id,i),i.promise}(i,e).catch((t=>(o.evals&&console.error("error evaluating rule",e,t),!1)))}checkRunContext(){const e={...p,...this.runContext},t=window.top===window;return!(t&&!e.main)&&(!(!t&&!e.frame)&&!(e.urlPattern&&!window.location.href.match(e.urlPattern)))}detectCmp(){throw new Error("Not Implemented")}async detectPopup(){return!1}optOut(){throw new Error("Not Implemented")}optIn(){throw new Error("Not Implemented")}openCmp(){throw new Error("Not Implemented")}async test(){return Promise.resolve(!0)}click(e,t=!1){return this.autoconsent.domActions.click(e,t)}elementExists(e){return this.autoconsent.domActions.elementExists(e)}elementVisible(e,t){return this.autoconsent.domActions.elementVisible(e,t)}waitForElement(e,t){return this.autoconsent.domActions.waitForElement(e,t)}waitForVisible(e,t,o){return this.autoconsent.domActions.waitForVisible(e,t,o)}waitForThenClick(e,t,o){return this.autoconsent.domActions.waitForThenClick(e,t,o)}wait(e){return this.autoconsent.domActions.wait(e)}hide(e,t){return this.autoconsent.domActions.hide(e,t)}prehide(e){return this.autoconsent.domActions.prehide(e)}undoPrehide(){return this.autoconsent.domActions.undoPrehide()}querySingleReplySelector(e,t){return this.autoconsent.domActions.querySingleReplySelector(e,t)}querySelectorChain(e){return this.autoconsent.domActions.querySelectorChain(e)}elementSelector(e){return this.autoconsent.domActions.elementSelector(e)}},u=class extends d{constructor(e,t){super(t),this.rule=e,this.name=e.name,this.runContext=e.runContext||p}get hasSelfTest(){return!!this.rule.test}get isIntermediate(){return!!this.rule.intermediate}get isCosmetic(){return!!this.rule.cosmetic}get prehideSelectors(){return this.rule.prehideSelectors}async detectCmp(){return!!this.rule.detectCmp&&this._runRulesParallel(this.rule.detectCmp)}async detectPopup(){return!!this.rule.detectPopup&&this._runRulesSequentially(this.rule.detectPopup)}async optOut(){const e=this.autoconsent.config.logs;return!!this.rule.optOut&&(e.lifecycle&&console.log("Initiated optOut()",this.rule.optOut),this._runRulesSequentially(this.rule.optOut))}async optIn(){const e=this.autoconsent.config.logs;return!!this.rule.optIn&&(e.lifecycle&&console.log("Initiated optIn()",this.rule.optIn),this._runRulesSequentially(this.rule.optIn))}async openCmp(){return!!this.rule.openCmp&&this._runRulesSequentially(this.rule.openCmp)}async test(){return this.hasSelfTest?this._runRulesSequentially(this.rule.test):super.test()}async evaluateRuleStep(e){const t=[],o=this.autoconsent.config.logs;if(e.exists&&t.push(this.elementExists(e.exists)),e.visible&&t.push(this.elementVisible(e.visible,e.check)),e.eval){const o=this.mainWorldEval(e.eval);t.push(o)}if(e.waitFor&&t.push(this.waitForElement(e.waitFor,e.timeout)),e.waitForVisible&&t.push(this.waitForVisible(e.waitForVisible,e.timeout,e.check)),e.click&&t.push(this.click(e.click,e.all)),e.waitForThenClick&&t.push(this.waitForThenClick(e.waitForThenClick,e.timeout,e.all)),e.wait&&t.push(this.wait(e.wait)),e.hide&&t.push(this.hide(e.hide,e.method)),e.if){if(!e.if.exists&&!e.if.visible)return console.error("invalid conditional rule",e.if),!1;const i=await this.evaluateRuleStep(e.if);o.rulesteps&&console.log("Condition is",i),i?t.push(this._runRulesSequentially(e.then)):e.else?t.push(this._runRulesSequentially(e.else)):t.push(!0)}if(e.any){for(const t of e.any)if(await this.evaluateRuleStep(t))return!0;return!1}if(0===t.length)return o.errors&&console.warn("Unrecognized rule",e),!1;return(await Promise.all(t)).reduce(((e,t)=>e&&t),!0)}async _runRulesParallel(e){const t=e.map((e=>this.evaluateRuleStep(e)));return(await Promise.all(t)).every((e=>!!e))}async _runRulesSequentially(e){const t=this.autoconsent.config.logs;for(const o of e){t.rulesteps&&console.log("Running rule...",o);const e=await this.evaluateRuleStep(o);if(t.rulesteps&&console.log("...rule result",e),!e&&!o.optional)return!1}return!0}},h=class{constructor(e,t){this.name=e,this.config=t,this.methods=new Map,this.runContext=p,this.isCosmetic=!1,t.methods.forEach((e=>{e.action&&this.methods.set(e.name,e.action)})),this.hasSelfTest=!1}get isIntermediate(){return!1}checkRunContext(){return!0}async detectCmp(){return this.config.detectors.map((e=>o(e.presentMatcher))).some((e=>!!e))}async detectPopup(){return this.config.detectors.map((e=>o(e.showingMatcher))).some((e=>!!e))}async executeAction(e,t){return!this.methods.has(e)||i(this.methods.get(e),t)}async optOut(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",[]),await this.executeAction("SAVE_CONSENT"),!0}async optIn(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",["D","A","B","E","F","X"]),await this.executeAction("SAVE_CONSENT"),!0}async openCmp(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),!0}async test(){return!0}};function m(e="autoconsent-css-rules"){const t=`style#${e}`,o=document.querySelector(t);if(o&&o instanceof HTMLStyleElement)return o;{const t=document.head||document.getElementsByTagName("head")[0]||document.documentElement,o=document.createElement("style");return o.id=e,t.appendChild(o),o}}function A(e){return`${"opacity"===e?"opacity: 0":"display: none"} !important; z-index: -1 !important; pointer-events: none !important;`}function g(e,t,o="display"){const i=`${t} { ${A(o)} } `;return e instanceof HTMLStyleElement&&(e.innerText+=i,t.length>0)}async function f(e,t,o){const i=await e();return!i&&t>0?new Promise((i=>{setTimeout((async()=>{i(f(e,t-1,o))}),o)})):Promise.resolve(i)}function k(e){if(!e)return!1;if(null!==e.offsetParent)return!0;{const t=window.getComputedStyle(e);if("fixed"===t.position&&"none"!==t.display)return!0}return!1}function b(e){const t={enabled:!0,autoAction:"optOut",disabledCmps:[],enablePrehide:!0,enableCosmeticRules:!0,detectRetries:20,isMainWorld:!1,prehideTimeout:2e3,enableFilterList:!1,logs:{lifecycle:!1,rulesteps:!1,evals:!1,errors:!0,messages:!1}},o=(i=t,globalThis.structuredClone?structuredClone(i):JSON.parse(JSON.stringify(i)));var i;for(const i of Object.keys(t))void 0!==e[i]&&(o[i]=e[i]);return o}var y="#truste-show-consent",w="#truste-consent-track",v=[class extends d{constructor(e){super(e),this.name="TrustArc-top",this.prehideSelectors=[".trustarc-banner-container",`.truste_popframe,.truste_overlay,.truste_box_overlay,${w}`],this.runContext={main:!0,frame:!1},this._shortcutButton=null,this._optInDone=!1}get hasSelfTest(){return!0}get isIntermediate(){return!this._optInDone&&!this._shortcutButton}get isCosmetic(){return!1}async detectCmp(){const e=this.elementExists(`${y},${w}`);return e&&(this._shortcutButton=document.querySelector("#truste-consent-required")),e}async detectPopup(){return this.elementVisible(`#truste-consent-content,#trustarc-banner-overlay,${w}`,"any")}openFrame(){this.click(y)}async optOut(){return this._shortcutButton?(this._shortcutButton.click(),!0):(g(m(),`.truste_popframe, .truste_overlay, .truste_box_overlay, ${w}`),this.click(y),setTimeout((()=>{m().remove()}),1e4),!0)}async optIn(){return this._optInDone=!0,this.click("#truste-consent-button")}async openCmp(){return!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_TOP")}},class extends d{constructor(){super(...arguments),this.name="TrustArc-frame",this.runContext={main:!1,frame:!0,urlPattern:"^https://consent-pref\\.trustarc\\.com/\\?"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return!0}async detectPopup(){return this.elementVisible("#defaultpreferencemanager","any")&&this.elementVisible(".mainContent","any")}async navigateToSettings(){return await f((async()=>this.elementExists(".shp")||this.elementVisible(".advance","any")||this.elementExists(".switch span:first-child")),10,500),this.elementExists(".shp")&&this.click(".shp"),await this.waitForElement(".prefPanel",5e3),this.elementVisible(".advance","any")&&this.click(".advance"),await f((()=>this.elementVisible(".switch span:first-child","any")),5,1e3)}async optOut(){if(await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST"))return!0;let e=3e3;return await this.mainWorldEval("EVAL_TRUSTARC_FRAME_GTM")&&(e=1500),await f((()=>"complete"===document.readyState),20,100),await this.waitForElement(".mainContent[aria-hidden=false]",e),!!this.click(".rejectAll")||(this.elementExists(".prefPanel")&&await this.waitForElement('.prefPanel[style="visibility: visible;"]',e),this.click("#catDetails0")?(this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",e),!0):this.click(".required")?(this.waitForThenClick("#gwt-debug-close_id",e),!0):(await this.navigateToSettings(),this.click(".switch span:nth-child(1):not(.active)",!0),this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",10*e),!0))}async optIn(){return this.click(".call")||(await this.navigateToSettings(),this.click(".switch span:nth-child(2)",!0),this.click(".submit"),this.waitForElement("#gwt-debug-close_id",3e5).then((()=>{this.click("#gwt-debug-close_id")}))),!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST")}},class extends d{constructor(){super(...arguments),this.name="Cybotcookiebot",this.prehideSelectors=["#CybotCookiebotDialog,#CybotCookiebotDialogBodyUnderlay,#dtcookie-container,#cookiebanner,#cb-cookieoverlay,.modal--cookie-banner,#cookiebanner_outer,#CookieBanner"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return await this.mainWorldEval("EVAL_COOKIEBOT_1")}async detectPopup(){return this.mainWorldEval("EVAL_COOKIEBOT_2")}async optOut(){await this.wait(500);let e=await this.mainWorldEval("EVAL_COOKIEBOT_3");return await this.wait(500),e=e&&await this.mainWorldEval("EVAL_COOKIEBOT_4"),e}async optIn(){return this.elementExists("#dtcookie-container")?this.click(".h-dtcookie-accept"):(this.click(".CybotCookiebotDialogBodyLevelButton:not(:checked):enabled",!0),this.click("#CybotCookiebotDialogBodyLevelButtonAccept"),this.click("#CybotCookiebotDialogBodyButtonAccept"),!0)}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_COOKIEBOT_5")}},class extends d{constructor(){super(...arguments),this.name="Sourcepoint-frame",this.prehideSelectors=["div[id^='sp_message_container_'],.message-overlay","#sp_privacy_manager_container"],this.ccpaNotice=!1,this.ccpaPopup=!1,this.runContext={main:!0,frame:!0}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){const e=new URL(location.href);return e.searchParams.has("message_id")&&"ccpa-notice.sp-prod.net"===e.hostname?(this.ccpaNotice=!0,!0):"ccpa-pm.sp-prod.net"===e.hostname?(this.ccpaPopup=!0,!0):("/index.html"===e.pathname||"/privacy-manager/index.html"===e.pathname||"/ccpa_pm/index.html"===e.pathname)&&(e.searchParams.has("message_id")||e.searchParams.has("requestUUID")||e.searchParams.has("consentUUID"))}async detectPopup(){return!!this.ccpaNotice||(this.ccpaPopup?await this.waitForElement(".priv-save-btn",2e3):(await this.waitForElement(".sp_choice_type_11,.sp_choice_type_12,.sp_choice_type_13,.sp_choice_type_ACCEPT_ALL,.sp_choice_type_SAVE_AND_EXIT",2e3),!this.elementExists(".sp_choice_type_9")))}async optIn(){return await this.waitForElement(".sp_choice_type_11,.sp_choice_type_ACCEPT_ALL",2e3),!!this.click(".sp_choice_type_11")||!!this.click(".sp_choice_type_ACCEPT_ALL")}isManagerOpen(){return"/privacy-manager/index.html"===location.pathname||"/ccpa_pm/index.html"===location.pathname}async optOut(){const e=this.autoconsent.config.logs;if(this.ccpaPopup){const e=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.neutral.on .right");for(const t of e)t.click();const t=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.switch-bg.on");for(const e of t)e.click();return this.click(".priv-save-btn")}if(!this.isManagerOpen()){if(!await this.waitForElement(".sp_choice_type_12,.sp_choice_type_13"))return!1;if(!this.elementExists(".sp_choice_type_12"))return this.click(".sp_choice_type_13");this.click(".sp_choice_type_12"),await f((()=>this.isManagerOpen()),200,100)}await this.waitForElement(".type-modal",2e4),this.waitForThenClick(".ccpa-stack .pm-switch[aria-checked=true] .slider",500,!0);try{const e=".sp_choice_type_REJECT_ALL",t=".reject-toggle",o=await Promise.race([this.waitForElement(e,2e3).then((e=>e?0:-1)),this.waitForElement(t,2e3).then((e=>e?1:-1)),this.waitForElement(".pm-features",2e3).then((e=>e?2:-1))]);if(0===o)return await this.waitForVisible(e),this.click(e);1===o?this.click(t):2===o&&(await this.waitForElement(".pm-features",1e4),this.click(".checked > span",!0),this.click(".chevron"))}catch(t){e.errors&&console.warn(t)}return this.click(".sp_choice_type_SAVE_AND_EXIT")}},class extends d{constructor(){super(...arguments),this.name="consentmanager.net",this.prehideSelectors=["#cmpbox,#cmpbox2"],this.apiAvailable=!1}get hasSelfTest(){return this.apiAvailable}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.apiAvailable=await this.mainWorldEval("EVAL_CONSENTMANAGER_1"),!!this.apiAvailable||this.elementExists("#cmpbox")}async detectPopup(){return this.apiAvailable?(await this.wait(500),await this.mainWorldEval("EVAL_CONSENTMANAGER_2")):this.elementVisible("#cmpbox .cmpmore","any")}async optOut(){return await this.wait(500),this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_3"):!!this.click(".cmpboxbtnno")||(this.elementExists(".cmpwelcomeprpsbtn")?(this.click(".cmpwelcomeprpsbtn > a[aria-checked=true]",!0),this.click(".cmpboxbtnsave"),!0):(this.click(".cmpboxbtncustom"),await this.waitForElement(".cmptblbox",2e3),this.click(".cmptdchoice > a[aria-checked=true]",!0),this.click(".cmpboxbtnyescustomchoices"),this.hide("#cmpwrapper,#cmpbox","display"),!0))}async optIn(){return this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_4"):this.click(".cmpboxbtnyes")}async test(){if(this.apiAvailable)return await this.mainWorldEval("EVAL_CONSENTMANAGER_5")}},class extends d{constructor(){super(...arguments),this.name="Evidon"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#_evidon_banner")}async detectPopup(){return this.elementVisible("#_evidon_banner","any")}async optOut(){return this.click("#_evidon-decline-button")||(g(m(),"#evidon-prefdiag-overlay,#evidon-prefdiag-background,#_evidon-background"),await this.waitForThenClick("#_evidon-option-button"),await this.waitForElement("#evidon-prefdiag-overlay",5e3),await this.wait(500),await this.waitForThenClick("#evidon-prefdiag-decline")),!0}async optIn(){return this.click("#_evidon-accept-button")}},class extends d{constructor(){super(...arguments),this.name="Onetrust",this.prehideSelectors=["#onetrust-banner-sdk,#onetrust-consent-sdk,.onetrust-pc-dark-filter,.js-consent-banner"],this.runContext={urlPattern:"^(?!.*https://www\\.nba\\.com/)"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#onetrust-banner-sdk,#onetrust-pc-sdk")}async detectPopup(){return this.elementVisible("#onetrust-banner-sdk,#onetrust-pc-sdk","any")}async optOut(){return this.elementVisible("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies","any")?this.click("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies"):(this.elementExists("#onetrust-pc-btn-handler")?this.click("#onetrust-pc-btn-handler"):this.click(".ot-sdk-show-settings,button.js-cookie-settings"),await this.waitForElement("#onetrust-consent-sdk",2e3),await this.wait(1e3),this.click("#onetrust-consent-sdk input.category-switch-handler:checked,.js-editor-toggle-state:checked",!0),await this.wait(1e3),await this.waitForElement(".save-preference-btn-handler,.js-consent-save",2e3),this.click(".save-preference-btn-handler,.js-consent-save"),await this.waitForVisible("#onetrust-banner-sdk",5e3,"none"),!0)}async optIn(){return this.click("#onetrust-accept-btn-handler,#accept-recommended-btn-handler,.js-accept-cookies")}async test(){return await f((()=>this.mainWorldEval("EVAL_ONETRUST_1")),10,500)}},class extends d{constructor(){super(...arguments),this.name="Klaro",this.prehideSelectors=[".klaro"],this.settingsOpen=!1}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".klaro > .cookie-modal")?(this.settingsOpen=!0,!0):this.elementExists(".klaro > .cookie-notice")}async detectPopup(){return this.elementVisible(".klaro > .cookie-notice,.klaro > .cookie-modal","any")}async optOut(){return!!await this.mainWorldEval("EVAL_KLARO_TRY_API_OPT_OUT")||(!!this.click(".klaro .cn-decline")||(await this.mainWorldEval("EVAL_KLARO_OPEN_POPUP"),!!this.click(".klaro .cn-decline")||(this.click(".cm-purpose:not(.cm-toggle-all) > input:not(.half-checked,.required,.only-required),.cm-purpose:not(.cm-toggle-all) > div > input:not(.half-checked,.required,.only-required)",!0),this.click(".cm-btn-accept,.cm-button"))))}async optIn(){return!!this.click(".klaro .cm-btn-accept-all")||(this.settingsOpen?(this.click(".cm-purpose:not(.cm-toggle-all) > input.half-checked",!0),this.click(".cm-btn-accept")):this.click(".klaro .cookie-notice .cm-btn-success"))}async test(){return await this.mainWorldEval("EVAL_KLARO_1")}},class extends d{constructor(){super(...arguments),this.name="Uniconsent"}get prehideSelectors(){return[".unic",".modal:has(.unic)"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".unic .unic-box,.unic .unic-bar,.unic .unic-modal")}async detectPopup(){return this.elementVisible(".unic .unic-box,.unic .unic-bar,.unic .unic-modal","any")}async optOut(){if(await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic button").forEach((e=>{const t=e.textContent;(t.includes("Manage Options")||t.includes("Optionen verwalten"))&&e.click()})),await this.waitForElement(".unic input[type=checkbox]",1e3)){await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic input[type=checkbox]").forEach((e=>{e.checked&&e.click()}));for(const e of document.querySelectorAll(".unic button")){const t=e.textContent;for(const o of["Confirm Choices","Save Choices","Auswahl speichern"])if(t.includes(o))return e.click(),await this.wait(500),!0}}return!1}async optIn(){return this.waitForThenClick(".unic #unic-agree")}async test(){await this.wait(1e3);return!this.elementExists(".unic .unic-box,.unic .unic-bar")}},class extends d{constructor(){super(...arguments),this.prehideSelectors=[".cmp-root"],this.name="Conversant"}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".cmp-root .cmp-receptacle")}async detectPopup(){return this.elementVisible(".cmp-root .cmp-receptacle","any")}async optOut(){if(!await this.waitForThenClick(".cmp-main-button:not(.cmp-main-button--primary)"))return!1;if(!await this.waitForElement(".cmp-view-tab-tabs"))return!1;await this.waitForThenClick(".cmp-view-tab-tabs > :first-child"),await this.waitForThenClick(".cmp-view-tab-tabs > .cmp-view-tab--active:first-child");for(const e of Array.from(document.querySelectorAll(".cmp-accordion-item"))){e.querySelector(".cmp-accordion-item-title").click(),await f((()=>!!e.querySelector(".cmp-accordion-item-content.cmp-active")),10,50);const t=e.querySelector(".cmp-accordion-item-content.cmp-active");t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-deny:not(.cmp-toggle-deny--active)").forEach((e=>e.click())),t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-checkbox:not(.cmp-toggle-checkbox--active)").forEach((e=>e.click()))}return await this.click(".cmp-main-button:not(.cmp-main-button--primary)"),!0}async optIn(){return this.waitForThenClick(".cmp-main-button.cmp-main-button--primary")}async test(){return document.cookie.includes("cmp-data=0")}},class extends d{constructor(){super(...arguments),this.name="tiktok.com",this.runContext={urlPattern:"tiktok"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}getShadowRoot(){const e=document.querySelector("tiktok-cookie-banner");return e?e.shadowRoot:null}async detectCmp(){return this.elementExists("tiktok-cookie-banner")}async detectPopup(){return k(this.getShadowRoot().querySelector(".tiktok-cookie-banner"))}async optOut(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:first-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no decline button found"),!1)}async optIn(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:last-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no accept button found"),!1)}async test(){const e=document.cookie.match(/cookie-consent=([^;]+)/);if(!e)return!1;const t=JSON.parse(decodeURIComponent(e[1]));return Object.values(t).every((e=>"boolean"!=typeof e||!1===e))}},class extends d{constructor(){super(...arguments),this.name="airbnb",this.runContext={urlPattern:"^https://(www\\.)?airbnb\\.[^/]+/"},this.prehideSelectors=["div[data-testid=main-cookies-banner-container]",'div:has(> div:first-child):has(> div:last-child):has(> section [data-testid="strictly-necessary-cookies"])']}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("div[data-testid=main-cookies-banner-container]")}async detectPopup(){return this.elementVisible("div[data-testid=main-cookies-banner-container","any")}async optOut(){let e;for(await this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._snbhip0");e=document.querySelector("[data-testid=modal-container] button[aria-checked=true]:not([disabled])");)e.click();return this.waitForThenClick("button[data-testid=save-btn]")}async optIn(){return this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._148dgdpk")}async test(){return await f((()=>!!document.cookie.match("OptanonAlertBoxClosed")),20,200)}},class extends d{constructor(){super(...arguments),this.name="tumblr-com",this.runContext={urlPattern:"^https://(www\\.)?tumblr\\.com/"}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}get prehideSelectors(){return["#cmp-app-container"]}async detectCmp(){return this.elementExists("#cmp-app-container")}async detectPopup(){return this.elementVisible("#cmp-app-container","any")}async optOut(){let e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary");return!!t&&(t.click(),await f((()=>{const e=document.querySelector("#cmp-app-container iframe");return!!e.contentDocument?.querySelector(".cmp__dialog input")}),5,500),e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary"),!!t&&(t.click(),!0))}async optIn(){const e=document.querySelector("#cmp-app-container iframe").contentDocument.querySelector(".cmp-components-button.is-primary");return!!e&&(e.click(),!0)}},class extends d{constructor(){super(...arguments),this.name="Admiral"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("div > div[class*=Card] > div[class*=Frame] > div[class*=Pills] > button[class*=Pills__StyledPill]")}async detectPopup(){return this.elementVisible("div > div[class*=Card] > div[class*=Frame] > div[class*=Pills] > button[class*=Pills__StyledPill]","any")}async optOut(){const e="xpath///button[contains(., 'Afvis alle') or contains(., 'Reject all') or contains(., 'Odbaci sve') or contains(., 'Rechazar todo') or contains(., 'Atmesti visus') or contains(., 'Odmítnout vše') or contains(., 'Απόρριψη όλων') or contains(., 'Rejeitar tudo') or contains(., 'Tümünü reddet') or contains(., 'Отклонить все') or contains(., 'Noraidīt visu') or contains(., 'Avvisa alla') or contains(., 'Odrzuć wszystkie') or contains(., 'Alles afwijzen') or contains(., 'Отхвърляне на всички') or contains(., 'Rifiuta tutto') or contains(., 'Zavrni vse') or contains(., 'Az összes elutasítása') or contains(., 'Respingeți tot') or contains(., 'Alles ablehnen') or contains(., 'Tout rejeter') or contains(., 'Odmietnuť všetko') or contains(., 'Lükka kõik tagasi') or contains(., 'Hylkää kaikki')]";if(await this.waitForElement(e,500))return this.click(e);const t="xpath///button[contains(., 'Spara & avsluta') or contains(., 'Save & exit') or contains(., 'Uložit a ukončit') or contains(., 'Enregistrer et quitter') or contains(., 'Speichern & Verlassen') or contains(., 'Tallenna ja poistu') or contains(., 'Išsaugoti ir išeiti') or contains(., 'Opslaan & afsluiten') or contains(., 'Guardar y salir') or contains(., 'Shrani in zapri') or contains(., 'Uložiť a ukončiť') or contains(., 'Kaydet ve çıkış yap') or contains(., 'Сохранить и выйти') or contains(., 'Salvesta ja välju') or contains(., 'Salva ed esci') or contains(., 'Gem & afslut') or contains(., 'Αποθήκευση και έξοδος') or contains(., 'Saglabāt un iziet') or contains(., 'Mentés és kilépés') or contains(., 'Guardar e sair') or contains(., 'Zapisz & zakończ') or contains(., 'Salvare și ieșire') or contains(., 'Spremi i izađi') or contains(., 'Запазване и изход')]";if(await this.waitForThenClick("xpath///button[contains(., 'Zwecke') or contains(., 'Σκοποί') or contains(., 'Purposes') or contains(., 'Цели') or contains(., 'Eesmärgid') or contains(., 'Tikslai') or contains(., 'Svrhe') or contains(., 'Cele') or contains(., 'Účely') or contains(., 'Finalidades') or contains(., 'Mērķi') or contains(., 'Scopuri') or contains(., 'Fines') or contains(., 'Ändamål') or contains(., 'Finalités') or contains(., 'Doeleinden') or contains(., 'Tarkoitukset') or contains(., 'Scopi') or contains(., 'Amaçlar') or contains(., 'Nameni') or contains(., 'Célok') or contains(., 'Formål')]")&&await this.waitForVisible(t)){return this.elementSelector(t)[0].parentElement.parentElement.querySelectorAll("input[type=checkbox]:checked").forEach((e=>e.click())),this.click(t)}return!1}async optIn(){return this.click("xpath///button[contains(., 'Sprejmi vse') or contains(., 'Prihvati sve') or contains(., 'Godkänn alla') or contains(., 'Prijať všetko') or contains(., 'Принять все') or contains(., 'Aceptar todo') or contains(., 'Αποδοχή όλων') or contains(., 'Zaakceptuj wszystkie') or contains(., 'Accetta tutto') or contains(., 'Priimti visus') or contains(., 'Pieņemt visu') or contains(., 'Tümünü kabul et') or contains(., 'Az összes elfogadása') or contains(., 'Accept all') or contains(., 'Приемане на всички') or contains(., 'Accepter alle') or contains(., 'Hyväksy kaikki') or contains(., 'Tout accepter') or contains(., 'Alles accepteren') or contains(., 'Aktsepteeri kõik') or contains(., 'Přijmout vše') or contains(., 'Alles akzeptieren') or contains(., 'Aceitar tudo') or contains(., 'Acceptați tot')]")}}],_=class{constructor(e){this.autoconsentInstance=e}click(e,t=!1){const o=this.elementSelector(e);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[click]",e,t,o),o.length>0&&(t?o.forEach((e=>e.click())):o[0].click()),o.length>0}elementExists(e){return this.elementSelector(e).length>0}elementVisible(e,t){const o=this.elementSelector(e),i=new Array(o.length);return o.forEach(((e,t)=>{i[t]=k(e)})),"none"===t?i.every((e=>!e)):0!==i.length&&("any"===t?i.some((e=>e)):i.every((e=>e)))}waitForElement(e,t=1e4){const o=Math.ceil(t/200);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[waitForElement]",e),f((()=>this.elementSelector(e).length>0),o,200)}waitForVisible(e,t=1e4,o="any"){const i=Math.ceil(t/200);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[waitForVisible]",e),f((()=>this.elementVisible(e,o)),i,200)}async waitForThenClick(e,t=1e4,o=!1){return await this.waitForElement(e,t),this.click(e,o)}wait(e){return this.autoconsentInstance.config.logs.rulesteps&&this.autoconsentInstance.config.logs.waits&&console.log("[wait]",e),new Promise((t=>{setTimeout((()=>{t(!0)}),e)}))}hide(e,t){this.autoconsentInstance.config.logs.rulesteps&&console.log("[hide]",e);return g(m(),e,t)}prehide(e){const t=m("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[prehide]",t,location.href),g(t,e,"opacity")}undoPrehide(){const e=m("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[undoprehide]",e,location.href),e&&e.remove(),!!e}async createOrUpdateStyleSheet(e,t){return t||(t=new CSSStyleSheet),t=await t.replace(e)}removeStyleSheet(e){return!!e&&(e.replace(""),!0)}querySingleReplySelector(e,t=document){if(e.startsWith("aria/"))return[];if(e.startsWith("xpath/")){const o=e.slice(6),i=document.evaluate(o,t,null,XPathResult.ANY_TYPE,null);let n=null;const s=[];for(;n=i.iterateNext();)s.push(n);return s}return e.startsWith("text/")||e.startsWith("pierce/")?[]:t.shadowRoot?Array.from(t.shadowRoot.querySelectorAll(e)):Array.from(t.querySelectorAll(e))}querySelectorChain(e){let t,o=document;for(const i of e){if(t=this.querySingleReplySelector(i,o),0===t.length)return[];o=t[0]}return t}elementSelector(e){return"string"==typeof e?this.querySingleReplySelector(e):this.querySelectorChain(e)}};function C(){return{chars:new Map,code:void 0}}var x=new Uint8Array(0),S=class{constructor(e,t=3e4){this.trie=function(e){const t=C();for(let o=0;o figure.wp-block-image:has(> img[class^="wp-image-"][src^="https://www.sinhasannews.com/"][width="','"]:not([style^="width: 1px; height: 1px; position: absolute; left: -10000px; top: -"])',"acs, document.createElement, %2Fl%5C.parentNode%5C.insertBefore%5C(s%2F","%2Fvisit%2F%22%5D%5Btitle%5E%3D%22https%3A%2F%2F%22%5D, %5Btitle%5D",", OptanonConsent, groups%3DC0001%253A1%252CC0002%253A0%252CC000","rmnt, script, %2Fh%3DdecodeURIComponent%7CpopundersPerIP%2F",'.project-description [href^="/linkout?remoteUrl="][href*="',':not([style^="position: absolute; left: -5000px"])',"href-sanitizer, a%5Bhref%5E%3D%22https%3A%2F%2F","ra, oncontextmenu%7Condragstart%7Conselectstart",", OptanonAlertBoxClosed, %24currentDate%24","acs, document.querySelectorAll, popMagic","acs, addEventListener, google_ad_client","aost, String.prototype.charCodeAt, ai_","aopr, app_vars.force_disable_adblock","acs, document.addEventListener, ","taboola-below-article-thumbnails","acs, document.getElementById, ","no-fetch-if, googlesyndication","aopr, document.dispatchEvent","no-xhr-if, googlesyndication",", document.createElement, ","acs, String.fromCharCode, ","%2522%253Afalse%252C%2522",", document.oncontextmenu","%2522%253Atrue%252C%2522","aeld, DOMContentLoaded, ","nosiif, visibility, 1000","set-local-storage-item, ","%2522%3Afalse%252C%2522","trusted-click-element, ","set, blurred, false","acs, eval, replace","decodeURIComponent",'[target="_blank"]',"%22%3Afalse%2C%22","^script:has-text(",'[href^="https://','[href^="http://','[href="https://','[src^="https://','[data-testid="',"modal-backdrop","rmnt, script, ","BlockDetected","trusted-set-",".prototype.","contextmenu","no-fetch-if","otification",":has-text(","background",'[class*="','[class^="',"body,html","container","Container","decodeURI","div[class",'div[id^="',"div[style","document.","no-xhr-if","placehold",'[href*="',"#wpsafe-","AAAAAAAA","Detector","disclaim","nano-sib","nextFunc","noopFunc","nostif, ","nowebrtc",'.com/"]',"300x250","article","consent","Consent","content","display","keydown","message","Message","overlay","privacy","sidebar","sponsor","wrapper","-child","[data-","accept","Accept","aopr, ","banner","bottom","cookie","Cookie","google","nosiif","notice","nowoif","policy","Policy","script","widget",":has(",":not(","block","Block","click","deskt","disab","fixed","frame","modal","popup","video",".com","2%3A","aeld","body","butt","foot","gdpr","html","icky","ight","show","tion","true"," > ","%3D","%7C","age","box","div","ent","out","rap","set","__",", ",'"]',"%2","%5",'="',"00","ac","ad","Ad","al","an","ar","at","e-","ed","en","er","he","id","in","la","le","lo","od","ol","om","on","op","or","re","s_","s-","se","st","t-","te","ti","un","_","-",";",":",".","(",")","[","]","*","/","#","^","0","1","2","3","4","5","6","7","8","9","b","B","c","C","d","D","e","E","f","F","g","G","h","H","I","j","J","k","l","L","m","M","n","N","O","p","P","q","Q","R","s","S","t","T","u","U","v","V","w","W","x","y","Y","z"],T=["sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-top-navigation","script-src 'self' 'unsafe-inline' 'unsafe-eval' "," *.google.com *.gstatic.com *.googleapis.com",".com *.google.com *.googletagmanager.com *.","script-src 'self' '*' 'unsafe-inline'","default-src 'unsafe-inline' 'self'","script-src 'self' 'unsafe-eval' "," *.google.com *.gstatic.com *.","t-src 'self' 'unsafe-inline' ","script-src * 'unsafe-inline'",".com *.googleapis.com *."," *.googletagmanager.com",".com *.bootstrapcdn.com","default-src 'self' *.","frame-src 'self' *"," *.cloudflare.com","child-src 'none';","worker-src 'none'","'unsafe-inline'"," data: blob:","*.googleapis","connect-src ","unsafe-eval'","child-src *"," *.gstatic","script-src","style-src ","frame-src","facebook","https://"," 'self'"," allow-",".com *.",".net *.","addthis","captcha","gstatic","youtube","defaul","disqus","google","https:","jquery","data:","http:","media","scrip","-src",".com",".net","n.cc"," *.","age","box","str","vic","yti"," '"," *","*.","al","am","an","as","cd","el","es","il","im","in","or","pi","st","ur","wi","wp"," ","-",";",":",".","'","*","/","3","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y"],O=["/homad-global-configs.schneevonmorgen.com/global_config","/videojs-vast-vpaid@2.0.2/bin/videojs_5.vast.vpaid.min","/etc.clientlibs/logitech-common/clientlibs/onetrust.","/pagead/managed/js/adsense/*/show_ads_impl","/pagead/managed/js/gpt/*/pubads_impl","/wrappermessagingwithoutdetection","/pagead/js/adsbygoogle.js","a-z]{8,15}\\.(?:com|net)\\/","/js/sdkloader/ima3.js","/js/sdkloader/ima3_d","/videojs-contrib-ads","/wp-content/plugins/","/wp-content/uploads/","/wp-content/themes/","/detroitchicago/","*/satellitelib-","/appmeasurement","/413gkwmt/init","/cdn-cgi/trace","/^https?:\\/\\/","[a-zA-Z0-9]{","/^https:\\/\\/","notification","\\/[a-z0-9]{","fingerprint","impression","[0-9a-z]{","/plugins/","affiliate","analytics","telemetry","(.+?\\.)?","/assets/","/images/","/pagead/","pageview","template","tracking","/public","300x250","ampaign","captcha","collect","consent","content","counter","default","metrics","privacy","[a-z]{","/embed","728x90","banner","bundle","client","cookie","detect","dn-cgi","google","iframe","module","prebid","script","source","widget",".aspx",".cgi?",".com/",".html","/api/","/beac","/img/","/java","/stat","0x600","block","click","count","event","manag","media","pixel","popup","tegra","theme","track","type=","video","visit",".css",".gif",".jpg",".min",".php",".png","/jqu","/js/","/lib","/log","/web","/wp-","468x","data","gdpr","gi-b","http","ight","mail","play","plug","publ","show","stat","uild","view",".js","/ad","=*&","age","com","ext","jax","key","log","new","sdk","tag","web","ync",":/","*/","*^","/_","/?","/*","/d","/f","/g","/h","/l","/n","/r","/u","/w","ac","ad","al","am","an","ap","ar","as","at","bo","ce","ch","co","de","e/","ec","ed","el","en","er","et","fi","g/","ic","id","im","in","is","it","js","la","le","li","lo","ma","mo","mp","ol","om","on","op","or","ot","re","ro","s_","s-","s?","s/","sp","ss","st","t/","ti","tm","tr","ub","un","ur","us","ut","ve","_","-",",","?",".","}","*","/","\\","&","^","=","0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],P=["securepubads.g.doubleclick",".actonservice.com","googlesyndication","imasdk.googleapis",".cloudfront.net","googletagmanag","-1.xx.fbcdn","analytics.","marketing.","tracking.","metrics.","images.",".co.uk","a8clk.","stats.","a8cv.","click","media","track",".com",".net",".xyz","www.",".io",".jp","a8.","app","cdn","new","web",".b",".c",".d",".f",".h",".k",".m",".n",".p",".s",".t","10","24","a-","a1","a2","a4","ab","ac","ad","af","ag","ah","ai","ak","al","am","an","ap","ar","as","at","au","av","aw","ax","ay","az","be","bi","bl","bo","br","bu","ca","ce","ch","ci","ck","cl","cr","ct","cu","de","di","dn","do","dr","ds","du","dy","e-","eb","ec","ed","ef","eg","el","em","en","ep","er","es","et","eu","ev","ew","ex","ey","fe","ff","fi","fo","fr","ft","ge","gh","gi","gn","go","gr","gu","he","ho","ib","ic","id","ie","if","ig","ik","il","im","in","ip","ir","is","it","iv","ix","iz","jo","ks","la","le","li","ll","lo","lu","ly","ma","me","mo","mp","my","no","ok","ol","om","on","oo","op","or","ot","ou","ph","pl","po","pr","pu","qu","re","ri","ro","ru","s-","sc","se","sh","si","sk","sn","so","sp","ss","st","su","sw","sy","t-","ta","te","th","ti","tn","to","tr","ts","tu","ty","ub","ud","ul","um","un","up","ur","us","ut","ve","vi","vo","wa","we","wh","wn","-",".","0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],R=["google-analytics.com/analytics.js","googlesyndication_adsbygoogle.js","googletagmanager.com/gtm.js","googletagservices_gpt.js","googletagmanager_gtm.js","fuckadblock.js-3.2.0","amazon_apstag.js","google-analytics","fingerprint2.js","noop-1s.mp4:10","google-ima.js","noop-0.1s.mp3","prebid-ads.js","nobab2.js:10","noopmp3-0.1s","noop-1s.mp4","hd-main.js","noopmp4-1s","32x32.png","noop.html","noopframe","noop.txt","nooptext","1x1.gif","2x2.png","noop.js","noopjs",".com/",".js:5","noop",":10",".js","ads","bea","_a",":5",".0","ar","ch","ic","in","le","ma","on","re","st","_","-",":",".","/","0","1","2","3","4","5","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","r","s","t","u","v","w","x","y","z"],z=[",redirect=google-ima","/js/sdkloader/ima3.j","/wp-content/plugins/",",redirect-rule=noop",".actonservice.com^",".com^$third-party","googlesyndication","imasdk.googleapis",".cloudfront.net^",",redirect-rule=","$script,domain=",",3p,denyallow=",",redirect=noop","xmlhttprequest","^$third-party","||smetrics.","third-party","marketing.","$document","analytics",",domain=","/assets/","metrics.","subdocum","tracking","$script",".co.uk","$ghide","a8clk.","cookie","google","script",".com^",".xyz^","$doma","a8cv.","click","image","media","track",".com",".fr^",".gif",".jp^",".net","/js/","$doc","$xhr","stat","www.",",1p",",3p",".io",".jp",".js","app","cdn","ent","new","web",".b",".c",".d",".f",".h",".m",".n",".p",".s",".t","@@","/*","/p","||","ab","ac","ad","af","ag","ai","ak","al","am","an","ap","ar","as","at","au","av","aw","ax","ay","az","be","bi","bo","br","ca","ce","ch","ck","cl","ct","cu","de","di","do","e-","e^","ec","ed","el","em","en","ep","er","es","et","ev","ew","ex","fe","ff","fi","fo","fr","g^","ge","gi","go","gr","he","hi","ho","hp","ht","ic","id","ig","il","im","in","ip","ir","is","it","ix","js","ke","le","li","lo","lu","ly","me","mo","mp","ne","no","od","ok","ol","om","on","op","or","ot","ow","pl","po","pr","qu","re","ri","ro","ru","s-","s/","sc","se","sh","si","so","sp","ss","st","su","te","th","ti","to","tr","ts","ty","ub","ud","ul","um","un","up","ur","us","ut","ve","vi","_","-",",","?",".","*","/","^","=","|","~","$","0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],L=["-webkit-touch-callo",", 1year, , domain, ",", googlesyndication",", SOCS, CAISNQgQEit",":style(overflow: au","##^script:has-text(","9udGVuZHVpc2VydmVyX","GgJmaSADGgYIgOu0sgY","ib3FfaWRlbnRpdHlmcm","position: initial !","set-local-storage-i","set, blurred, false","user-select: text !","zIwMjQwNTE0LjA2X3Aw",'[href^="https://',"rmnt, script, ","ut: default !"," !important)","trusted-set-",", document.",", noopFunc)","##body,html","contextmenu","no-fetch-if","otification",".com##+js(",'="https://',"background","important;"," -webkit-",".*,xhamst","container","AAAAAAAA","nostif, ",",google",":style(","consent","message","nowoif)","privacy","-wrapp",",kayak",".co.uk","[class","##+js(","accept","aopr, ","banner","bottom","cookie","Cookie","google","notice","policy","widget",":has(","##div","block","cript","true)",".co.",".com",".de,",".fr,",".net",".nl,",".pl,",".xyz","#@#.","2%3A","gdpr","html","ight","news","text","to !","wrap","www."," > ",",xh","##.","###","%3D","%7C","ent","lay","web","__","-s",", ",",b",",c",",f",",g",",h",",m",",p",",s",",t",": ",".*",".b",".c",".m",".p",".s",'"]',"##","%2","%5",'="',"00","a-","ab","ac","ad","Ad","af","ag","ak","al","am","an","ap","ar","as","at","au","av","ay","az","bo","ch","ck","cl","ct","de","di","do","e-","ed","el","em","en","er","es","et","ex","fi","fo","he","ic","id","if","ig","il","im","in","is","it","iv","le","lo","mo","ol","om","on","op","or","ot","ov","pl","po","re","ro","s_","s-","se","sh","si","sp","st","t-","th","ti","tr","tv","ub","ul","um","un","up","ur","us","ut","vi"," ","_","-",",",":",".","(",")","[","*","/","^","0","1","2","3","4","5","6","7","8","9","a","b","B","c","C","d","D","e","E","f","F","g","h","i","j","k","l","L","m","M","n","o","p","P","q","r","s","S","t","T","u","v","w","x","y","z"],B=class{constructor(){this.cosmeticSelector=new I(F),this.networkCSP=new I(T),this.networkRedirect=new I(R),this.networkHostname=new I(P),this.networkFilter=new I(O),this.networkRaw=new I(z),this.cosmeticRaw=new I(L)}},U=(()=>{let e=0;const t=new Int32Array(256);for(let o=0;256!==o;o+=1)e=o,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,t[o]=e;return t})();var N=2147483647,V=36,j=1,M=26,D=38,H=700,W=72,q=128,G="-",$=/[^\0-\x7E]/,K=/[\x2E\u3002\uFF0E\uFF61]/g,Q={"invalid-input":"Invalid input","not-basic":"Illegal input >= 0x80 (not a basic code point)",overflow:"Overflow: input needs wider integers to process"},Y=V-j;function X(e){throw new RangeError(Q[e])}function Z(e,t){return e+22+75*(e<26?1:0)-((0!==t?1:0)<<5)}function J(e,t,o){let i=0;for(e=o?Math.floor(e/H):e>>1,e+=Math.floor(e/t);e>Y*M>>1;i+=V)e=Math.floor(e/Y);return Math.floor(i+(Y+1)*e/(e+D))}function ee(e){const t=[],o=e.length;let i=0,n=q,s=W,c=e.lastIndexOf(G);c<0&&(c=0);for(let o=0;o=128&&X("not-basic"),t.push(e.charCodeAt(o));for(let a=c>0?c+1:0;a=o&&X("invalid-input");const c=(r=e.charCodeAt(a++))-48<10?r-22:r-65<26?r-65:r-97<26?r-97:V;(c>=V||c>Math.floor((N-i)/t))&&X("overflow"),i+=c*t;const l=n<=s?j:n>=s+M?M:n-s;if(cMath.floor(N/p)&&X("overflow"),t*=p}const l=t.length+1;s=J(i-c,l,0===c),Math.floor(i/l)>N-n&&X("overflow"),n+=Math.floor(i/l),i%=l,t.splice(i++,0,n)}var r;return String.fromCodePoint.apply(null,t)}function te(e){const t=[],o=function(e){const t=[];let o=0;const i=e.length;for(;o=55296&&n<=56319&&o=n&&iMath.floor((N-s)/i)&&X("overflow"),s+=(e-n)*i,n=e;for(let e=0;eN&&X("overflow"),l===n){let e=s;for(let o=V;;o+=V){const i=o<=c?j:o>=c+M?M:o-c;if(e{const e=new B;return ce=()=>e,e};function re(e){return e<=127?1:5}function ae(e,t){return le(e.length,t)}function le(e,t){return(t?3:0)+e+re(e)}function pe(e){return e.length+re(e.length)}function de(e){const t=te(e).length;return t+re(t)}function ue(e){return e.byteLength+re(e.length)}var he,me=class e{static empty(t){return e.fromUint8Array(ie,t)}static fromUint8Array(t,o){return new e(t,o)}static allocate(t,o){return new e(new Uint8Array(t),o)}constructor(e,{enableCompression:t}){if(!1===se)throw new Error("Adblocker currently does not support Big-endian systems");!0===t&&this.enableCompression(),this.buffer=e,this.pos=0}enableCompression(){this.compression=ce()}checksum(){return function(e,t,o){let i=-1;const n=o-7;let s=t;for(;s>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])],i=i>>>8^U[255&(i^e[s++])];for(;s>>8^U[255&(i^e[s++])];return(-1^i)>>>0}(this.buffer,0,this.pos)}dataAvailable(){return this.pos>>8,this.buffer[this.pos++]=e}getUint16(){return(this.buffer[this.pos++]<<8|this.buffer[this.pos++])>>>0}pushUint32(e){this.buffer[this.pos++]=e>>>24,this.buffer[this.pos++]=e>>>16,this.buffer[this.pos++]=e>>>8,this.buffer[this.pos++]=e}getUint32(){return(this.buffer[this.pos++]<<24>>>0)+(this.buffer[this.pos++]<<16|this.buffer[this.pos++]<<8|this.buffer[this.pos++])>>>0}pushUint32Array(e){this.pushLength(e.length);for(const t of e)this.pushUint32(t)}getUint32Array(){const e=this.getLength(),t=new Uint32Array(e);for(let o=0;othis.buffer.byteLength)throw new Error(`StaticDataView too small: ${this.buffer.byteLength}, but required ${this.pos} bytes`)}pushLength(e){e<=127?this.pushUint8(e):(this.pushUint8(128),this.pushUint32(e))}getLength(){const e=this.getUint8();return 128===e?this.getUint32():e}},Ae=class e{static deserialize(t){return new e({debug:t.getBool(),enableCompression:t.getBool(),enableHtmlFiltering:t.getBool(),enableInMemoryCache:t.getBool(),enableMutationObserver:t.getBool(),enableOptimizations:t.getBool(),enablePushInjectionsOnNavigationEvents:t.getBool(),guessRequestTypeFromUrl:t.getBool(),integrityCheck:t.getBool(),loadCSPFilters:t.getBool(),loadCosmeticFilters:t.getBool(),loadExceptionFilters:t.getBool(),loadExtendedSelectors:t.getBool(),loadGenericCosmeticsFilters:t.getBool(),loadNetworkFilters:t.getBool(),loadPreprocessors:t.getBool()})}constructor({debug:e=!1,enableCompression:t=!1,enableHtmlFiltering:o=!1,enableInMemoryCache:i=!0,enableMutationObserver:n=!0,enableOptimizations:s=!0,enablePushInjectionsOnNavigationEvents:c=!0,guessRequestTypeFromUrl:r=!1,integrityCheck:a=!0,loadCSPFilters:l=!0,loadCosmeticFilters:p=!0,loadExceptionFilters:d=!0,loadExtendedSelectors:u=!1,loadGenericCosmeticsFilters:h=!0,loadNetworkFilters:m=!0,loadPreprocessors:A=!1}={}){this.debug=e,this.enableCompression=t,this.enableHtmlFiltering=o,this.enableInMemoryCache=i,this.enableMutationObserver=n,this.enableOptimizations=s,this.enablePushInjectionsOnNavigationEvents=c,this.guessRequestTypeFromUrl=r,this.integrityCheck=a,this.loadCSPFilters=l,this.loadCosmeticFilters=p,this.loadExceptionFilters=d,this.loadExtendedSelectors=u,this.loadGenericCosmeticsFilters=h,this.loadNetworkFilters=m,this.loadPreprocessors=A}getSerializedSize(){return 16}serialize(e){e.pushBool(this.debug),e.pushBool(this.enableCompression),e.pushBool(this.enableHtmlFiltering),e.pushBool(this.enableInMemoryCache),e.pushBool(this.enableMutationObserver),e.pushBool(this.enableOptimizations),e.pushBool(this.enablePushInjectionsOnNavigationEvents),e.pushBool(this.guessRequestTypeFromUrl),e.pushBool(this.integrityCheck),e.pushBool(this.loadCSPFilters),e.pushBool(this.loadCosmeticFilters),e.pushBool(this.loadExceptionFilters),e.pushBool(this.loadExtendedSelectors),e.pushBool(this.loadGenericCosmeticsFilters),e.pushBool(this.loadNetworkFilters),e.pushBool(this.loadPreprocessors)}},ge="undefined"!=typeof window&&"function"==typeof window.queueMicrotask?e=>window.queueMicrotask(e):e=>(he||(he=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)));function fe(e,t,o){let i=o.get(e);void 0===i&&(i=[],o.set(e,i)),i.push(t)}function ke(e,t,o){const i=o.get(e);if(void 0!==i){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}function be(e,t,o){if(0===o.size)return!1;const i=o.get(e);return void 0!==i&&(ge((()=>{for(const e of i)e(...t)})),!0)}var ye=class{constructor(){this.onceListeners=new Map,this.onListeners=new Map}on(e,t){fe(e,t,this.onListeners)}once(e,t){fe(e,t,this.onceListeners)}unsubscribe(e,t){ke(e,t,this.onListeners),ke(e,t,this.onceListeners)}emit(e,...t){be(e,t,this.onListeners),!0===be(e,t,this.onceListeners)&&this.onceListeners.delete(e)}};function we(e,t){return function(e,t){let o=3;const i=()=>e(t).catch((e=>{if(o>0)return o-=1,new Promise(((e,t)=>{setTimeout((()=>{i().then(e).catch(t)}),500)}));throw e}));return i()}(e,t).then((e=>e.text()))}var ve="https://raw.githubusercontent.com/ghostery/adblocker/master/packages/adblocker/assets",_e=[`${ve}/easylist/easylist.txt`,`${ve}/peter-lowe/serverlist.txt`,`${ve}/ublock-origin/badware.txt`,`${ve}/ublock-origin/filters-2020.txt`,`${ve}/ublock-origin/filters-2021.txt`,`${ve}/ublock-origin/filters-2022.txt`,`${ve}/ublock-origin/filters-2023.txt`,`${ve}/ublock-origin/filters-2024.txt`,`${ve}/ublock-origin/filters.txt`,`${ve}/ublock-origin/quick-fixes.txt`,`${ve}/ublock-origin/resource-abuse.txt`,`${ve}/ublock-origin/unbreak.txt`],Ce=[..._e,`${ve}/easylist/easyprivacy.txt`,`${ve}/ublock-origin/privacy.txt`],xe=[...Ce,`${ve}/easylist/easylist-cookie.txt`,`${ve}/ublock-origin/annoyances-others.txt`,`${ve}/ublock-origin/annoyances-cookies.txt`];var Se=new Set(["any","dir","has","host-context","if","if-not","is","matches","not","where"]),Ee={attribute:/\[\s*(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)\s*(?:(?\W?=)\s*(?.+?)\s*(?[iIsS])?\s*)?\]/gu,id:/#(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu,class:/\.(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu,comma:/\s*,\s*/g,combinator:/\s*[\s>+~]\s*/g,"pseudo-element":/::(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?:¶*)\))?/gu,"pseudo-class":/:(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?¶*)\))?/gu,type:/(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)|\*/gu},Ie=new Set(["pseudo-class","pseudo-element"]),Fe=new Set([...Ie,"attribute"]),Te=new Set(["combinator","comma"]),Oe=Object.assign({},Ee);function Pe(e,t){e.lastIndex=0;const o=e.exec(t);if(null===o)return;const i=o.index-1,n=o[0],s=t.slice(0,i+1),c=t.slice(i+n.length+1);return[s,[n,o.groups||{}],c]}Oe["pseudo-element"]=RegExp(Ee["pseudo-element"].source.replace("(?¶*)","(?.*?)"),"gu"),Oe["pseudo-class"]=RegExp(Ee["pseudo-class"].source.replace("(?¶*)","(?.*)"),"gu");var Re=[e=>{const t=Pe(Ee.attribute,e);if(void 0===t)return;const[o,[i,{name:n,operator:s,value:c,namespace:r,caseSensitive:a}],l]=t;return void 0!==n?[o,{type:"attribute",content:i,length:i.length,namespace:r,caseSensitive:a,pos:[],name:n,operator:s,value:c},l]:void 0},e=>{const t=Pe(Ee.id,e);if(void 0===t)return;const[o,[i,{name:n}],s]=t;return void 0!==n?[o,{type:"id",content:i,length:i.length,pos:[],name:n},s]:void 0},e=>{const t=Pe(Ee.class,e);if(void 0===t)return;const[o,[i,{name:n}],s]=t;return void 0!==n?[o,{type:"class",content:i,length:i.length,pos:[],name:n},s]:void 0},e=>{const t=Pe(Ee.comma,e);if(void 0===t)return;const[o,[i],n]=t;return[o,{type:"comma",content:i,length:i.length,pos:[]},n]},e=>{const t=Pe(Ee.combinator,e);if(void 0===t)return;const[o,[i],n]=t;return[o,{type:"combinator",content:i,length:i.length,pos:[]},n]},e=>{const t=Pe(Ee["pseudo-element"],e);if(void 0===t)return;const[o,[i,{name:n}],s]=t;return void 0!==n?[o,{type:"pseudo-element",content:i,length:i.length,pos:[],name:n},s]:void 0},e=>{const t=Pe(Ee["pseudo-class"],e);if(void 0===t)return;const[o,[i,{name:n,argument:s}],c]=t;return void 0!==n?[o,{type:"pseudo-class",content:i,length:i.length,pos:[],name:n,argument:s,subtree:void 0},c]:void 0},e=>{const t=Pe(Ee.type,e);if(void 0===t)return;const[o,[i,{name:n,namespace:s}],c]=t;return[o,{type:"type",content:i,length:i.length,namespace:s,pos:[],name:n},c]}];function ze(e,t,o,i){for(const n of t)for(const t of e)if(i.has(t.type)&&t.pos[0]=0&&"\\"===e[t];)o+=1,t-=1;return o%2!=0}function Be(e,t,o){let i=o+1;for(;-1!==(i=e.indexOf(t,i))&&!0===Le(e,i);)i+=1;if(-1!==i)return e.slice(o,i+1)}function Ue(e,t){let o=0;for(let i=t;i0))return;o-=1}if(0===o)return e.slice(t,i+1)}}function Ne(e,t,o,i){const n=[];let s=0;for(;-1!==(s=e.indexOf(o,s));){const o=i(e,s);if(void 0===o)break;n.push({str:o,start:s}),e=`${e.slice(0,s+1)}${t.repeat(o.length-2)}${e.slice(s+o.length-1)}`,s+=o.length}return[n,e]}function Ve(e){if("string"!=typeof e)return[];if(0===(e=e.trim()).length)return[];const[t,o]=Ne(e,"§",'"',((e,t)=>Be(e,'"',t))),[i,n]=Ne(o,"§","'",((e,t)=>Be(e,"'",t))),[s,c]=Ne(n,"¶","(",Ue),r=function(e){if(!e)return[];const t=[e];for(const e of Re)for(let o=0;o0!==e.length)))}}let o=0;for(const e of t)"string"!=typeof e&&(e.pos=[o,o+e.length],Te.has(e.type)&&(e.content=e.content.trim()||" ")),o+=e.length;return t.every((e=>"string"!=typeof e))?t:[]}(c);return ze(r,s,/\(¶*\)/,Ie),ze(r,t,/"§*"/,Fe),ze(r,i,/'§*'/,Fe),r}function je(e,{list:t=!0}={}){if(!0===t&&e.some((e=>"comma"===e.type))){const t=[],o=[];for(let i=0;i=0;t--){const o=e[t];if("combinator"===o.type){const i=je(e.slice(0,t)),n=je(e.slice(t+1));if(void 0===n)return;if(" "!==o.content&&"~"!==o.content&&"+"!==o.content&&">"!==o.content)return;return{type:"complex",combinator:o.content,left:i,right:n}}}if(0!==e.length)return function(e){return e.every((e=>"comma"!==e.type&&"combinator"!==e.type))}(e)?1===e.length?e[0]:{type:"compound",compound:[...e]}:void 0}function Me(e,t,o,i){if(void 0!==e){if("complex"===e.type)Me(e.left,t,o,e),Me(e.right,t,o,e);else if("compound"===e.type)for(const i of e.compound)Me(i,t,o,e);else"pseudo-class"===e.type&&void 0!==e.subtree&&void 0!==o&&"pseudo-class"===o.type&&void 0!==o.subtree&&Me(e.subtree,t,o,e);t(e,i)}}function De(e,{recursive:t=!0,list:o=!0}={}){const i=Ve(e);if(0===i.length)return;const n=je(i,{list:o});return!0===t&&Me(n,(e=>{"pseudo-class"===e.type&&e.argument&&void 0!==e.name&&Se.has(e.name)&&(e.subtree=De(e.argument,{recursive:!0,list:!0}))})),n}var He,We,qe=new Set(["has","has-text","if"]),Ge=new Set(["active","any","any-link","blank","checked","default","defined","dir","disabled","empty","enabled","first","first-child","first-of-type","focus","focus-visible","focus-within","fullscreen","host","host-context","hover","in-range","indeterminate","invalid","is","lang","last-child","last-of-type","left","link","matches","not","nth-child","nth-last-child","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","placeholder-shown","read-only","read-write","required","right","root","scope","target","valid","visited","where"]),$e=new Set(["after","before","first-letter","first-line"]);function Ke(e){if(-1===e.indexOf(":"))return He.Normal;const t=Ve(e);let o=!1;for(const e of t)if("pseudo-class"===e.type){const{name:t}=e;if(!0===qe.has(t))o=!0;else if(!1===Ge.has(t)&&!1===$e.has(t))return He.Invalid;if(!1===o&&void 0!==e.argument&&!0===Se.has(t)){const t=Ke(e.argument);if(t===He.Invalid)return t;t===He.Extended&&(o=!0)}}return!0===o?He.Extended:He.Normal}(We=He||(He={}))[We.Normal=0]="Normal",We[We.Extended=1]="Extended",We[We.Invalid=2]="Invalid";var Qe=new Set(["htm","html","xhtml"]),Ye=new Set(["eot","otf","sfnt","ttf","woff","woff2"]),Xe=new Set(["apng","bmp","cur","dib","eps","gif","heic","heif","ico","j2k","jfi","jfif","jif","jp2","jpe","jpeg","jpf","jpg","jpm","jpx","mj2","pjp","pjpeg","png","svg","svgz","tif","tiff","webp"]),Ze=new Set(["avi","flv","mp3","mp4","ogg","wav","weba","webm","wmv"]),Je=new Set(["js","ts","jsx","esm"]),et=new Set(["css","scss"]);function tt(e,t){let o=0,i=e.length,n=!1;if(!t){if(e.startsWith("data:"))return null;for(;oo+1&&e.charCodeAt(i-1)<=32;)i-=1;if(47===e.charCodeAt(o)&&47===e.charCodeAt(o+1))o+=2;else{const t=e.indexOf(":/",o);if(-1!==t){const i=t-o,n=e.charCodeAt(o),s=e.charCodeAt(o+1),c=e.charCodeAt(o+2),r=e.charCodeAt(o+3),a=e.charCodeAt(o+4);if(5===i&&104===n&&116===s&&116===c&&112===r&&115===a);else if(4===i&&104===n&&116===s&&116===c&&112===r);else if(3===i&&119===n&&115===s&&115===c);else if(2===i&&119===n&&115===s);else for(let i=o;i=97&&t<=122||t>=48&&t<=57||46===t||45===t||43===t))return null}for(o=t+2;47===e.charCodeAt(o);)o+=1}}let t=-1,s=-1,c=-1;for(let r=o;r=65&&o<=90&&(n=!0)}if(-1!==t&&t>o&&to&&co+1&&46===e.charCodeAt(i-1);)i-=1;const s=0!==o||i!==e.length?e.slice(o,i):e;return n?s.toLowerCase():s}function ot(e){return e>=97&&e<=122||e>=48&&e<=57||e>127}function it(e){if(e.length>255)return!1;if(0===e.length)return!1;if(!ot(e.charCodeAt(0))&&46!==e.charCodeAt(0)&&95!==e.charCodeAt(0))return!1;let t=-1,o=-1;const i=e.length;for(let n=0;n64||46===o||45===o||95===o)return!1;t=n}else if(!ot(i)&&45!==i&&95!==i)return!1;o=i}return i-t-1<=63&&45!==o}var nt=function({allowIcannDomains:e=!0,allowPrivateDomains:t=!1,detectIp:o=!0,extractHostname:i=!0,mixedInputs:n=!0,validHosts:s=null,validateHostname:c=!0}){return{allowIcannDomains:e,allowPrivateDomains:t,detectIp:o,extractHostname:i,mixedInputs:n,validHosts:s,validateHostname:c}}({});function st(e,t,o,i,n){const s=function(e){return void 0===e?nt:function({allowIcannDomains:e=!0,allowPrivateDomains:t=!1,detectIp:o=!0,extractHostname:i=!0,mixedInputs:n=!0,validHosts:s=null,validateHostname:c=!0}){return{allowIcannDomains:e,allowPrivateDomains:t,detectIp:o,extractHostname:i,mixedInputs:n,validHosts:s,validateHostname:c}}(e)}(i);return"string"!=typeof e?n:(s.extractHostname?s.mixedInputs?n.hostname=tt(e,it(e)):n.hostname=tt(e,!1):n.hostname=e,0===t||null===n.hostname||s.detectIp&&(n.isIp=function(e){if(e.length<3)return!1;let t=e.startsWith("[")?1:0,o=e.length;if("]"===e[o-1]&&(o-=1),o-t>39)return!1;let i=!1;for(;t=48&&o<=57||o>=97&&o<=102||o>=65&&o<=90))return!1}return i}(c=n.hostname)||function(e){if(e.length<7)return!1;if(e.length>15)return!1;let t=0;for(let o=0;o57)return!1}return 3===t&&46!==e.charCodeAt(0)&&46!==e.charCodeAt(e.length-1)}(c),n.isIp)?n:s.validateHostname&&s.extractHostname&&!it(n.hostname)?(n.hostname=null,n):(o(n.hostname,s,n),2===t||null===n.publicSuffix?n:(n.domain=function(e,t,o){if(null!==o.validHosts){const e=o.validHosts;for(const o of e)if(function(e,t){return!!e.endsWith(t)&&(e.length===t.length||"."===e[e.length-t.length-1])}(t,o))return o}let i=0;if(t.startsWith("."))for(;i=i)return!1;let n=o,s=i-1;for(;n<=s;){const o=n+s>>>1,i=e[o];if(it))return!0;s=o-1}}return!1}var at=new Uint32Array(20);function lt(e,t,o){if(function(e,t,o){if(!t.allowPrivateDomains&&e.length>3){const t=e.length-1,i=e.charCodeAt(t),n=e.charCodeAt(t-1),s=e.charCodeAt(t-2),c=e.charCodeAt(t-3);if(109===i&&111===n&&99===s&&46===c)return o.isIcann=!0,o.isPrivate=!1,o.publicSuffix="com",!0;if(103===i&&114===n&&111===s&&46===c)return o.isIcann=!0,o.isPrivate=!1,o.publicSuffix="org",!0;if(117===i&&100===n&&101===s&&46===c)return o.isIcann=!0,o.isPrivate=!1,o.publicSuffix="edu",!0;if(118===i&&111===n&&103===s&&46===c)return o.isIcann=!0,o.isPrivate=!1,o.publicSuffix="gov",!0;if(116===i&&101===n&&110===s&&46===c)return o.isIcann=!0,o.isPrivate=!1,o.publicSuffix="net",!0;if(101===i&&100===n&&46===s)return o.isIcann=!0,o.isPrivate=!1,o.publicSuffix="de",!0}return!1}(e,t,o))return;const{allowIcannDomains:i,allowPrivateDomains:n}=t;let s=-1,c=0,r=0,a=1;const l=function(e,t){let o=5381,i=0;for(let n=e.length-1;n>=0;n-=1){const s=e.charCodeAt(n);if(46===s&&(at[i<<1]=o>>>0,at[1+(i<<1)]=n+1,i+=1,i===t))return i;o=33*o^s}return at[i<<1]=o>>>0,at[1+(i<<1)]=0,i+=1,i}(e,ct[0]);for(let e=0;er;)t.shift();o.publicSuffix=t.join(".")}else o.publicSuffix=e.slice(at[1+(r-2<<1)]);else o.publicSuffix=1===l?e:e.slice(at[1])}function pt(e,t={}){return st(e,5,lt,t,{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,publicSuffix:null,subdomain:null})}var dt=new class{constructor(e){this.pos=0,this.buffer=new Uint32Array(e)}reset(){this.pos=0}slice(){return this.buffer.slice(0,this.pos)}push(e){this.buffer[this.pos++]=e}empty(){return 0===this.pos}full(){return this.pos===this.buffer.length}remaining(){return this.buffer.length-this.pos}}(1024),ut=37,ht=5011;function mt(e){return 16843009*((e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135)>>24}function At(e,t){return!!(e&t)}function gt(e,t){return e|t}function ft(e,t){return e&~t}function kt(e,t,o){let i=ht;for(let n=t;n>>0}function bt(e){return"string"!=typeof e||0===e.length?ht:kt(e,0,e.length)}function yt(e){const t=new Uint32Array(e.length);let o=0;for(const i of e)t[o++]=bt(i);return t}function wt(e,t){if(e.length=48&&e<=57}function Ct(e){return e>=97&&e<=122||e>=65&&e<=90}function xt(e){return Ct(e)||_t(e)||37===e||function(e){return e>=192&&e<=450}(e)||function(e){return e>=1024&&e<=1279}(e)}function St(e,t,o,i){const n=Math.min(e.length,2*i.remaining());let s=!1,c=0,r=ht;for(let o=0;o1&&(!1===t||0!==c)&&i.push(r>>>0))}!0===s&&!1===o&&e.length-c>1&&!1===i.full()&&i.push(r>>>0)}function Et(e,t){const o=Math.min(e.length,2*t.remaining());let i=!1,n=0,s=ht;for(let c=0;c1&&t.push(s>>>0))}!0===i&&e.length-n>1&&!1===t.full()&&t.push(s>>>0)}function It(e,t){return-1!==function(e,t){if(0===e.length)return-1;let o=0,i=e.length-1;for(;o<=i;){const n=o+i>>>1,s=e[n];if(st))return n;i=n-1}}return-1}(e,t)}var Ft=/[^\u0000-\u00ff]/;function Tt(e){return Ft.test(e)}var Ot={extractHostname:!0,mixedInputs:!1,validateHostname:!1},Pt={beacon:bt("type:beacon"),cspReport:bt("type:csp"),csp_report:bt("type:csp"),cspviolationreport:bt("type:cspviolationreport"),document:bt("type:document"),eventsource:bt("type:other"),fetch:bt("type:xhr"),font:bt("type:font"),image:bt("type:image"),imageset:bt("type:image"),mainFrame:bt("type:document"),main_frame:bt("type:document"),manifest:bt("type:other"),media:bt("type:media"),object:bt("type:object"),object_subrequest:bt("type:object"),other:bt("type:other"),ping:bt("type:ping"),prefetch:bt("type:other"),preflight:bt("type:preflight"),script:bt("type:script"),signedexchange:bt("type:signedexchange"),speculative:bt("type:other"),stylesheet:bt("type:stylesheet"),subFrame:bt("type:subdocument"),sub_frame:bt("type:subdocument"),texttrack:bt("type:other"),webSocket:bt("type:websocket"),web_manifest:bt("type:other"),websocket:bt("type:websocket"),xhr:bt("type:xhr"),xml_dtd:bt("type:other"),xmlhttprequest:bt("type:xhr"),xslt:bt("type:other")};function Rt(e){let t=ht;for(let o=e.length-1;o>=0;o-=1)t=t*ut^e.charCodeAt(o);return t>>>0}function zt(e,t,o){dt.reset();let i=ht;for(let n=t-1;n>=0;n-=1){const t=e.charCodeAt(n);46===t&&n>>0),i=i*ut^t}return dt.push(i>>>0),dt.slice()}function Lt(e,t){const o=function(e,t){let o=null;const i=t.indexOf(".");if(-1!==i){const n=t.slice(i+1);o=e.slice(0,-n.length-1)}return o}(e,t);return null!==o?zt(o,o.length,o.length):ne}function Bt(e,t){return zt(e,e.length,e.length-t.length)}var Ut=class e{static fromRawDetails({requestId:t="0",tabId:o=0,url:i="",hostname:n,domain:s,sourceUrl:c="",sourceHostname:r,sourceDomain:a,type:l="main_frame",_originalRequestDetails:p}){if(i=i.toLowerCase(),void 0===n||void 0===s){const e=pt(i,Ot);n=n||e.hostname||"",s=s||e.domain||""}if(void 0===r||void 0===a){const e=pt(r||a||c,Ot);r=r||e.hostname||"",a=a||e.domain||r||""}return new e({requestId:t,tabId:o,domain:s,hostname:n,url:i,sourceDomain:a,sourceHostname:r,sourceUrl:c,type:l,_originalRequestDetails:p})}constructor({requestId:e,tabId:t,type:o,domain:i,hostname:n,url:s,sourceDomain:c,sourceHostname:r,_originalRequestDetails:a}){if(this.tokens=void 0,this.hostnameHashes=void 0,this.entityHashes=void 0,this._originalRequestDetails=a,this.id=e,this.tabId=t,this.type=o,this.url=s,this.hostname=n,this.domain=i,this.sourceHostnameHashes=0===r.length?ne:Bt(r,c),this.sourceEntityHashes=0===r.length?ne:Lt(r,c),this.isThirdParty=function(e,t,o,i,n){return"main_frame"!==n&&"mainFrame"!==n&&(0!==t.length&&0!==i.length?t!==i:0!==t.length&&0!==o.length?t!==o:0!==i.length&&0!==e.length&&e!==i)}(n,i,r,c,o),this.isFirstParty=!this.isThirdParty,this.isSupported=!0,"websocket"===this.type||this.url.startsWith("ws:")||this.url.startsWith("wss:"))this.isHttp=!1,this.isHttps=!1,this.type="websocket",this.isSupported=!0;else if(this.url.startsWith("http:"))this.isHttp=!0,this.isHttps=!1;else if(this.url.startsWith("https:"))this.isHttps=!0,this.isHttp=!1;else if(this.url.startsWith("data:")){this.isHttp=!1,this.isHttps=!1;const e=this.url.indexOf(",");-1!==e&&(this.url=this.url.slice(0,e))}else this.isHttp=!1,this.isHttps=!1,this.isSupported=!1}getHostnameHashes(){return void 0===this.hostnameHashes&&(this.hostnameHashes=0===this.hostname.length?ne:Bt(this.hostname,this.domain)),this.hostnameHashes}getEntityHashes(){return void 0===this.entityHashes&&(this.entityHashes=0===this.hostname.length?ne:Lt(this.hostname,this.domain)),this.entityHashes}getTokens(){if(void 0===this.tokens){dt.reset();for(const e of this.sourceHostnameHashes)dt.push(e);dt.push(Pt[this.type]),Et(this.url,dt),this.tokens=dt.slice()}return this.tokens}isMainFrame(){return"main_frame"===this.type||"mainFrame"===this.type}isSubFrame(){return"sub_frame"===this.type||"subFrame"===this.type}guessTypeOfRequest(){const e=this.type;return this.type=function(e){const t=function(e){let t=e.length;const o=e.indexOf("#");-1!==o&&(t=o);const i=e.indexOf("?");-1!==i&&i=0&&(s=e.charCodeAt(n),0!=(s>=65&&s<=90||s>=97&&s<=122||s>=48&&s<=57));n-=1);return 46!==s||n<0||t-n>=10?"":e.slice(n+1,t)}(e);return Xe.has(t)||e.startsWith("data:image/")||e.startsWith("https://frog.wix.com/bt")?"image":Ze.has(t)||e.startsWith("data:audio/")||e.startsWith("data:video/")?"media":et.has(t)||e.startsWith("data:text/css")?"stylesheet":Je.has(t)||e.startsWith("data:")&&(e.startsWith("data:application/ecmascript")||e.startsWith("data:application/javascript")||e.startsWith("data:application/x-ecmascript")||e.startsWith("data:application/x-javascript")||e.startsWith("data:text/ecmascript")||e.startsWith("data:text/javascript")||e.startsWith("data:text/javascript1.0")||e.startsWith("data:text/javascript1.1")||e.startsWith("data:text/javascript1.2")||e.startsWith("data:text/javascript1.3")||e.startsWith("data:text/javascript1.4")||e.startsWith("data:text/javascript1.5")||e.startsWith("data:text/jscript")||e.startsWith("data:text/livescript")||e.startsWith("data:text/x-ecmascript")||e.startsWith("data:text/x-javascript"))||e.startsWith("https://maps.googleapis.com/maps/api/js")||e.startsWith("https://www.googletagmanager.com/gtag/js")?"script":Qe.has(t)||e.startsWith("data:text/html")||e.startsWith("data:application/xhtml")||e.startsWith("https://www.youtube.com/embed/")||e.startsWith("https://www.google.com/gen_204")?"document":Ye.has(t)||e.startsWith("data:font/")?"font":"other"}(this.url),e!==this.type&&(this.tokens=void 0),this.type}},Nt=class e{static parse(t,o=!1){if(0===t.length)return;const i=[],n=[],s=[],c=[];for(let e of t){Tt(e)&&(e=oe(e));const t=126===e.charCodeAt(0),o=42===e.charCodeAt(e.length-1)&&46===e.charCodeAt(e.length-2),r=t?1:0,a=o?e.length-2:e.length,l=Rt(!0===t||!0===o?e.slice(r,a):e);t?o?n.push(l):c.push(l):o?i.push(l):s.push(l)}return new e({entities:0!==i.length?new Uint32Array(i).sort():void 0,hostnames:0!==s.length?new Uint32Array(s).sort():void 0,notEntities:0!==n.length?new Uint32Array(n).sort():void 0,notHostnames:0!==c.length?new Uint32Array(c).sort():void 0,parts:!0===o?t.join(","):void 0})}static deserialize(t){const o=t.getUint8();return new e({entities:1==(1&o)?t.getUint32Array():void 0,hostnames:2==(2&o)?t.getUint32Array():void 0,notEntities:4==(4&o)?t.getUint32Array():void 0,notHostnames:8==(8&o)?t.getUint32Array():void 0,parts:16==(16&o)?t.getUTF8():void 0})}constructor({entities:e,hostnames:t,notEntities:o,notHostnames:i,parts:n}){this.entities=e,this.hostnames=t,this.notEntities=o,this.notHostnames=i,this.parts=n}updateId(e){const{hostnames:t,entities:o,notHostnames:i,notEntities:n}=this;if(void 0!==t)for(const o of t)e=e*ut^o;if(void 0!==o)for(const t of o)e=e*ut^t;if(void 0!==i)for(const t of i)e=e*ut^t;if(void 0!==n)for(const t of n)e=e*ut^t;return e}serialize(e){const t=e.getPos();e.pushUint8(0);let o=0;void 0!==this.entities&&(o|=1,e.pushUint32Array(this.entities)),void 0!==this.hostnames&&(o|=2,e.pushUint32Array(this.hostnames)),void 0!==this.notEntities&&(o|=4,e.pushUint32Array(this.notEntities)),void 0!==this.notHostnames&&(o|=8,e.pushUint32Array(this.notHostnames)),void 0!==this.parts&&(o|=16,e.pushUTF8(this.parts)),e.setByte(t,o)}getSerializedSize(){let e=1;return void 0!==this.entities&&(e+=ue(this.entities)),void 0!==this.hostnames&&(e+=ue(this.hostnames)),void 0!==this.notHostnames&&(e+=ue(this.notHostnames)),void 0!==this.notEntities&&(e+=ue(this.notEntities)),void 0!==this.parts&&(e+=de(this.parts)),e}match(e,t){if(void 0!==this.notHostnames)for(const t of e)if(It(this.notHostnames,t))return!1;if(void 0!==this.notEntities)for(const e of t)if(It(this.notEntities,e))return!1;if(void 0!==this.hostnames||void 0!==this.entities){if(void 0!==this.hostnames)for(const t of e)if(It(this.hostnames,t))return!0;if(void 0!==this.entities)for(const e of t)if(It(this.entities,e))return!0;return!1}return!0}};function Vt(e){if(!1===e.startsWith("^script"))return;const t=":has-text(",o=[];let i=7;for(;e.startsWith(t,i);){i+=10;let t=1;const n=i;let s=-1;for(;i=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122)){if(t{}},t=/^[#.]?[\w-.]+$/;return function(o){if(t.test(o))return!0;try{(t=>{e.matches(t)})(o)}catch(e){return!1}return!0}})();function Yt(e,t){const o=e.getSelector();if(!1===e.isScriptInject())return o;const i=e.parseScript();if(void 0===i)return o;const n=t(i.name);return void 0===n?o:o.replace(i.name,n)}(Kt=$t||($t={}))[Kt.unhide=1]="unhide",Kt[Kt.scriptInject=2]="scriptInject",Kt[Kt.isUnicode=4]="isUnicode",Kt[Kt.isClassSelector=8]="isClassSelector",Kt[Kt.isIdSelector=16]="isIdSelector",Kt[Kt.isHrefSelector=32]="isHrefSelector",Kt[Kt.remove=64]="remove",Kt[Kt.extended=128]="extended";var Xt=class e{static parse(t,o=!1){const i=t;let n,s,c,r=0;const a=t.indexOf("#"),l=a+1;let p=l+1;if(t.length>l&&("@"===t[l]?(r=gt(r,$t.unhide),p+=1):"?"===t[l]&&(p+=1)),p>=t.length)return null;if(a>0&&(s=Nt.parse(t.slice(0,a).split(","),o)),t.endsWith(":remove()"))r=gt(r,$t.remove),r=gt(r,$t.extended),t=t.slice(0,-9);else if(t.length-p>=8&&t.endsWith(")")&&-1!==t.indexOf(":style(",p)){const e=t.indexOf(":style(",p);c=t.slice(e+7,-1),t=t.slice(0,e)}if(94===t.charCodeAt(p)){if(!1===vt(t,"script:has-text(",p+1)||41!==t.charCodeAt(t.length-1))return null;if(n=t.slice(p,t.length),void 0===Vt(n))return null}else if(t.length-p>4&&43===t.charCodeAt(p)&&vt(t,"+js(",p)){if((void 0===s||void 0===s.hostnames&&void 0===s.entities)&&!1===At(r,$t.unhide))return null;if(r=gt(r,$t.scriptInject),n=t.slice(p+4,t.length-1),!1===At(r,$t.unhide)&&0===n.length)return null}else{n=t.slice(p);const e=Ke(n);if(e===He.Extended)r=gt(r,$t.extended);else if(e===He.Invalid||!Qt(n))return null}if(void 0===s&&!0===At(r,$t.extended))return null;if(void 0!==n&&(Tt(n)&&(r=gt(r,$t.isUnicode)),!1===At(r,$t.scriptInject)&&!1===At(r,$t.remove)&&!1===At(r,$t.extended)&&!1===n.startsWith("^"))){const e=n.charCodeAt(0),t=n.charCodeAt(1),o=n.charCodeAt(2);!1===At(r,$t.scriptInject)&&(46===e&&qt(n)?r=gt(r,$t.isClassSelector):35===e&&qt(n)?r=gt(r,$t.isIdSelector):(97===e&&91===t&&104===o&&Gt(n,2)||91===e&&104===t&&Gt(n,1))&&(r=gt(r,$t.isHrefSelector)))}return new e({mask:r,rawLine:!0===o?i:void 0,selector:n,style:c,domains:s})}static deserialize(t){const o=t.getUint8(),i=At(o,$t.isUnicode),n=t.getUint8(),s=i?t.getUTF8():t.getCosmeticSelector();return new e({mask:o,selector:s,domains:1==(1&n)?Nt.deserialize(t):void 0,rawLine:2==(2&n)?t.getRawCosmetic():void 0,style:4==(4&n)?t.getASCII():void 0})}constructor({mask:e,selector:t,domains:o,rawLine:i,style:n}){this.mask=e,this.selector=t,this.domains=o,this.style=n,this.id=void 0,this.rawLine=i,this.scriptletDetails=void 0}isCosmeticFilter(){return!0}isNetworkFilter(){return!1}serialize(e){e.pushUint8(this.mask);const t=e.getPos();e.pushUint8(0),this.isUnicode()?e.pushUTF8(this.selector):e.pushCosmeticSelector(this.selector);let o=0;void 0!==this.domains&&(o|=1,this.domains.serialize(e)),void 0!==this.rawLine&&(o|=2,e.pushRawCosmetic(this.rawLine)),void 0!==this.style&&(o|=4,e.pushASCII(this.style)),e.setByte(t,o)}getSerializedSize(e){let t=2;return this.isUnicode()?t+=de(this.selector):t+=function(e,t){return!0===t?le(ce().cosmeticSelector.getCompressedSize(e),!1):pe(e)}(this.selector,e),void 0!==this.domains&&(t+=this.domains.getSerializedSize()),void 0!==this.rawLine&&(t+=function(e,t){return!0===t?le(ce().cosmeticRaw.getCompressedSize(te(e)),!1):de(e)}(this.rawLine,e)),void 0!==this.style&&(t+=pe(this.style)),t}toString(){if(void 0!==this.rawLine)return this.rawLine;let e="";return void 0!==this.domains&&(void 0!==this.domains.parts?e+=this.domains.parts:e+=""),this.isUnhide()?e+="#@#":e+="##",this.isScriptInject()?(e+="+js(",e+=this.selector,e+=")"):e+=this.selector,e}match(e,t){return!1===this.hasHostnameConstraint()||!(!e&&this.hasHostnameConstraint())&&(void 0===this.domains||this.domains.match(0===e.length?ne:Bt(e,t),0===e.length?ne:Lt(e,t)))}getTokens(){const e=[];if(void 0!==this.domains){const{hostnames:t,entities:o}=this.domains;if(void 0!==t)for(const o of t)e.push(new Uint32Array([o]));if(void 0!==o)for(const t of o)e.push(new Uint32Array([t]))}if(0===e.length&&!1===this.isUnhide())if(this.isIdSelector()||this.isClassSelector()){let t=1;const o=this.selector;for(;t0?n=!0:"'"===p&&e.indexOf("'",o+1)>0?s=!0:"{"===p&&e.indexOf("}",o+1)>0?r+=1:"/"===p&&e.indexOf("/",o+1)>0?c=!0:l=!0)),","===p&&(t.push(e.slice(i+1,o).trim()),i=o,l=!1))),a="\\"===p}if(t.push(e.slice(i+1).trim()),0===t.length)return;const p=t.slice(1).map((e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.substring(1,e.length-1):e)).map((e=>e.replace(Dt,",").replace(Ht,"\\").replace(Wt,",")));return this.scriptletDetails={name:t[0],args:p},this.scriptletDetails}getScript(e){const t=this.parseScript();if(void 0===t)return;const{name:o,args:i}=t;let n=e(o);if(void 0!==n){for(let e=0;e>>0}(this.mask,this.selector,this.domains,this.style)),this.id}hasCustomStyle(){return void 0!==this.style}getStyle(e=Mt){return this.style||e}getStyleAttributeHash(){return`s${bt(this.getStyle())}`}getSelector(){return this.selector}getSelectorAST(){return De(this.getSelector())}getExtendedSelector(){return Vt(this.selector)}isExtended(){return At(this.mask,$t.extended)}isRemove(){return At(this.mask,$t.remove)}isUnhide(){return At(this.mask,$t.unhide)}isScriptInject(){return At(this.mask,$t.scriptInject)}isCSS(){return!1===this.isScriptInject()}isIdSelector(){return At(this.mask,$t.isIdSelector)}isClassSelector(){return At(this.mask,$t.isClassSelector)}isHrefSelector(){return At(this.mask,$t.isHrefSelector)}isUnicode(){return At(this.mask,$t.isUnicode)}isHtmlFiltering(){return this.getSelector().startsWith("^")}isGenericHide(){var e,t;return void 0===(null===(e=null==this?void 0:this.domains)||void 0===e?void 0:e.hostnames)&&void 0===(null===(t=null==this?void 0:this.domains)||void 0===t?void 0:t.entities)}},Zt=class{constructor(){this.options=new Set,this.prefix=void 0,this.infix=void 0,this.suffix=void 0,this.redirect=void 0}blockRequestsWithType(e){if(this.options.has(e))throw new Error(`Already blocking type ${e}`);return this.options.add(e),this}images(){return this.blockRequestsWithType("image")}scripts(){return this.blockRequestsWithType("script")}frames(){return this.blockRequestsWithType("frame")}fonts(){return this.blockRequestsWithType("font")}medias(){return this.blockRequestsWithType("media")}styles(){return this.blockRequestsWithType("css")}redirectTo(e){if(void 0!==this.redirect)throw new Error(`Already redirecting: ${this.redirect}`);return this.redirect=`redirect=${e}`,this}urlContains(e){if(void 0!==this.infix)throw new Error(`Already matching pattern: ${this.infix}`);return this.infix=e,this}urlStartsWith(e){if(void 0!==this.prefix)throw new Error(`Already matching prefix: ${this.prefix}`);return this.prefix=`|${e}`,this}urlEndsWith(e){if(void 0!==this.suffix)throw new Error(`Already matching suffix: ${this.suffix}`);return this.suffix=`${e}|`,this}withHostname(e){if(void 0!==this.prefix)throw new Error(`Cannot match hostname if filter already has prefix: ${this.prefix}`);return this.prefix=`||${e}^`,this}toString(){const e=[];void 0!==this.prefix&&e.push(this.prefix),void 0!==this.infix&&e.push(this.infix),void 0!==this.suffix&&e.push(this.suffix);const t=["important"];if(0!==this.options.size)for(const e of this.options)t.push(e);return void 0!==this.redirect&&t.push(this.redirect),`${0===e.length?"*":e.join("*")}$${t.join(",")}`}};function Jt(){return new Zt}var eo,to,oo=bt("http"),io=bt("https");(to=eo||(eo={}))[to.fromDocument=1]="fromDocument",to[to.fromFont=2]="fromFont",to[to.fromHttp=4]="fromHttp",to[to.fromHttps=8]="fromHttps",to[to.fromImage=16]="fromImage",to[to.fromMedia=32]="fromMedia",to[to.fromObject=64]="fromObject",to[to.fromOther=128]="fromOther",to[to.fromPing=256]="fromPing",to[to.fromScript=512]="fromScript",to[to.fromStylesheet=1024]="fromStylesheet",to[to.fromSubdocument=2048]="fromSubdocument",to[to.fromWebsocket=4096]="fromWebsocket",to[to.fromXmlHttpRequest=8192]="fromXmlHttpRequest",to[to.firstParty=16384]="firstParty",to[to.thirdParty=32768]="thirdParty",to[to.isReplace=65536]="isReplace",to[to.isBadFilter=131072]="isBadFilter",to[to.isCSP=262144]="isCSP",to[to.isGenericHide=524288]="isGenericHide",to[to.isImportant=1048576]="isImportant",to[to.isSpecificHide=2097152]="isSpecificHide",to[to.isFullRegex=4194304]="isFullRegex",to[to.isRegex=8388608]="isRegex",to[to.isUnicode=16777216]="isUnicode",to[to.isLeftAnchor=33554432]="isLeftAnchor",to[to.isRightAnchor=67108864]="isRightAnchor",to[to.isException=134217728]="isException",to[to.isHostnameAnchor=268435456]="isHostnameAnchor",to[to.isRedirectRule=536870912]="isRedirectRule",to[to.isRedirect=1073741824]="isRedirect";var no=eo.fromDocument|eo.fromFont|eo.fromImage|eo.fromMedia|eo.fromObject|eo.fromOther|eo.fromPing|eo.fromScript|eo.fromStylesheet|eo.fromSubdocument|eo.fromWebsocket|eo.fromXmlHttpRequest,so={beacon:eo.fromPing,document:eo.fromDocument,cspviolationreport:eo.fromOther,fetch:eo.fromXmlHttpRequest,font:eo.fromFont,image:eo.fromImage,imageset:eo.fromImage,mainFrame:eo.fromDocument,main_frame:eo.fromDocument,media:eo.fromMedia,object:eo.fromObject,object_subrequest:eo.fromObject,ping:eo.fromPing,script:eo.fromScript,stylesheet:eo.fromStylesheet,subFrame:eo.fromSubdocument,sub_frame:eo.fromSubdocument,webSocket:eo.fromWebsocket,websocket:eo.fromWebsocket,xhr:eo.fromXmlHttpRequest,xmlhttprequest:eo.fromXmlHttpRequest,cspReport:eo.fromOther,csp_report:eo.fromOther,eventsource:eo.fromOther,manifest:eo.fromOther,other:eo.fromOther,prefetch:eo.fromOther,preflight:eo.fromOther,signedexchange:eo.fromOther,speculative:eo.fromOther,texttrack:eo.fromOther,web_manifest:eo.fromOther,xml_dtd:eo.fromOther,xslt:eo.fromOther};function co(e){const t=[];return e.fromDocument()&&t.push("document"),e.fromImage()&&t.push("image"),e.fromMedia()&&t.push("media"),e.fromObject()&&t.push("object"),e.fromOther()&&t.push("other"),e.fromPing()&&t.push("ping"),e.fromScript()&&t.push("script"),e.fromStylesheet()&&t.push("stylesheet"),e.fromSubdocument()&&t.push("sub_frame"),e.fromWebsocket()&&t.push("websocket"),e.fromXmlHttpRequest()&&t.push("xhr"),e.fromFont()&&t.push("font"),t}function ro(e,t,o,i,n,s){let c=ht*ut^e;if(void 0!==i&&(c=i.updateId(c)),void 0!==n&&(c=n.updateId(c)),void 0!==t)for(let e=0;e>>0}function ao(e,t,o,i){return!0===i?new RegExp(e.slice(1,e.length-1),"i"):(e=(e=(e=e.replace(/([|.$+?{}()[\]\\])/g,"\\$1")).replace(/\*/g,".*")).replace(/\^/g,"(?:[^\\w\\d_.%-]|$)"),o&&(e=`${e}$`),t&&(e=`^${e}`),new RegExp(e))}function lo(e,t,o){const i=t;for(;t=48&&e<=57||e<=65&&e<=70||e>=97&&e<=102}function mo(e,t,o){const i=e.charCodeAt(t+1);return 44===i||47===i?[t+1,!1]:function(e,t,o){const i=e.charCodeAt(t+1);if(44===i||uo.has(i))return[t+1,!0];if(99===i){const o=e.charCodeAt(t+2);if(o>=65&&o<=90||o>=97&&o<=122)return[t+2,!0]}if(120===i&&ho(e.charCodeAt(t+2))&&ho(e.charCodeAt(t+3)))return[t+3,!0];if(117===i)if(123===e.charCodeAt(t+2)){const o=e.indexOf("}",t+3),i=o-t+3;if(i>=1&&i<=6)return[o,!0]}else if(ho(e.charCodeAt(t+2))&&ho(e.charCodeAt(t+3))&&ho(e.charCodeAt(t+4))&&ho(e.charCodeAt(t+5)))return[t+5,!0];return[t+1,!1]}(e,t)}function Ao(e,t,o){if(47!==e.charCodeAt(t++))return[o,void 0];const i=["","",""];let n=t,s=0;for(;t0&&92===e.charCodeAt(o-1);)o=e.lastIndexOf(t,o-1);return o}(t,"$");if(-1!==u&&47!==t.charCodeAt(u+1)){d=u;for(const e of function(e,t,o){const i=[];let n,s;for(;t0&&(c=p);break;case"ehide":case"elemhide":if(t)return null;r=gt(r,eo.isGenericHide),r=gt(r,eo.isSpecificHide);break;case"shide":case"specifichide":if(t)return null;r=gt(r,eo.isSpecificHide);break;case"ghide":case"generichide":if(t)return null;r=gt(r,eo.isGenericHide);break;case"inline-script":if(t)return null;r=gt(r,eo.isCSP),c="script-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:";break;case"inline-font":if(t)return null;r=gt(r,eo.isCSP),c="font-src 'self' 'unsafe-eval' http: https: data: blob: mediastream: filesystem:";break;case"replace":case"content":if(t||(0===p.length?!1===At(r,eo.isException):null===go(p)))return null;r=gt(r,eo.isReplace),c=p;break;default:{let e=0;switch(i){case"all":if(t)return null;break;case"image":e=eo.fromImage;break;case"media":e=eo.fromMedia;break;case"object":case"object-subrequest":e=eo.fromObject;break;case"other":e=eo.fromOther;break;case"ping":case"beacon":e=eo.fromPing;break;case"script":e=eo.fromScript;break;case"css":case"stylesheet":e=eo.fromStylesheet;break;case"frame":case"subdocument":e=eo.fromSubdocument;break;case"xhr":case"xmlhttprequest":e=eo.fromXmlHttpRequest;break;case"websocket":e=eo.fromWebsocket;break;case"font":e=eo.fromFont;break;case"doc":case"document":e=eo.fromDocument;break;default:return null}t?l=ft(l,e):a=gt(a,e);break}}}}let h;if(r|=0===a?l:l===no?a:a&l,d-p>=2&&47===t.charCodeAt(p)&&47===t.charCodeAt(d-1)){h=t.slice(p,d);try{ao(h,!1,!1,!0)}catch(e){return null}r=gt(r,eo.isFullRegex)}else{if(d>0&&124===t.charCodeAt(d-1)&&(r=gt(r,eo.isRightAnchor),d-=1),p0&&42===t.charCodeAt(d-1)&&(d-=1),!1===At(r,eo.isHostnameAnchor)&&d-p>0&&42===t.charCodeAt(p)&&(r=ft(r,eo.isLeftAnchor),p+=1),At(r,eo.isLeftAnchor)&&(d-p==5&&vt(t,"ws://",p)?(r=gt(r,eo.fromWebsocket),r=ft(r,eo.isLeftAnchor),r=ft(r,eo.fromHttp),r=ft(r,eo.fromHttps),p=d):d-p==7&&vt(t,"http://",p)?(r=gt(r,eo.fromHttp),r=ft(r,eo.fromHttps),r=ft(r,eo.isLeftAnchor),p=d):d-p==8&&vt(t,"https://",p)?(r=gt(r,eo.fromHttps),r=ft(r,eo.fromHttp),r=ft(r,eo.isLeftAnchor),p=d):d-p==8&&vt(t,"http*://",p)&&(r=gt(r,eo.fromHttps),r=gt(r,eo.fromHttp),r=ft(r,eo.isLeftAnchor),p=d)),d-p>0&&(h=t.slice(p,d).toLowerCase(),r=bo(r,eo.isUnicode,Tt(h)),!1===At(r,eo.isRegex)&&(r=bo(r,eo.isRegex,function(e,t,o){const i=e.indexOf("^",t);if(-1!==i&&it.length)return!1;if(e.length===t.length)return e===t;const i=t.indexOf(e);if(-1===i)return!1;if(0===i)return!0===o||46===t.charCodeAt(e.length)||46===e.charCodeAt(e.length-1);if(t.length===i+e.length)return 46===t.charCodeAt(i-1)||46===e.charCodeAt(0);return!(!0!==o&&46!==t.charCodeAt(e.length)&&46!==e.charCodeAt(e.length-1)||46!==t.charCodeAt(i-1)&&46!==e.charCodeAt(0))}(i,t.hostname,void 0!==e.filter&&42===e.filter.charCodeAt(0)))return!1;if(e.isRegex())return e.getRegex().test(t.url.slice(t.url.indexOf(i)+i.length));if(e.isRightAnchor()&&e.isLeftAnchor()){return o===t.url.slice(t.url.indexOf(i)+i.length)}if(e.isRightAnchor()){const n=t.hostname;return!1===e.hasFilter()?i.length===n.length||n.endsWith(i):t.url.endsWith(o)}return e.isLeftAnchor()?vt(t.url,o,t.url.indexOf(i)+i.length):!1===e.hasFilter()||-1!==t.url.indexOf(o,t.url.indexOf(i)+i.length)}if(e.isRegex())return e.getRegex().test(t.url);if(e.isLeftAnchor()&&e.isRightAnchor())return t.url===o;if(e.isLeftAnchor())return wt(t.url,o);if(e.isRightAnchor())return t.url.endsWith(o);if(!1===e.hasFilter())return!0;return-1!==t.url.indexOf(o)}(this,e)}serialize(e){e.pushUint32(this.mask);const t=e.getPos();e.pushUint8(0);let o=0;void 0!==this.filter&&(o|=1,this.isUnicode()?e.pushUTF8(this.filter):e.pushNetworkFilter(this.filter)),void 0!==this.hostname&&(o|=2,e.pushNetworkHostname(this.hostname)),void 0!==this.domains&&(o|=4,this.domains.serialize(e)),void 0!==this.rawLine&&(o|=8,e.pushRawNetwork(this.rawLine)),void 0!==this.denyallow&&(o|=16,this.denyallow.serialize(e)),void 0!==this.optionValue&&(o|=32,this.isCSP()?e.pushNetworkCSP(this.optionValue):this.isRedirect()?e.pushNetworkRedirect(this.optionValue):e.pushUTF8(this.optionValue)),e.setByte(t,o)}getSerializedSize(e){let t=5;return void 0!==this.filter&&(!0===this.isUnicode()?t+=de(this.filter):t+=function(e,t){return!0===t?le(ce().networkFilter.getCompressedSize(e),!1):pe(e)}(this.filter,e)),void 0!==this.hostname&&(t+=function(e,t){return!0===t?le(ce().networkHostname.getCompressedSize(e),!1):pe(e)}(this.hostname,e)),void 0!==this.domains&&(t+=this.domains.getSerializedSize()),void 0!==this.rawLine&&(t+=function(e,t){return!0===t?le(ce().networkRaw.getCompressedSize(te(e)),!1):de(e)}(this.rawLine,e)),void 0!==this.denyallow&&(t+=this.denyallow.getSerializedSize()),void 0!==this.optionValue&&(this.isCSP()?t+=function(e,t){return!0===t?le(ce().networkCSP.getCompressedSize(e),!1):pe(e)}(this.optionValue,e):this.isRedirect()?t+=function(e,t){return!0===t?le(ce().networkRedirect.getCompressedSize(e),!1):pe(e)}(this.optionValue,e):t+=de(this.optionValue)),t}toString(e){if(void 0!==this.rawLine)return this.rawLine;let t="";this.isException()&&(t+="@@"),this.isHostnameAnchor()?t+="||":this.fromHttp()!==this.fromHttps()?this.fromHttp()?t+="|http://":t+="|https://":this.isLeftAnchor()&&(t+="|"),this.hasHostname()&&(t+=this.getHostname(),t+="^"),this.isFullRegex()?t+=`/${this.getRegex().source}/`:this.isRegex()?t+=this.getRegex().source:t+=this.getFilter(),this.isRightAnchor()&&"^"!==t[t.length-1]&&(t+="|");const o=[];if(!1===this.fromAny()){const e=mt(this.getCptMask());if(mt(no)-e")),void 0!==this.denyallow&&(void 0!==this.denyallow.parts?o.push(`denyallow=${this.denyallow.parts}`):o.push("denyallow=")),this.isBadFilter()&&o.push("badfilter"),o.length>0&&(t+="function"==typeof e?`$${o.map(e).join(",")}`:`$${o.join(",")}`),t}getIdWithoutBadFilter(){return ro(this.mask&~eo.isBadFilter,this.filter,this.hostname,this.domains,this.denyallow,this.optionValue)}getId(){return void 0===this.id&&(this.id=ro(this.mask,this.filter,this.hostname,this.domains,this.denyallow,this.optionValue)),this.id}hasFilter(){return void 0!==this.filter}hasDomains(){return void 0!==this.domains}getMask(){return this.mask}getCptMask(){return this.getMask()&no}isRedirect(){return At(this.getMask(),eo.isRedirect)}isRedirectRule(){return At(this.mask,eo.isRedirectRule)}getRedirect(){var e;return null!==(e=this.optionValue)&&void 0!==e?e:""}isReplace(){return At(this.getMask(),eo.isReplace)}getHtmlModifier(){var e;return 0===(null===(e=this.optionValue)||void 0===e?void 0:e.length)?null:go(this.optionValue)}isHtmlFilteringRule(){return this.isReplace()}getRedirectResource(){const e=this.getRedirect(),t=e.lastIndexOf(":");return-1===t?e:e.slice(0,t)}getRedirectPriority(){const e=this.getRedirect(),t=e.lastIndexOf(":");return-1===t?0:Number(e.slice(t+1))}hasHostname(){return void 0!==this.hostname}getHostname(){return this.hostname||""}getFilter(){return this.filter||""}getRegex(){return void 0===this.regex&&(this.regex=void 0!==this.filter&&this.isRegex()?ao(this.filter,this.isLeftAnchor(),this.isRightAnchor(),this.isFullRegex()):fo),this.regex}getTokens(){if(dt.reset(),void 0!==this.domains&&void 0!==this.domains.hostnames&&void 0===this.domains.entities&&void 0===this.domains.notHostnames&&void 0===this.domains.notEntities&&1===this.domains.hostnames.length&&dt.push(this.domains.hostnames[0]),!1===this.isFullRegex()){if(void 0!==this.filter){const e=!this.isRightAnchor(),t=!this.isLeftAnchor();!function(e,t,o,i){const n=Math.min(e.length,2*i.remaining());let s=!1,c=0,r=0,a=ht;for(let o=0;o1&&42!==n&&42!==c&&(!1===t||0!==r)&&i.push(a>>>0)),c=n)}!1===o&&!0===s&&42!==c&&e.length-r>1&&!1===i.full()&&i.push(a>>>0)}(this.filter,t,e,dt)}void 0!==this.hostname&&St(this.hostname,!1,void 0!==this.filter&&42===this.filter.charCodeAt(0),dt)}else void 0!==this.filter&&function(e,t){let o=e.length-1,i=1,n=0;for(;i=i;o-=1){const t=e.charCodeAt(o);if(124===t)return;if(41===t||42===t||43===t||63===t||93===t||125===t||46===t&&92!==e.charCodeAt(o-1)||92===t&&Ct(n))break;n=t}if(o1&&St(e.slice(1,i),94!==e.charCodeAt(1),!0,t),oObject.prototype.hasOwnProperty.call(Io,e),To=(e,t)=>"true"===e&&!t.has("true")||!("false"===e&&!t.has("false"))&&!!t.get(e),Oo=(e,t)=>{if(0===e.length)return!1;if((e=>Eo.test(e))(e))return"!"===e[0]?!To(e.slice(1),t):To(e,t);const o=(e=>e.match(So))(e);if(!o||0===o.length)return!1;if(e.length!==o.reduce(((e,t)=>e+t.length),0))return!1;const i=[],n=[];for(const e of o)if("("===e)n.push(e);else if(")"===e){for(;0!==n.length&&"("!==n[n.length-1];)i.push(n.pop());if(0===n.length)return!1;n.pop()}else if(Fo(e)){for(;n.length&&Fo(n[n.length-1])&&Io[e]<=Io[n[n.length-1]];)i.push(n.pop());n.push(e)}else i.push(To(e,t));if("("===n[0]||")"===n[0])return!1;for(;0!==n.length;)i.push(n.pop());for(const e of i)if(!0===e||!1===e)n.push(e);else if("!"===e)n.push(!n.pop());else if(Fo(e)){const t=n.pop(),o=n.pop();"&&"===e?n.push(o&&t):n.push(o||t)}return!0===n[0]},Po=class e{static getCondition(e){return e.slice(5).replace(/\s/g,"")}static parse(t,o){return new this({condition:e.getCondition(t),filterIDs:o})}static deserialize(e){const t=e.getUTF8(),o=new Set;for(let t=0,i=e.getUint32();t2)for(;e4&&32===t.charCodeAt(0)&&32===t.charCodeAt(1)&&32===t.charCodeAt(2)&&32===t.charCodeAt(3)&&32!==t.charCodeAt(4)))break;a+=t.slice(4),e+=1}0!==a.length&&a.charCodeAt(a.length-1)<=32&&(a=a.trim());const l=Ro(a,{extendedNonSupportedTypes:!0});if(l===Co.NETWORK&&!0===t.loadNetworkFilters){const i=ko.parse(a,t.debug);null!==i?(o.push(i),r.length>0&&r[r.length-1].filterIDs.add(i.getId())):n.push({lineNumber:e,filter:a,filterType:l})}else if(l===Co.COSMETIC&&!0===t.loadCosmeticFilters){const o=Xt.parse(a,t.debug);null!==o?!0!==t.loadGenericCosmeticsFilters&&!1!==o.isGenericHide()||(i.push(o),r.length>0&&r[r.length-1].filterIDs.add(o.getId())):n.push({lineNumber:e,filter:a,filterType:Co.COSMETIC})}else if(t.loadPreprocessors){const t=_o(a);if(t===yo.BEGIF)r.length>0?r.push(new Po({condition:`(${r[r.length-1].condition})&&(${Po.getCondition(a)})`})):r.push(Po.parse(a));else if((t===yo.ENDIF||t===yo.ELSE)&&r.length>0){const e=r.pop();c.push(e),t===yo.ELSE&&r.push(new Po({condition:`!(${e.condition})`}))}else l===Co.NOT_SUPPORTED_ADGUARD&&n.push({lineNumber:e,filter:a,filterType:l})}else l===Co.NOT_SUPPORTED_ADGUARD&&n.push({lineNumber:e,filter:a,filterType:l})}return{networkFilters:o,cosmeticFilters:i,preprocessors:c.filter((e=>e.filterIDs.size>0)),notSupportedFilters:n}}(xo=Co||(Co={}))[xo.NOT_SUPPORTED=0]="NOT_SUPPORTED",xo[xo.NETWORK=1]="NETWORK",xo[xo.COSMETIC=2]="COSMETIC",xo[xo.NOT_SUPPORTED_EMPTY=100]="NOT_SUPPORTED_EMPTY",xo[xo.NOT_SUPPORTED_COMMENT=101]="NOT_SUPPORTED_COMMENT",xo[xo.NOT_SUPPORTED_ADGUARD=102]="NOT_SUPPORTED_ADGUARD";var Lo="video/flv",Bo={contentType:`${Lo};base64`,aliases:[Lo,".flv","flv"],body:"RkxWAQEAAAAJAAAAABIAALgAAAAAAAAAAgAKb25NZXRhRGF0YQgAAAAIAAhkdXJhdGlvbgAAAAAAAAAAAAAFd2lkdGgAP/AAAAAAAAAABmhlaWdodAA/8AAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAaGoAAAAAAAAJZnJhbWVyYXRlAEBZAAAAAAAAAAx2aWRlb2NvZGVjaWQAQAAAAAAAAAAAB2VuY29kZXICAA1MYXZmNTcuNDEuMTAwAAhmaWxlc2l6ZQBAaoAAAAAAAAAACQAAAMM="},Uo="image/gif",No={contentType:`${Uo};base64`,aliases:[Uo,".gif","gif"],body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"},Vo="text/html",jo={contentType:Vo,aliases:[Vo,".html","html",".htm","htm","noopframe","noop.html"],body:""},Mo="image/vnd.microsoft.icon",Do={contentType:`${Mo};base64`,aliases:[Mo,".ico","ico"],body:"AAABAAEAAQEAAAEAGAAwAAAAFgAAACgAAAABAAAAAgAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA=="},Ho="image/jpeg",Wo={contentType:`${Ho};base64`,aliases:[Ho,".jpg","jpg",".jpeg","jpeg"],body:"/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k="},qo="application/javascript",Go={contentType:qo,aliases:[qo,".js","js","javascript",".jsx","jsx","typescript",".ts","ts","noop.js","noopjs"],body:""},$o="application/json",Ko={contentType:$o,aliases:[$o,".json","json"],body:"0"},Qo="audio/mpeg",Yo={contentType:`${Qo};base64`,aliases:[Qo,".mp3","mp3","noop-0.1s.mp3","noopmp3-0.1s"],body:"/+MYxAAAAANIAAAAAExBTUUzLjk4LjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},Xo="video/mp4",Zo={contentType:`${Xo};base64`,aliases:[Xo,".mp4","mp4",".m4a","m4a",".m4p","m4p",".m4b","m4b",".m4r","m4r",".m4v","m4v","noop-1s.mp4","noopmp4-1s"],body:"AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAAC721kYXQhEAUgpBv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcCEQBSCkG//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADengAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAsJtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAALwABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAB7HRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAIAAAAAAAAALwAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAC8AAAAAAAEAAAAAAWRtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAKxEAAAIAFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAEPbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAADTc3RibAAAAGdzdHNkAAAAAAAAAAEAAABXbXA0YQAAAAAAAAABAAAAAAAAAAAAAgAQAAAAAKxEAAAAAAAzZXNkcwAAAAADgICAIgACAASAgIAUQBUAAAAAAfQAAAHz+QWAgIACEhAGgICAAQIAAAAYc3R0cwAAAAAAAAABAAAAAgAABAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAIAAAABAAAAHHN0c3oAAAAAAAAAAAAAAAIAAAFzAAABdAAAABRzdGNvAAAAAAAAAAEAAAAsAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY1Ni40MC4xMDE="},Jo="application/pdf",ei={contentType:`${Jo};base64`,aliases:[Jo,".pdf","pdf"],body:"JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1szIDAgUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0cmFpbGVyIDw8L1Jvb3QgMSAwIFI+Pg=="},ti="image/png",oi={contentType:`${ti};base64`,aliases:[ti,".png","png"],body:"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="},ii="image/svg+xml",ni={contentType:ii,aliases:[ii,".svg","svg"],body:"https://raw.githubusercontent.com/mathiasbynens/small/master/svg.svg"},si="text/plain",ci={contentType:si,aliases:[si,".txt","txt","text","nooptext","noop.txt"],body:""},ri="audio/wav",ai={contentType:`${ri};base64`,aliases:[ri,".wav","wav"],body:"UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA="},li="video/webm",pi={contentType:`${li};base64`,aliases:[li,".webm","webm"],body:"GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA="},di="image/webp",ui={contentType:`${di};base64`,aliases:[di,".webp","webp"],body:"UklGRhIAAABXRUJQVlA4TAYAAAAvQWxvAGs="},hi="video/wmv",mi={contentType:`${hi};base64`,aliases:[hi,".wmv","wmv"],body:"MCaydY5mzxGm2QCqAGLObOUBAAAAAAAABQAAAAECodyrjEepzxGO5ADADCBTZWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcCAAAAAAAAAIA+1d6xnQEAAAAAAAAAAMAF2QEAAAAAAAAAAAAAAAAcDAAAAAAAAAIAAACADAAAgAwAAEANAwC1A79fLqnPEY7jAMAMIFNlLgAAAAAAAAAR0tOruqnPEY7mAMAMIFNlBgAAAAAAQKTQ0gfj0hGX8ACgyV6oUGQAAAAAAAAAAQAoAFcATQAvAEUAbgBjAG8AZABpAG4AZwBTAGUAdAB0AGkAbgBnAHMAAAAAABwATABhAHYAZgA1ADcALgA0ADEALgAxADAAMAAAAJEH3Le3qc8RjuYAwAwgU2WBAAAAAAAAAMDvGbxNW88RqP0AgF9cRCsAV/sgVVvPEaj9AIBfXEQrAAAAAAAAAAAzAAAAAAAAAAEAAAAAAAEAAAABAAAAAigAKAAAAAEAAAABAAAAAQAYAE1QNDMDAAAAAAAAAAAAAAAAAAAAAAAAAEBS0YYdMdARo6QAoMkDSPZMAAAAAAAAAEFS0YYdMdARo6QAoMkDSPYBAAAAAQAKAG0AcwBtAHAAZQBnADQAdgAzAAAAAAAEAE1QNDM2JrJ1jmbPEabZAKoAYs5sMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQ=="},Ai=(()=>{const e={};for(const t of[Bo,No,jo,Do,Wo,Go,Ko,Yo,Zo,ei,oi,ni,ci,ai,pi,ui,mi])for(const o of t.aliases)e[o]=t;return e})();function gi(e){return Ai[e]||ci}function fi(e){if(null===e)return!1;if("object"!=typeof e)return!1;const{name:t,aliases:o,body:i,contentType:n}=e;return"string"==typeof t&&(!(!Array.isArray(o)||!o.every((e=>"string"==typeof e)))&&("string"==typeof i&&"string"==typeof n))}function ki(e){if(null===e)return!1;if("object"!=typeof e)return!1;const{name:t,aliases:o,body:i,dependencies:n,executionWorld:s,requiresTrust:c}=e;return"string"==typeof t&&(!(!Array.isArray(o)||!o.every((e=>"string"==typeof e)))&&("string"==typeof i&&(!(!Array.isArray(n)||!n.every((e=>"string"==typeof e)))&&((void 0===s||"MAIN"===s||"ISOLATED"===s)&&(void 0===c||"boolean"==typeof c)))))}var bi=class e{static deserialize(t){const o=t.getASCII(),i=[],n=[];for(let e=0,o=t.getUint16();e["if (typeof scriptletGlobals === 'undefined') { var scriptletGlobals = {}; }",...t,`(${e})(...['{{1}}','{{2}}','{{3}}','{{4}}','{{5}}','{{6}}','{{7}}','{{8}}','{{9}}','{{10}}'].filter((a,i) => a !== '{{'+(i+1)+'}}').map((a) => decodeURIComponent(a)))`].join(";"))(t.body,i),this.scriptletsCache.set(t.name,o),o}getSurrogate(e){const t=this.resourcesByName.get(e.endsWith(".js")?e:`${e}.js`);if(void 0!==t&&"application/javascript"===t.contentType)return t.body}getScriptletCanonicalName(e){var t;return null===(t=this.getRawScriptlet(e))||void 0===t?void 0:t.name}getRawScriptlet(e){if(!e.endsWith(".fn"))return this.scriptletsByName.get(e.endsWith(".js")?e:`${e}.js`)}getScriptletDependencies(e){const t=new Map,o=[...e.dependencies];for(;o.length>0;){const e=o.pop();if(t.has(e))continue;const i=this.scriptletsByName.get(e);t.set(e,i.body),o.push(...i.dependencies)}return Array.from(t.values())}getSerializedSize(){let e=pe(this.checksum);e+=2;for(const{name:t,aliases:o,body:i,contentType:n}of this.resources)e+=pe(t),e+=o.reduce(((e,t)=>e+pe(t)),2),e+=de(i),e+=pe(n);e+=2;for(const{name:t,aliases:o,body:i,dependencies:n}of this.scriptlets)e+=pe(t),e+=o.reduce(((e,t)=>e+pe(t)),2),e+=de(i),e+=1,e+=1,e+=1,e+=1,e+=n.reduce(((e,t)=>e+pe(t)),2);return e}serialize(e){e.pushASCII(this.checksum),e.pushUint16(this.resources.length);for(const{name:t,aliases:o,body:i,contentType:n}of this.resources){e.pushASCII(t),e.pushUint16(o.length);for(const t of o)e.pushASCII(t);e.pushUTF8(i),e.pushASCII(n)}e.pushUint16(this.scriptlets.length);for(const{name:t,aliases:o,body:i,dependencies:n,executionWorld:s,requiresTrust:c}of this.scriptlets){e.pushASCII(t),e.pushUint16(o.length);for(const t of o)e.pushASCII(t);e.pushUTF8(i),e.pushBool(void 0!==s),e.pushBool("ISOLATED"===s),e.pushBool(void 0!==c),e.pushBool(!0===c),e.pushUint16(n.length),n.forEach((t=>e.pushASCII(t)))}}};var yi=new Uint32Array(0);function wi(e){return`(?:${e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")})`}function vi(e,t,o){let i=e.get(t);void 0===i&&(i=[],e.set(t,i)),i.push(o)}function _i(e,t){const o=new Map;for(const i of e)vi(o,t(i),i);return Array.from(o.values())}function Ci(e,t){const o=[],i=[];for(const n of e)t(n)?o.push(n):i.push(n);return{negative:i,positive:o}}var xi=[{description:"Remove duplicated filters by ID",fusion:e=>e[0],groupByCriteria:e=>""+e.getId(),select:()=>!0},{description:"Group idential filter with same mask but different domains in single filters",fusion:e=>{const t=[],o=new Set,i=new Set,n=new Set,s=new Set;for(const{domains:c}of e)if(void 0!==c){if(void 0!==c.parts&&t.push(c.parts),void 0!==c.hostnames)for(const e of c.hostnames)o.add(e);if(void 0!==c.entities)for(const e of c.entities)n.add(e);if(void 0!==c.notHostnames)for(const e of c.notHostnames)i.add(e);if(void 0!==c.notEntities)for(const e of c.notEntities)s.add(e)}return new ko(Object.assign({},e[0],{domains:new Nt({hostnames:0!==o.size?new Uint32Array(o).sort():void 0,entities:0!==n.size?new Uint32Array(n).sort():void 0,notHostnames:0!==i.size?new Uint32Array(i).sort():void 0,notEntities:0!==s.size?new Uint32Array(s).sort():void 0,parts:0!==t.length?t.join(","):void 0}),rawLine:void 0!==e[0].rawLine?e.map((({rawLine:e})=>e)).join(" <+> "):void 0}))},groupByCriteria:e=>{var t;return e.getHostname()+e.getFilter()+e.getMask()+(null!==(t=e.optionValue)&&void 0!==t?t:"")},select:e=>!e.isCSP()&&void 0===e.denyallow&&void 0!==e.domains},{description:"Group simple patterns, into a single filter",fusion:e=>{const t=[];for(const o of e)o.isRegex()?t.push(`(?:${o.getRegex().source})`):o.isRightAnchor()?t.push(`${wi(o.getFilter())}$`):o.isLeftAnchor()?t.push(`^${wi(o.getFilter())}`):t.push(wi(o.getFilter()));return new ko(Object.assign({},e[0],{mask:gt(e[0].mask,eo.isRegex),rawLine:void 0!==e[0].rawLine?e.map((({rawLine:e})=>e)).join(" <+> "):void 0,regex:new RegExp(t.join("|"))}))},groupByCriteria:e=>""+(e.getMask()&~eo.isRegex&~eo.isFullRegex),select:e=>void 0===e.domains&&void 0===e.denyallow&&!e.isHostnameAnchor()&&!e.isRedirect()&&!e.isCSP()}];function Si(e){return e}function Ei(e){return e}function Ii(e){const t=[];let o=e;for(const{select:e,fusion:i,groupByCriteria:n}of xi){const{positive:s,negative:c}=Ci(o,e);o=c;const r=_i(s,n);for(const e of r)e.length>1?t.push(i(e)):o.push(e[0])}for(const e of o)t.push(e);return t}function Fi(e){return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,++e}var Ti=1;var Oi=Number.MAX_SAFE_INTEGER>>>0,Pi=class e{static deserialize(t,o,i,n){const s=t.getUint32(),c=t.getUint32(),r=t.getUint32(),a=me.fromUint8Array(t.getBytes(!0),n),l=a.getUint32ArrayView(s),p=a.getUint32ArrayView(c),d=a.pos;return a.seekZero(),new e({config:n,deserialize:o,filters:[],optimize:i}).updateInternals({bucketsIndex:p,filtersIndexStart:d,numberOfFilters:r,tokensLookupIndex:l,view:a})}constructor({deserialize:e,filters:t,optimize:o,config:i}){this.bucketsIndex=ne,this.filtersIndexStart=0,this.numberOfFilters=0,this.tokensLookupIndex=ne,this.cache=new Map,this.view=me.empty(i),this.deserializeFilter=e,this.optimize=o,this.config=i,0!==t.length&&this.update(t,void 0)}getFilters(){const e=[];if(0===this.numberOfFilters)return e;this.view.setPos(this.filtersIndexStart);for(let t=0;t!t.has(e.getId())||(r-=e.getSerializedSize(o),!1))));for(const t of e)r+=t.getSerializedSize(o),a.push(t)}else{a=e;for(const t of e)r+=t.getSerializedSize(o)}if(0===a.length)return void this.updateInternals({bucketsIndex:ne,filtersIndexStart:0,numberOfFilters:0,tokensLookupIndex:ne,view:me.empty(this.config)});!0===this.config.debug&&a.sort(((e,t)=>e.getId()-t.getId()));const l=new Uint32Array(Math.max(Fi(2*a.length),256));for(const e of a){const t=e.getTokens();s.push(t),c+=2*t.length,n+=t.length;for(const e of t){i+=e.length;for(const t of e)l[t%l.length]+=1}}r+=4*c;const p=Math.max(2,Fi(n)),d=p-1,u=[];for(let e=0;e1?this.optimize(c):c,lastRequestSeen:-1},!0===this.config.enableInMemoryCache&&this.cache.set(e,i)}if(i.lastRequestSeen!==t){i.lastRequestSeen=t;const e=i.filters;for(let t=0;t0){const o=e[t];e[t]=e[t-1],e[t-1]=o}return!1}}return!0}},Ri=new Uint8Array(4),zi=class e{static deserialize(t,o,i){const n=new e({deserialize:o,config:i,filters:[]});return n.filters=t.getBytes(),n}constructor({config:e,deserialize:t,filters:o}){this.deserialize=t,this.filters=Ri,this.config=e,0!==o.length&&this.update(o,void 0)}update(e,t){let o=this.filters.byteLength,i=[];const n=this.config.enableCompression,s=this.getFilters();if(0!==s.length)if(void 0===t||0===t.size)i=s;else for(const e of s)!1===t.has(e.getId())?i.push(e):o-=e.getSerializedSize(n);const c=i.length!==s.length,r=i.length;for(const t of e)o+=t.getSerializedSize(n),i.push(t);const a=i.length>r;if(0===i.length)this.filters=Ri;else if(!0===a||!0===c){const e=me.allocate(o,this.config);e.pushUint32(i.length),!0===this.config.debug&&i.sort(((e,t)=>e.getId()-t.getId()));for(const t of i)t.serialize(e);this.filters=e.buffer}}getSerializedSize(){return ae(this.filters,!1)}serialize(e){e.pushBytes(this.filters)}getFilters(){if(this.filters.byteLength<=4)return[];const e=[],t=me.fromUint8Array(this.filters,this.config),o=t.getUint32();for(let i=0;i(!0!==c&&!0!==o.isScriptInject()||!o.match(t,e)||(null==p?void 0:p(o))||u.push(o),!0))),!0===s&&!0===a){const o=this.getGenericRules(l);for(const i of o)!0!==i.match(t,e)||(null==p?void 0:p(i))||u.push(i)}!0===s&&!0===r&&0!==o.length&&this.classesIndex.iterMatchingFilters(yt(o),(o=>(o.match(t,e)&&!(null==p?void 0:p(o))&&u.push(o),!0))),!0===s&&!0===r&&0!==n.length&&this.idsIndex.iterMatchingFilters(yt(n),(o=>(o.match(t,e)&&!(null==p?void 0:p(o))&&u.push(o),!0))),!0===s&&!0===r&&0!==i.length&&this.hrefsIndex.iterMatchingFilters(function(e){const t=e.sort();let o=1;for(let e=1;e{return t=e,dt.reset(),Et(t,dt),dt.slice();var t})))),(o=>(o.match(t,e)&&!(null==p?void 0:p(o))&&u.push(o),!0)));const h=[];return 0!==u.length&&this.unhideIndex.iterMatchingFilters(d,(o=>(o.match(t,e)&&!(null==p?void 0:p(o))&&h.push(o),!0))),{filters:u,unhides:h}}getStylesheetsFromFilters({filters:e,extendedFilters:t},{getBaseRules:o,allowGenericHides:i,hidingStyle:n=Mt}){let s=!1===o||!1===i?"":this.getBaseStylesheet(n);0!==e.length&&(0!==s.length&&(s+="\n\n"),s+=Ui(e,n));const c=[];if(0!==t.length){const e=new Map;for(const o of t){const t=o.getSelectorAST();if(void 0!==t){const i=o.isRemove()?void 0:o.getStyleAttributeHash();void 0!==i&&e.set(o.getStyle(n),i),c.push({ast:t,remove:o.isRemove(),attribute:i})}}0!==e.size&&(0!==s.length&&(s+="\n\n"),s+=[...e.entries()].map((([e,t])=>`[${t}] { ${e} }`)).join("\n\n"))}return{stylesheet:s,extended:c}}getGenericRules(e){return null===this.extraGenericRules?this.lazyPopulateGenericRulesCache(e).genericRules:this.extraGenericRules}getBaseStylesheet(e){return null===this.baseStylesheet?this.lazyPopulateGenericRulesCache(e).baseStylesheet:this.baseStylesheet}lazyPopulateGenericRulesCache(e){if(null===this.baseStylesheet||null===this.extraGenericRules){const t=this.unhideIndex.getFilters(),o=new Set;for(const e of t)o.add(e.getSelector());const i=this.genericRules.getFilters(),n=[],s=[];for(const e of i)e.hasCustomStyle()||e.isScriptInject()||e.hasHostnameConstraint()||o.has(e.getSelector())?s.push(e):n.push(e);this.baseStylesheet=Ui(n,e),this.extraGenericRules=s}return{baseStylesheet:this.baseStylesheet,genericRules:this.extraGenericRules}}},ji=class e{static deserialize(t,o){const i=new e({config:o});return i.index=Pi.deserialize(t,ko.deserialize,o.enableOptimizations?Ii:Si,o),i.badFilters=zi.deserialize(t,ko.deserialize,o),i}constructor({filters:e=[],config:t}){this.index=new Pi({config:t,deserialize:ko.deserialize,filters:[],optimize:t.enableOptimizations?Ii:Si}),this.badFiltersIds=null,this.badFilters=new zi({config:t,deserialize:ko.deserialize,filters:[]}),0!==e.length&&this.update(e,void 0)}getFilters(){return[].concat(this.badFilters.getFilters(),this.index.getFilters())}update(e,t){const o=[],i=[];for(const t of e)t.isBadFilter()?o.push(t):i.push(t);this.badFilters.update(o,t),this.index.update(i,t),this.badFiltersIds=null}getSerializedSize(){return this.badFilters.getSerializedSize()+this.index.getSerializedSize()}serialize(e){this.index.serialize(e),this.badFilters.serialize(e)}matchAll(e,t){const o=[];return this.index.iterMatchingFilters(e.getTokens(),(i=>(i.match(e)&&!1===this.isFilterDisabled(i)&&!(null==t?void 0:t(i))&&o.push(i),!0))),o}match(e,t){let o;return this.index.iterMatchingFilters(e.getTokens(),(i=>!(i.match(e)&&!1===this.isFilterDisabled(i)&&!(null==t?void 0:t(i)))||(o=i,!1))),o}isFilterDisabled(e){if(null===this.badFiltersIds){const e=this.badFilters.getFilters();if(0===e.length)return!1;const t=new Set;for(const o of e)t.add(o.getIdWithoutBadFilter());this.badFiltersIds=t}return this.badFiltersIds.has(e.getId())}},Mi=class e{static deserialize(t,o){const i=new e({config:o});return i.networkIndex=Pi.deserialize(t,ko.deserialize,o.enableOptimizations?Ii:Si,o),i.exceptionsIndex=Pi.deserialize(t,ko.deserialize,o.enableOptimizations?Ii:Si,o),i.cosmeticIndex=Pi.deserialize(t,Xt.deserialize,Ei,o),i.unhideIndex=Pi.deserialize(t,Xt.deserialize,Ei,o),i}constructor({filters:e=[],config:t}){this.config=t,this.networkIndex=new Pi({config:t,deserialize:ko.deserialize,filters:[],optimize:t.enableOptimizations?Ii:Si}),this.exceptionsIndex=new Pi({config:t,deserialize:ko.deserialize,filters:[],optimize:t.enableOptimizations?Ii:Si}),this.cosmeticIndex=new Pi({config:t,deserialize:Xt.deserialize,filters:[],optimize:Ei}),this.unhideIndex=new Pi({config:t,deserialize:Xt.deserialize,filters:[],optimize:Ei}),0!==e.length&&this.update(e,void 0)}update(e,t){const o=[],i=[],n=[],s=[];for(const t of e)t.isNetworkFilter()?t.isException()?i.push(t):o.push(t):t.isCosmeticFilter()&&(t.isUnhide()?s.push(t):n.push(t));this.networkIndex.update(o,t),this.exceptionsIndex.update(i,t),this.cosmeticIndex.update(n,t),this.unhideIndex.update(s,t)}serialize(e){this.networkIndex.serialize(e),this.exceptionsIndex.serialize(e),this.cosmeticIndex.serialize(e),this.unhideIndex.serialize(e)}getSerializedSize(){return this.networkIndex.getSerializedSize()+this.exceptionsIndex.getSerializedSize()+this.cosmeticIndex.getSerializedSize()+this.unhideIndex.getSerializedSize()}getHTMLFilters(e,t){const o=[],i=[],n=[],s=[];if(!0===this.config.loadNetworkFilters&&this.networkIndex.iterMatchingFilters(e.getTokens(),(i=>(i.match(e)&&!(null==t?void 0:t(i))&&o.push(i),!0))),0!==o.length&&this.exceptionsIndex.iterMatchingFilters(e.getTokens(),(o=>(o.match(e)&&!(null==t?void 0:t(o))&&n.push(o),!0))),!0===this.config.loadCosmeticFilters&&e.isMainFrame()){const{hostname:o,domain:n=""}=e,c=Ni(o,n);this.cosmeticIndex.iterMatchingFilters(c,(e=>(e.match(o,n)&&!(null==t?void 0:t(e))&&i.push(e),!0))),0!==i.length&&this.unhideIndex.iterMatchingFilters(c,(e=>(e.match(o,n)&&!(null==t?void 0:t(e))&&s.push(e),!0)))}return{networkFilters:o,cosmeticFilters:i,unhides:s,exceptions:n}}getFilters(){return[].concat(this.networkIndex.getFilters(),this.exceptionsIndex.getFilters(),this.cosmeticIndex.getFilters(),this.unhideIndex.getFilters())}},Di=Number.MAX_SAFE_INTEGER>>>0,Hi=class e{static deserialize(t,o){const i=t.getUint32(),n=t.getUint32(),s=t.getUint32(),c=me.fromUint8Array(t.getBytes(!0),{enableCompression:!1}),r=c.getUint32ArrayView(i),a=c.getUint32ArrayView(n),l=c.pos;return c.seekZero(),new e({deserialize:o,values:[],getKeys:()=>[],getSerializedSize:()=>0,serialize:()=>{}}).updateInternals({bucketsIndex:a,valuesIndexStart:l,numberOfValues:s,tokensLookupIndex:r,view:c})}constructor({serialize:e,deserialize:t,getKeys:o,getSerializedSize:i,values:n}){if(this.cache=new Map,this.bucketsIndex=ne,this.tokensLookupIndex=ne,this.valuesIndexStart=0,this.numberOfValues=0,this.view=me.empty({enableCompression:!1}),this.deserializeValue=t,0!==n.length){const t=[];let s=0,c=0;for(const e of n)c+=i(e);if(0===n.length)return void this.updateInternals({bucketsIndex:ne,valuesIndexStart:0,numberOfValues:0,tokensLookupIndex:ne,view:me.empty({enableCompression:!1})});for(const e of n){const i=o(e);t.push(i),s+=2*i.length}c+=4*s;const r=Math.max(2,Fi(n.length)),a=r-1,l=[];for(let e=0;e[qi(e)],serialize:$i,deserialize:Ki,values:e})}function Yi(e){if(null===e)return!1;if("object"!=typeof e)return!1;const{key:t,name:o,description:i,country:n,website_url:s,privacy_policy_url:c,privacy_contact:r,ghostery_id:a}=e;return"string"==typeof t&&("string"==typeof o&&((null===i||"string"==typeof i)&&((null===n||"string"==typeof n)&&((null===s||"string"==typeof s)&&((null===c||"string"==typeof c)&&((null===r||"string"==typeof r)&&(null===a||"string"==typeof a)))))))}function Xi(e){return bt(e.key)}function Zi(e){return de(e.key)+de(e.name)+de(e.description||"")+de(e.website_url||"")+de(e.country||"")+de(e.privacy_policy_url||"")+de(e.privacy_contact||"")+de(e.ghostery_id||"")}function Ji(e,t){t.pushUTF8(e.key),t.pushUTF8(e.name),t.pushUTF8(e.description||""),t.pushUTF8(e.website_url||""),t.pushUTF8(e.country||""),t.pushUTF8(e.privacy_policy_url||""),t.pushUTF8(e.privacy_contact||""),t.pushUTF8(e.ghostery_id||"")}function en(e){return{key:e.getUTF8(),name:e.getUTF8(),description:e.getUTF8()||null,website_url:e.getUTF8()||null,country:e.getUTF8()||null,privacy_policy_url:e.getUTF8()||null,privacy_contact:e.getUTF8()||null,ghostery_id:e.getUTF8()||null}}function tn(e){return new Hi({getSerializedSize:Zi,getKeys:e=>[Xi(e)],serialize:Ji,deserialize:en,values:e})}function on(e){if(null===e)return!1;if("object"!=typeof e)return!1;const{key:t,name:o,category:i,organization:n,alias:s,website_url:c,domains:r,filters:a}=e;return"string"==typeof t&&("string"==typeof o&&("string"==typeof i&&((null===n||"string"==typeof n)&&(("string"==typeof s||null===s)&&((null===c||"string"==typeof c)&&(!(!Array.isArray(r)||!r.every((e=>"string"==typeof e)))&&!(!Array.isArray(a)||!a.every((e=>"string"==typeof e)))))))))}function nn(e){const t=[];for(const o of e.filters){const e=ko.parse(o);null!==e&&t.push(e.getId())}for(const o of e.domains){const e=ko.parse(`||${o}^`);null!==e&&t.push(e.getId())}return[...new Set(t)]}function sn(e){let t=re(e.domains.length);for(const o of e.domains)t+=de(o);let o=re(e.filters.length);for(const t of e.filters)o+=de(t);return de(e.key)+de(e.name)+de(e.category)+de(e.organization||"")+de(e.alias||"")+de(e.website_url||"")+de(e.ghostery_id||"")+t+o}function cn(e,t){t.pushUTF8(e.key),t.pushUTF8(e.name),t.pushUTF8(e.category),t.pushUTF8(e.organization||""),t.pushUTF8(e.alias||""),t.pushUTF8(e.website_url||""),t.pushUTF8(e.ghostery_id||""),t.pushLength(e.domains.length);for(const o of e.domains)t.pushUTF8(o);t.pushLength(e.filters.length);for(const o of e.filters)t.pushUTF8(o)}function rn(e){const t=e.getUTF8(),o=e.getUTF8(),i=e.getUTF8(),n=e.getUTF8()||null,s=e.getUTF8()||null,c=e.getUTF8()||null,r=e.getUTF8()||null,a=e.getLength(),l=[];for(let t=0;t=2;t.shift()){const e=t.join("."),o=ko.parse(`||${e}^`);if(null===o)continue;const i=this.fromId(o.getId());if(i.length>0)return i}return[]}fromId(e){var t,o;const i=[];for(const n of this.patterns.get(e))i.push({pattern:n,category:null===(t=this.categories.get(qi({key:n.category})))||void 0===t?void 0:t[0],organization:null!==n.organization?null===(o=this.organizations.get(Xi({key:n.organization})))||void 0===o?void 0:o[0]:null});return i}},pn=class{static deserialize(e){const t=new Set;for(let o=0,i=e.getUint32();ot.condition===e.condition));if(t)for(const o of e.filterIDs)t.filterIDs.delete(o)}if(e)for(const t of e){const e=this.preprocessors.find((e=>e.condition===t.condition));if(e)for(const o of t.filterIDs)e.filterIDs.add(o);else this.preprocessors.push(t)}(t&&0!==t.length||e&&0!==e.length)&&this.updateEnv(o)}serialize(e){e.pushUint32(this.excluded.size);for(const t of this.excluded)e.pushUint32(t);e.pushUint32(this.preprocessors.length);for(const t of this.preprocessors)t.serialize(e)}getSerializedSize(){let e=4*(1+this.excluded.size);e+=4;for(const t of this.preprocessors)e+=t.getSerializedSize();return e}};function dn(e){if(0===e.length)return!1;let t,o=0;for(const i of e){const e=(i.isImportant()?4:0)|(i.isException()?1:2);e>=o&&(o=e,t=i)}return void 0!==t&&t.isException()}var un=class extends ye{static fromCached(e,t){if(void 0===t)return e();const{path:o,read:i,write:n}=t;return i(o).then((e=>this.deserialize(e))).catch((()=>e().then((e=>n(o,e.serialize()).then((()=>e))))))}static empty(e={}){return new this({config:e})}static fromLists(e,t,o={},i){return this.fromCached((()=>{const i=function(e,t){return Promise.all(t.map((t=>we(e,t))))}(e,t),n=function(e){return we(e,`${ve}/ublock-origin/resources.json`)}(e);return Promise.all([i,n]).then((([e,t])=>{const i=this.parse(e.join("\n"),o);return void 0!==t&&i.updateResources(t,""+t.length),i}))}),i)}static fromPrebuiltAdsOnly(e=fetch,t){return this.fromLists(e,_e,{},t)}static fromPrebuiltAdsAndTracking(e=fetch,t){return this.fromLists(e,Ce,{},t)}static fromPrebuiltFull(e=fetch,t){return this.fromLists(e,xe,{},t)}static fromTrackerDB(e,t={}){const o=new Ae(t),i=new ln(e),n=[];for(const e of i.getPatterns())n.push(...e.filters);const s=this.parse(n.join("\n"),o);return s.metadata=i,s}static merge(e,{skipResources:t=!1}={}){if(!e||e.length<2)throw new Error("merging engines requires at least two engines");const o=e[0].config,i=new Map,n=new Map,s=new Map,c=[],r={organizations:{},categories:{},patterns:{}},a=[],l=Object.keys(o).filter((function(e){return"boolean"==typeof o[e]&&!a.includes(e)}));for(const t of e){for(const e of l)if(o[e]!==t.config[e])throw new Error(`config "${e}" of all merged engines must be the same`);const e=t.getFilters();for(const t of e.networkFilters)n.set(t.getId(),t);for(const t of e.cosmeticFilters)s.set(t.getId(),t);for(const e of t.preprocessors.preprocessors)c.push(e);for(const[e,o]of t.lists)i.has(e)||i.set(e,o);if(void 0!==t.metadata){for(const e of t.metadata.organizations.getValues())void 0===r.organizations[e.key]&&(r.organizations[e.key]=e);for(const e of t.metadata.categories.getValues())void 0===r.categories[e.key]&&(r.categories[e.key]=e);for(const e of t.metadata.patterns.getValues())void 0===r.patterns[e.key]&&(r.patterns[e.key]=e)}}const p=new this({networkFilters:Array.from(n.values()),cosmeticFilters:Array.from(s.values()),preprocessors:c,lists:i,config:o});if(Object.keys(r.categories).length+Object.keys(r.organizations).length+Object.keys(r.patterns).length!==0&&(p.metadata=new ln(r)),!0!==t){for(const t of e.slice(1))if(t.resources.checksum!==e[0].resources.checksum)throw new Error(`resource checksum of all merged engines must match with the first one: "${e[0].resources.checksum}" but got: "${t.resources.checksum}"`);p.resources=bi.copy(e[0].resources)}return p}static parse(e,t={}){const o=new Ae(t);return new this({...zo(e,o),config:o})}static deserialize(e){const t=me.fromUint8Array(e,{enableCompression:!1}),o=t.getUint16();if(699!==o)throw new Error(`serialized engine version mismatch, expected 699 but got ${o}`);const i=Ae.deserialize(t);if(i.enableCompression&&t.enableCompression(),i.integrityCheck){const o=t.pos;t.pos=e.length-4;const i=t.checksum(),n=t.getUint32();if(i!==n)throw new Error(`serialized engine checksum mismatch, expected ${n} but got ${i}`);t.pos=o}const n=new this({config:i});n.resources=bi.deserialize(t);const s=new Map,c=t.getUint16();for(let e=0;ee.getId()))).concat(o.map((e=>e.getId()))));l.push(new Po({condition:e,filterIDs:n}))}if(void 0!==t.added&&0!==t.added.length){const{networkFilters:o,cosmeticFilters:i}=zo(t.added.join("\n"),this.config),n=new Set([].concat(i.map((e=>e.getId()))).concat(o.map((e=>e.getId()))));c.push(new Po({condition:e,filterIDs:n}))}}return this.update({newCosmeticFilters:n,newNetworkFilters:s,newPreprocessors:c,removedCosmeticFilters:r.map((e=>e.getId())),removedNetworkFilters:a.map((e=>e.getId())),removedPreprocessors:l},i)}getHtmlFilters(e){const t=[];if(!1===this.config.enableHtmlFiltering)return t;const{networkFilters:o,exceptions:i,cosmeticFilters:n,unhides:s}=this.htmlFilters.getHTMLFilters(e,this.isFilterExcluded.bind(this));if(0!==n.length){const o=new Map(s.map((e=>[e.getSelector(),e])));for(const i of n){const n=i.getExtendedSelector();if(void 0===n)continue;const s=o.get(i.getSelector());void 0===s&&t.push(n),this.emit("filter-matched",{filter:i,exception:s},{request:e,filterType:Co.COSMETIC})}}if(0!==o.length){const n=new Map;let s;for(const e of i){const t=e.optionValue;if(""===t){s=e;break}n.set(t,e)}for(const i of o){const o=i.getHtmlModifier();if(null===o)continue;const c=s||n.get(i.optionValue);this.emit("filter-matched",{filter:i,exception:c},{request:e,filterType:Co.NETWORK}),void 0===c&&t.push(["replace",o])}}return 0!==t.length&&this.emit("html-filtered",t,e.url),t}getCosmeticsFilters({url:e,hostname:t,domain:o,classes:i,hrefs:n,ids:s,getBaseRules:c=!0,getInjectionRules:r=!0,getExtendedRules:a=!0,getRulesFromDOM:l=!0,getRulesFromHostname:p=!0,hidingStyle:d,callerContext:u}){if(!1===this.config.loadCosmeticFilters)return{active:!1,extended:[],scripts:[],styles:""};o||(o="");let h=!0,m=!0;const A=this.hideExceptions.matchAll(Ut.fromRawDetails({domain:o,hostname:t,url:e,sourceDomain:"",sourceHostname:"",sourceUrl:""}),this.isFilterExcluded.bind(this)),g=[],f=[];for(const e of A){if(e.isElemHide()){h=!1,m=!1;break}e.isSpecificHide()?f.push(e):e.isGenericHide()&&g.push(e)}!0===h&&(h=!1===dn(g)),!0===m&&(m=!1===dn(f));const{filters:k,unhides:b}=this.cosmetics.getCosmeticsFilters({domain:o,hostname:t,classes:i,hrefs:n,ids:s,allowGenericHides:h,allowSpecificHides:m,getRulesFromDOM:l,getRulesFromHostname:p,hidingStyle:d,isFilterExcluded:this.isFilterExcluded.bind(this)});let y=!1;const w=new Map;for(const e of b)!0===e.isScriptInject()&&!0===e.isUnhide()&&0===e.getSelector().length&&(y=!0),w.set(Yt(e,this.resources.getScriptletCanonicalName.bind(this.resources)),e);const v=[],_=[],C=[];if(0!==k.length)for(const t of k){const o=w.get(Yt(t,this.resources.getScriptletCanonicalName.bind(this.resources)));if(void 0!==o)continue;let i=!1;!0===t.isScriptInject()?!0===r&&!1===y&&(v.push(t),i=!0):t.isExtended()?!0===a&&(C.push(t),i=!0):(_.push(t),i=!0),i&&this.emit("filter-matched",{filter:t,exception:o},{url:e,callerContext:u,filterType:Co.COSMETIC})}const x=[];for(const t of v){const o=t.getScript(this.resources.getScriptlet.bind(this.resources));void 0!==o&&(this.emit("script-injected",o,e),x.push(o))}const{stylesheet:S,extended:E}=this.cosmetics.getStylesheetsFromFilters({filters:_,extendedFilters:C},{getBaseRules:c,allowGenericHides:h,hidingStyle:d});return 0!==S.length&&this.emit("style-injected",S,e),{active:!0,extended:E,scripts:x,styles:S}}matchAll(e){const t=[];return e.isSupported&&(Array.prototype.push.apply(t,this.importants.matchAll(e,this.isFilterExcluded.bind(this))),Array.prototype.push.apply(t,this.filters.matchAll(e,this.isFilterExcluded.bind(this))),Array.prototype.push.apply(t,this.exceptions.matchAll(e,this.isFilterExcluded.bind(this))),Array.prototype.push.apply(t,this.csp.matchAll(e,this.isFilterExcluded.bind(this))),Array.prototype.push.apply(t,this.hideExceptions.matchAll(e,this.isFilterExcluded.bind(this))),Array.prototype.push.apply(t,this.redirects.matchAll(e,this.isFilterExcluded.bind(this)))),new Set(t)}getCSPDirectives(e){if(!this.config.loadNetworkFilters)return;if(!0!==e.isSupported||!1===e.isMainFrame())return;const t=this.csp.matchAll(e,this.isFilterExcluded.bind(this));if(0===t.length)return;const o=new Map,i=[];for(const n of t)if(n.isException()){if(void 0===n.csp)return void this.emit("filter-matched",{exception:n},{request:e,filterType:Co.NETWORK});o.set(n.csp,n)}else i.push(n);if(0===i.length)return;const n=new Set;for(const t of i.values()){const i=o.get(t.csp);void 0===i&&n.add(t.csp),this.emit("filter-matched",{filter:t,exception:i},{request:e,filterType:Co.NETWORK})}const s=Array.from(n).join("; ");return s.length>0&&this.emit("csp-injected",e,s),s}match(e,t=!1){const o={exception:void 0,filter:void 0,match:!1,redirect:void 0,metadata:void 0};if(!this.config.loadNetworkFilters)return o;if(e.isSupported){let t,i;if(o.filter=this.importants.match(e,this.isFilterExcluded.bind(this)),void 0===o.filter){const n=this.redirects.matchAll(e,this.isFilterExcluded.bind(this)).sort(((e,t)=>t.getRedirectPriority()-e.getRedirectPriority()));if(0!==n.length)for(const e of n)"none"===e.getRedirectResource()?t=e:e.isRedirectRule()?void 0===i&&(i=e):void 0===o.filter&&(o.filter=e);void 0===o.filter&&(o.filter=this.filters.match(e,this.isFilterExcluded.bind(this)),void 0!==i&&void 0!==o.filter&&(o.filter=i)),void 0!==o.filter&&(o.exception=this.exceptions.match(e,this.isFilterExcluded.bind(this)))}void 0!==o.filter&&void 0===o.exception&&o.filter.isRedirect()&&(void 0!==t?o.exception=t:o.redirect=this.resources.getResource(o.filter.getRedirectResource()))}return o.match=void 0===o.exception&&void 0!==o.filter,o.filter&&this.emit("filter-matched",{filter:o.filter,exception:o.exception},{request:e,filterType:Co.NETWORK}),void 0!==o.exception?this.emit("request-whitelisted",e,o):void 0!==o.redirect?this.emit("request-redirected",e,o):void 0!==o.filter?this.emit("request-blocked",e,o):this.emit("request-allowed",e,o),!0===t&&void 0!==o.filter&&this.metadata&&(o.metadata=this.metadata.fromFilter(o.filter)),o}getPatternMetadata(e,{getDomainMetadata:t=!1}={}){if(void 0===this.metadata)return[];const o=new Set,i=[];for(const t of this.matchAll(e))for(const e of this.metadata.fromFilter(t))o.has(e.pattern.key)||(o.add(e.pattern.key),i.push(e));if(t)for(const t of this.metadata.fromDomain(e.hostname))o.has(t.pattern.key)||(o.add(t.pattern.key),i.push(t));return i}blockScripts(){return this.updateFromDiff({added:[Jt().scripts().redirectTo("javascript").toString()]}),this}blockImages(){return this.updateFromDiff({added:[Jt().images().redirectTo("png").toString()]}),this}blockMedias(){return this.updateFromDiff({added:[Jt().medias().redirectTo("mp4").toString()]}),this}blockFrames(){return this.updateFromDiff({added:[Jt().frames().redirectTo("html").toString()]}),this}blockFonts(){return this.updateFromDiff({added:[Jt().fonts().toString()]}),this}blockStyles(){return this.updateFromDiff({added:[Jt().styles().toString()]}),this}};function hn(e){const t=new Set(["br","head","link","meta","script","style","s"]),o=new Set,i=new Set,n=new Set,s=new Set;for(const c of e)for(const e of[c,...c.querySelectorAll("[id]:not(html):not(body),[class]:not(html):not(body),[href]:not(html):not(body)")]){if(s.has(e))continue;if(s.add(e),t.has(e.nodeName.toLowerCase()))continue;const c=e.getAttribute("id");"string"==typeof c&&n.add(c);const r=e.classList;for(const e of r)o.add(e);const a=e.getAttribute("href");"string"==typeof a&&i.add(a)}return{classes:Array.from(o),hrefs:Array.from(i),ids:Array.from(n)}}function mn(e){try{const t=pt(location.href),o=t.hostname||"",i=t.domain||"";return e.getCosmeticsFilters({url:location.href,hostname:o,domain:i,...hn([document.documentElement]),getBaseRules:!0,getInjectionRules:!1,getExtendedRules:!0,getRulesFromDOM:!0,getRulesFromHostname:!0,hidingStyle:A("opacity")}).styles}catch(e){return console.error("Error getting cosmetic rules",e),""}}function An(e){if(e){return e.replace(/\s*{[^\\}]*}\s*/g,",").replace(/,$/,"")}return""}var gn=new Uint8Array([]);var fn=[{name:"192.com",detectCmp:[{exists:".ont-cookies"}],detectPopup:[{visible:".ont-cookies"}],optIn:[{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-ok2"}],optOut:[{click:".ont-cookes-btn-manage"},{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-choose"}],test:[{eval:"EVAL_ONENINETWO_0"}]},{name:"1password-com",cosmetic:!0,prehideSelectors:['footer #footer-root [aria-label="Cookie Consent"]'],detectCmp:[{exists:'footer #footer-root [aria-label="Cookie Consent"]'}],detectPopup:[{visible:'footer #footer-root [aria-label="Cookie Consent"]'}],optIn:[{click:'footer #footer-root [aria-label="Cookie Consent"] button'}],optOut:[{hide:'footer #footer-root [aria-label="Cookie Consent"]'}]},{name:"aa",vendorUrl:"https://aa.com",prehideSelectors:[],cosmetic:!0,detectCmp:[{exists:"#aa_optoutmulti-Modal,#cookieBannerMessage"}],detectPopup:[{visible:"#aa_optoutmulti-Modal,#cookieBannerMessage"}],optIn:[{hide:"#aa_optoutmulti-Modal,#cookieBannerMessage"},{waitForThenClick:"#aa_optoutmulti_checkBox"},{waitForThenClick:"#aa_optoutmulti-Modal button.optoutmulti_button"}],optOut:[{hide:"#aa_optoutmulti-Modal,#cookieBannerMessage"}]},{name:"abc",vendorUrl:"https://abc.net.au",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?abc\\.net\\.au/"},prehideSelectors:[],detectCmp:[{exists:"[data-component=CookieBanner]"}],detectPopup:[{visible:"[data-component=CookieBanner] [data-component=CookieBanner_AcceptAll]"}],optIn:[{waitForThenClick:"[data-component=CookieBanner] [data-component=CookieBanner_AcceptAll]"}],optOut:[{waitForThenClick:"[data-component=CookieBanner] [data-component=CookieBanner_AcceptABCRequired]"}],test:[{eval:"EVAL_ABC_TEST"}]},{name:"abconcerts.be",vendorUrl:"https://unknown",intermediate:!1,prehideSelectors:["dialog.cookie-consent"],detectCmp:[{exists:"dialog.cookie-consent form.cookie-consent__form"}],detectPopup:[{visible:"dialog.cookie-consent form.cookie-consent__form"}],optIn:[{waitForThenClick:"dialog.cookie-consent form.cookie-consent__form button[value=yes]"}],optOut:[{if:{exists:"dialog.cookie-consent form.cookie-consent__form button[value=no]"},then:[{click:"dialog.cookie-consent form.cookie-consent__form button[value=no]"}],else:[{click:"dialog.cookie-consent form.cookie-consent__form button.cookie-consent__options-toggle"},{waitForThenClick:'dialog.cookie-consent form.cookie-consent__form button[value="save_options"]'}]}]},{name:"acris",prehideSelectors:["div.acris-cookie-consent"],detectCmp:[{exists:"[data-acris-cookie-consent]"}],detectPopup:[{visible:".acris-cookie-consent.is--modal"}],optIn:[{waitForVisible:"#ccConsentAcceptAllButton",check:"any"},{wait:500},{waitForThenClick:"#ccConsentAcceptAllButton"}],optOut:[{waitForVisible:"#ccAcceptOnlyFunctional",check:"any"},{wait:500},{waitForThenClick:"#ccAcceptOnlyFunctional"}]},{name:"activobank.pt",runContext:{urlPattern:"^https://(www\\.)?activobank\\.pt"},prehideSelectors:["aside#cookies,.overlay-cookies"],detectCmp:[{exists:"#cookies .cookies-btn"}],detectPopup:[{visible:"#cookies #submitCookies"}],optIn:[{waitForThenClick:"#cookies #submitCookies"}],optOut:[{waitForThenClick:"#cookies #rejectCookies"}]},{name:"Adroll",prehideSelectors:["#adroll_consent_container"],detectCmp:[{exists:"#adroll_consent_container"}],detectPopup:[{visible:"#adroll_consent_container"}],optIn:[{waitForThenClick:"#adroll_consent_accept"}],optOut:[{waitForThenClick:"#adroll_consent_reject"}],test:[{eval:"EVAL_ADROLL_0"}]},{name:"affinity.serif.com",detectCmp:[{exists:".c-cookie-banner button[data-qa='allow-all-cookies']"}],detectPopup:[{visible:".c-cookie-banner"}],optIn:[{click:'button[data-qa="allow-all-cookies"]'}],optOut:[{click:'button[data-qa="manage-cookies"]'},{waitFor:'.c-cookie-banner ~ [role="dialog"]'},{waitForThenClick:'.c-cookie-banner ~ [role="dialog"] input[type="checkbox"][value="true"]',all:!0},{click:'.c-cookie-banner ~ [role="dialog"] .c-modal__action button'}],test:[{wait:500},{eval:"EVAL_AFFINITY_SERIF_COM_0"}]},{name:"agolde.com",cosmetic:!0,prehideSelectors:["#modal-1 div[data-micromodal-close]"],detectCmp:[{exists:"#modal-1 div[aria-labelledby=modal-1-title]"}],detectPopup:[{exists:"#modal-1 div[data-micromodal-close]"}],optIn:[{click:'button[aria-label="Close modal"]'}],optOut:[{hide:"#modal-1 div[data-micromodal-close]"}]},{name:"aliexpress",vendorUrl:"https://aliexpress.com/",runContext:{urlPattern:"^https://.*\\.aliexpress\\.com/"},prehideSelectors:["#gdpr-new-container"],detectCmp:[{exists:"#gdpr-new-container,#voyager-gdpr > div"}],detectPopup:[{visible:"#gdpr-new-container,#voyager-gdpr > div"}],optIn:[{waitForThenClick:"#gdpr-new-container .btn-accept,#voyager-gdpr > div > div > button:nth-child(1)"}],optOut:[{if:{exists:"#voyager-gdpr > div"},then:[{waitForThenClick:"#voyager-gdpr > div > div > button:nth-child(2)"}],else:[{waitForThenClick:"#gdpr-new-container .btn-more"},{waitFor:"#gdpr-new-container .gdpr-dialog-switcher"},{click:"#gdpr-new-container .switcher-on",all:!0,optional:!0},{click:"#gdpr-new-container .btn-save"}]}]},{name:"almacmp",prehideSelectors:["#alma-cmpv2-container"],detectCmp:[{exists:"#alma-cmpv2-container"}],detectPopup:[{visible:"#alma-cmpv2-container #almacmp-modal-layer1"}],optIn:[{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer1 #almacmp-modalConfirmBtn"}],optOut:[{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer1 #almacmp-modalSettingBtn"},{waitFor:"#alma-cmpv2-container #almacmp-modal-layer2"},{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer2 #almacmp-reject-all-layer2"}],test:[{eval:"EVAL_ALMACMP_0"}]},{name:"altium.com",cosmetic:!0,prehideSelectors:[".altium-privacy-bar"],detectCmp:[{exists:".altium-privacy-bar"}],detectPopup:[{exists:".altium-privacy-bar"}],optIn:[{click:"a.altium-privacy-bar__btn"}],optOut:[{hide:".altium-privacy-bar"}]},{name:"amazon.com",prehideSelectors:['span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'],detectCmp:[{exists:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],detectPopup:[{visible:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],optIn:[{waitForVisible:"#sp-cc-accept"},{wait:500},{click:"#sp-cc-accept"}],optOut:[{waitForVisible:"#sp-cc-rejectall-link"},{wait:500},{click:"#sp-cc-rejectall-link"}]},{name:"amex",vendorUrl:"https://www.americanexpress.com/",cosmetic:!1,prehideSelectors:["#user-consent-management-granular-banner-overlay"],detectCmp:[{exists:"#user-consent-management-granular-banner-overlay"}],detectPopup:[{visible:"#user-consent-management-granular-banner-overlay"}],optIn:[{waitForThenClick:"[data-testid=granular-banner-button-accept-all]"}],optOut:[{waitForThenClick:"[data-testid=granular-banner-button-decline-all]"}]},{name:"aquasana.com",prehideSelectors:["#consent-tracking"],detectCmp:[{exists:"#consent-tracking"}],detectPopup:[{exists:"#consent-tracking"}],optIn:[{waitForThenClick:"#consent-tracking .affirm.btn"}],optOut:[{if:{exists:"#consent-tracking .decline.btn"},then:[{click:"#consent-tracking .decline.btn"}],else:[{hide:"#consent-tracking"}]}]},{name:"arbeitsagentur",vendorUrl:"https://www.arbeitsagentur.de/",prehideSelectors:[".modal-open bahf-cookie-disclaimer-dpl3"],detectCmp:[{exists:"bahf-cookie-disclaimer-dpl3"}],detectPopup:[{visible:"bahf-cookie-disclaimer-dpl3"}],optIn:[{waitForThenClick:["bahf-cookie-disclaimer-dpl3","#bahf-cookie-disclaimer-modal .ba-btn-primary"]}],optOut:[{waitForThenClick:["bahf-cookie-disclaimer-dpl3","#bahf-cookie-disclaimer-modal .ba-btn-contrast"]}],test:[{eval:"EVAL_ARBEITSAGENTUR_TEST"}]},{name:"asus",vendorUrl:"https://www.asus.com/",runContext:{urlPattern:"^https://www\\.asus\\.com/"},prehideSelectors:["#cookie-policy-info,#cookie-policy-info-bg"],detectCmp:[{exists:"#cookie-policy-info"}],detectPopup:[{visible:"#cookie-policy-info"}],optIn:[{waitForThenClick:'#cookie-policy-info [data-agree="Accept Cookies"]'}],optOut:[{if:{exists:"#cookie-policy-info .btn-reject"},then:[{waitForThenClick:"#cookie-policy-info .btn-reject"}],else:[{waitForThenClick:"#cookie-policy-info .btn-setting"},{waitForThenClick:'#cookie-policy-lightbox-wrapper [data-agree="Save Settings"]'}]}]},{name:"athlinks-com",runContext:{urlPattern:"^https://(www\\.)?athlinks\\.com/"},cosmetic:!0,prehideSelectors:["#footer-container ~ div"],detectCmp:[{exists:"#footer-container ~ div"}],detectPopup:[{visible:"#footer-container > div"}],optIn:[{click:"#footer-container ~ div button"}],optOut:[{hide:"#footer-container ~ div"}]},{name:"ausopen.com",cosmetic:!0,detectCmp:[{exists:".gdpr-popup__message"}],detectPopup:[{visible:".gdpr-popup__message"}],optOut:[{hide:".gdpr-popup__message"}],optIn:[{click:".gdpr-popup__message button"}]},{name:"automattic-cmp-optout",prehideSelectors:['form[class*="cookie-banner"][method="post"]'],detectCmp:[{exists:'form[class*="cookie-banner"][method="post"]'}],detectPopup:[{visible:'form[class*="cookie-banner"][method="post"]'}],optIn:[{click:'a[class*="accept-all-button"]'}],optOut:[{click:'form[class*="cookie-banner"] div[class*="simple-options"] a[class*="customize-button"]'},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:'a[class*="accept-selection-button"]'}]},{name:"aws.amazon.com",prehideSelectors:["#awsccc-cb-content","#awsccc-cs-container","#awsccc-cs-modalOverlay","#awsccc-cs-container-inner"],detectCmp:[{exists:"#awsccc-cb-content"}],detectPopup:[{visible:"#awsccc-cb-content"}],optIn:[{click:"button[data-id=awsccc-cb-btn-accept"}],optOut:[{click:"button[data-id=awsccc-cb-btn-customize]"},{waitFor:"input[aria-checked]"},{click:"input[aria-checked=true]",all:!0,optional:!0},{click:"button[data-id=awsccc-cs-btn-save]"}]},{name:"axeptio",prehideSelectors:[".axeptio_widget"],detectCmp:[{exists:".axeptio_widget"}],detectPopup:[{visible:".axeptio_widget"}],optIn:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_acceptAll"}],optOut:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_dismiss"}],test:[{eval:"EVAL_AXEPTIO_0"}]},{name:"baden-wuerttemberg.de",prehideSelectors:[".cookie-alert.t-dark"],cosmetic:!0,detectCmp:[{exists:".cookie-alert.t-dark"}],detectPopup:[{visible:".cookie-alert.t-dark"}],optIn:[{click:".cookie-alert__form input:not([disabled]):not([checked])"},{click:".cookie-alert__button button"}],optOut:[{hide:".cookie-alert.t-dark"}]},{name:"bahn-de",vendorUrl:"https://www.bahn.de/",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?bahn\\.de/"},intermediate:!1,prehideSelectors:[],detectCmp:[{exists:["body > div:first-child","#consent-layer"]}],detectPopup:[{visible:["body > div:first-child","#consent-layer"]}],optIn:[{waitForThenClick:["body > div:first-child","#consent-layer .js-accept-all-cookies"]}],optOut:[{waitForThenClick:["body > div:first-child","#consent-layer .js-accept-essential-cookies"]}],test:[{eval:"EVAL_BAHN_TEST"}]},{name:"bbb.org",runContext:{urlPattern:"^https://www\\.bbb\\.org/"},cosmetic:!0,prehideSelectors:['div[aria-label="use of cookies on bbb.org"]'],detectCmp:[{exists:'div[aria-label="use of cookies on bbb.org"]'}],detectPopup:[{visible:'div[aria-label="use of cookies on bbb.org"]'}],optIn:[{click:'div[aria-label="use of cookies on bbb.org"] button.bds-button-unstyled span.visually-hidden'}],optOut:[{hide:'div[aria-label="use of cookies on bbb.org"]'}]},{name:"bing.com",prehideSelectors:["#bnp_container"],detectCmp:[{exists:"#bnp_cookie_banner"}],detectPopup:[{visible:"#bnp_cookie_banner"},{visible:"#bnp_btn_accept,#bnp_btn_reject"}],optIn:[{waitForThenClick:"#bnp_btn_accept"}],optOut:[{wait:500},{waitForThenClick:"#bnp_btn_reject"}],test:[{eval:"EVAL_BING_0"}]},{name:"blocksy",vendorUrl:"https://creativethemes.com/blocksy/docs/extensions/cookies-consent/",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,prehideSelectors:[".cookie-notification"],detectCmp:[{exists:"#blocksy-ext-cookies-consent-styles-css"}],detectPopup:[{visible:".cookie-notification"}],optIn:[{click:".cookie-notification .ct-cookies-decline-button"}],optOut:[{waitForThenClick:".cookie-notification .ct-cookies-decline-button"}],test:[{eval:"EVAL_BLOCKSY_0"}]},{name:"borlabs",detectCmp:[{exists:"._brlbs-block-content"}],detectPopup:[{visible:"._brlbs-bar-wrap,._brlbs-box-wrap"}],optIn:[{click:"a[data-cookie-accept-all]"}],optOut:[{click:"a[data-cookie-individual]"},{waitForVisible:".cookie-preference"},{click:"input[data-borlabs-cookie-checkbox]:checked",all:!0,optional:!0},{click:"#CookiePrefSave"},{wait:500}],prehideSelectors:["#BorlabsCookieBox"],test:[{eval:"EVAL_BORLABS_0"}]},{name:"bundesregierung.de",prehideSelectors:[".bpa-cookie-banner"],detectCmp:[{exists:".bpa-cookie-banner"}],detectPopup:[{visible:".bpa-cookie-banner .bpa-module-full-hero"}],optIn:[{click:".bpa-accept-all-button"}],optOut:[{wait:500,comment:"click is not immediately recognized"},{waitForThenClick:".bpa-close-button"}],test:[{eval:"EVAL_BUNDESREGIERUNG_DE_0"}]},{name:"burpee.com",cosmetic:!0,prehideSelectors:["#notice-cookie-block"],detectCmp:[{exists:"#notice-cookie-block"}],detectPopup:[{exists:"#html-body #notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{hide:"#html-body #notice-cookie-block, #notice-cookie"}]},{name:"canva.com",prehideSelectors:['div[role="dialog"] a[data-anchor-id="cookie-policy"]'],detectCmp:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],detectPopup:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],optIn:[{click:'div[role="dialog"] button:nth-child(1)'}],optOut:[{if:{exists:'div[role="dialog"] button:nth-child(3)'},then:[{click:'div[role="dialog"] button:nth-child(2)'}],else:[{click:'div[role="dialog"] button:nth-child(2)'},{waitFor:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'},{waitFor:'div[role="dialog"] button[role=switch]'},{click:'div[role="dialog"] button:nth-child(2):not([role])'},{click:'div[role="dialog"] div:last-child button:only-child'}]}],test:[{eval:"EVAL_CANVA_0"}]},{name:"canyon.com",runContext:{urlPattern:"^https://www\\.canyon\\.com/"},prehideSelectors:["div.modal.cookiesModal.is-open"],detectCmp:[{exists:"div.modal.cookiesModal.is-open"}],detectPopup:[{visible:"div.modal.cookiesModal.is-open"}],optIn:[{click:'div.cookiesModal__buttonWrapper > button[data-closecause="close-by-submit"]'}],optOut:[{click:'div.cookiesModal__buttonWrapper > button[data-closecause="close-by-manage-cookies"]'},{waitForThenClick:"button#js-manage-data-privacy-save-button"}]},{name:"cassie",vendorUrl:"https://trustcassie.com",cosmetic:!1,runContext:{main:!0,frame:!1},prehideSelectors:[".cassie-cookie-module"],detectCmp:[{exists:".cassie-pre-banner"}],detectPopup:[{visible:"#cassie_pre_banner_text"}],optIn:[{waitForThenClick:".cassie-accept-all"}],optOut:[{waitForThenClick:".cassie-reject-all"}]},{name:"cc-banner-springer",prehideSelectors:[".cc-banner[data-cc-banner]"],detectCmp:[{exists:".cc-banner[data-cc-banner]"}],detectPopup:[{visible:".cc-banner[data-cc-banner]"}],optIn:[{waitForThenClick:".cc-banner[data-cc-banner] button[data-cc-action=accept]"}],optOut:[{if:{exists:".cc-banner[data-cc-banner] button[data-cc-action=reject]"},then:[{click:".cc-banner[data-cc-banner] button[data-cc-action=reject]"}],else:[{waitForThenClick:".cc-banner[data-cc-banner] button[data-cc-action=preferences]"},{waitFor:".cc-preferences[data-cc-preferences]"},{click:".cc-preferences[data-cc-preferences] input[type=radio][data-cc-action=toggle-category][value=off]",all:!0,optional:!0},{if:{exists:".cc-preferences[data-cc-preferences] button[data-cc-action=reject]"},then:[{click:".cc-preferences[data-cc-preferences] button[data-cc-action=reject]"}],else:[{click:".cc-preferences[data-cc-preferences] button[data-cc-action=save]"}]}]}],test:[{eval:"EVAL_CC_BANNER2_0"}]},{name:"cc_banner",cosmetic:!0,prehideSelectors:[".cc_banner-wrapper"],detectCmp:[{exists:".cc_banner-wrapper"}],detectPopup:[{visible:".cc_banner"}],optIn:[{click:".cc_btn_accept_all"}],optOut:[{hide:".cc_banner-wrapper"}]},{name:"check24-partnerprogramm-de",prehideSelectors:["[data-modal-content]:has([data-toggle-target^='cookie'])"],detectCmp:[{exists:"[data-toggle-target^='cookie']"}],detectPopup:[{visible:"[data-toggle-target^='cookie']",check:"any"}],optIn:[{waitForThenClick:"[data-cookie-accept-all]"}],optOut:[{waitForThenClick:"[data-cookie-dismiss-all]"}]},{name:"ciaopeople.it",prehideSelectors:["#cp-gdpr-choices"],detectCmp:[{exists:"#cp-gdpr-choices"}],detectPopup:[{visible:"#cp-gdpr-choices"}],optIn:[{waitForThenClick:".gdpr-btm__right > button:nth-child(2)"}],optOut:[{waitForThenClick:".gdpr-top-content > button"},{waitFor:".gdpr-top-back"},{waitForThenClick:".gdpr-btm__right > button:nth-child(1)"}],test:[{visible:"#cp-gdpr-choices",check:"none"}]},{vendorUrl:"https://www.civicuk.com/cookie-control/",name:"civic-cookie-control",prehideSelectors:["#ccc-module,#ccc-overlay,#ccc"],detectCmp:[{exists:"#ccc-module,#ccc-notify"}],detectPopup:[{visible:"#ccc"},{visible:"#ccc-module,#ccc-notify"}],optOut:[{if:{exists:"#ccc-notify"},then:[{waitForThenClick:["#ccc #ccc-notify .ccc-notify-buttons","xpath///button[contains(., 'Settings') or contains(., 'Cookie Preferences')]"]},{waitForVisible:"#ccc-module"}]},{if:{exists:"#ccc-reject-settings"},then:[{waitForThenClick:"#ccc-reject-settings"}],else:[{waitForThenClick:"#ccc-dismiss-button"}]}],optIn:[{waitForThenClick:"#ccc-recommended-settings,#ccc-notify-accept"}]},{name:"click.io",prehideSelectors:["#cl-consent"],detectCmp:[{exists:"#cl-consent"}],detectPopup:[{visible:"#cl-consent"}],optIn:[{waitForThenClick:'#cl-consent [data-role="b_agree"]'}],optOut:[{waitFor:'#cl-consent [data-role="b_options"]'},{wait:500},{click:'#cl-consent [data-role="b_options"]'},{waitFor:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]'},{click:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]',all:!0},{click:'[data-role="b_save"]'}],test:[{eval:"EVAL_CLICKIO_0",comment:"TODO: this only checks if we interacted at all"}]},{name:"clinch",intermediate:!1,runContext:{frame:!1,main:!0},prehideSelectors:[".consent-modal[role=dialog]"],detectCmp:[{exists:".consent-modal[role=dialog]"}],detectPopup:[{visible:".consent-modal[role=dialog]"}],optIn:[{click:"#consent_agree"}],optOut:[{if:{exists:"#consent_reject"},then:[{click:"#consent_reject"}],else:[{click:"#manage_cookie_preferences"},{click:"#cookie_consent_preferences input:checked",all:!0,optional:!0},{click:"#consent_save"}]}],test:[{eval:"EVAL_CLINCH_0"}]},{name:"clustrmaps.com",runContext:{urlPattern:"^https://(www\\.)?clustrmaps\\.com/"},cosmetic:!0,prehideSelectors:["#gdpr-cookie-message"],detectCmp:[{exists:"#gdpr-cookie-message"}],detectPopup:[{visible:"#gdpr-cookie-message"}],optIn:[{click:"button#gdpr-cookie-accept"}],optOut:[{hide:"#gdpr-cookie-message"}]},{name:"coinbase",intermediate:!1,runContext:{frame:!0,main:!0,urlPattern:"^https://(www|help)\\.coinbase\\.com"},prehideSelectors:[],detectCmp:[{exists:"div[class^=CookieBannerContent__Container]"}],detectPopup:[{visible:"div[class^=CookieBannerContent__Container]"}],optIn:[{click:"div[class^=CookieBannerContent__CTA] :nth-last-child(1)"}],optOut:[{click:"button[class^=CookieBannerContent__Settings]"},{click:"div[class^=CookiePreferencesModal__CategoryContainer] input:checked",all:!0,optional:!0},{click:"div[class^=CookiePreferencesModal__ButtonContainer] > button"}],test:[{eval:"EVAL_COINBASE_0"}]},{name:"Complianz banner",prehideSelectors:["#cmplz-cookiebanner-container"],detectCmp:[{exists:"#cmplz-cookiebanner-container .cmplz-cookiebanner"}],detectPopup:[{visible:"#cmplz-cookiebanner-container .cmplz-cookiebanner",check:"any"}],optIn:[{waitForThenClick:".cmplz-cookiebanner .cmplz-accept"}],optOut:[{waitForThenClick:".cmplz-cookiebanner .cmplz-deny"}],test:[{eval:"EVAL_COMPLIANZ_BANNER_0"}]},{name:"Complianz categories",prehideSelectors:['.cc-type-categories[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],optIn:[{any:[{click:".cc-accept-all"},{click:".cc-allow-all"},{click:".cc-allow"},{click:".cc-dismiss"}]}],optOut:[{if:{exists:'.cc-type-categories[aria-describedby="cookieconsent:desc"] .cc-dismiss'},then:[{click:".cc-dismiss"}],else:[{click:".cc-type-categories input[type=checkbox]:not([disabled]):checked",all:!0,optional:!0},{click:".cc-save"}]}]},{name:"Complianz notice",prehideSelectors:['.cc-type-info[aria-describedby="cookieconsent:desc"]'],cosmetic:!0,detectCmp:[{exists:'.cc-type-info[aria-describedby="cookieconsent:desc"] .cc-compliance .cc-btn'}],detectPopup:[{visible:'.cc-type-info[aria-describedby="cookieconsent:desc"] .cc-compliance .cc-btn'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{if:{exists:".cc-deny"},then:[{click:".cc-deny"}],else:[{hide:'[aria-describedby="cookieconsent:desc"]'}]}]},{name:"Complianz opt-both",prehideSelectors:['[aria-describedby="cookieconsent:desc"] .cc-type-opt-both'],detectCmp:[{exists:'[aria-describedby="cookieconsent:desc"] .cc-type-opt-both'}],detectPopup:[{visible:'[aria-describedby="cookieconsent:desc"] .cc-type-opt-both'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{waitForThenClick:".cc-deny"}]},{name:"Complianz opt-out",prehideSelectors:['[aria-describedby="cookieconsent:desc"].cc-type-opt-out'],detectCmp:[{exists:'[aria-describedby="cookieconsent:desc"].cc-type-opt-out'}],detectPopup:[{visible:'[aria-describedby="cookieconsent:desc"].cc-type-opt-out'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{if:{exists:".cc-deny"},then:[{click:".cc-deny"}],else:[{if:{exists:".cmp-pref-link"},then:[{click:".cmp-pref-link"},{waitForThenClick:".cmp-body [id*=rejectAll]"},{waitForThenClick:".cmp-body .cmp-save-btn"}]}]}]},{name:"Complianz optin",prehideSelectors:['.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],optIn:[{any:[{click:".cc-accept-all"},{click:".cc-allow"},{click:".cc-dismiss"}]}],optOut:[{if:{visible:".cc-deny"},then:[{click:".cc-deny"}],else:[{if:{visible:".cc-settings"},then:[{waitForThenClick:".cc-settings"},{waitForVisible:".cc-settings-view"},{click:".cc-settings-view input[type=checkbox]:not([disabled]):checked",all:!0,optional:!0},{click:".cc-settings-view .cc-btn-accept-selected"}],else:[{click:".cc-dismiss"}]}]}]},{name:"cookie-consent-spice",cosmetic:!1,runContext:{main:!0,frame:!1},prehideSelectors:[".spicy-consent-wrapper",".spicy-consent-bar"],detectCmp:[{exists:".spicy-consent-bar"}],detectPopup:[{visible:".spicy-consent-bar"}],optIn:[{waitForThenClick:".spicy-consent-bar__action-accept"}],optOut:[{waitForThenClick:".js-decline-all-cookies"}]},{name:"cookie-law-info",prehideSelectors:["#cookie-law-info-bar"],detectCmp:[{exists:"#cookie-law-info-bar"},{eval:"EVAL_COOKIE_LAW_INFO_DETECT"}],detectPopup:[{visible:"#cookie-law-info-bar"}],optIn:[{click:'[data-cli_action="accept_all"]'}],optOut:[{hide:"#cookie-law-info-bar"},{eval:"EVAL_COOKIE_LAW_INFO_0"}],test:[{eval:"EVAL_COOKIE_LAW_INFO_1"}]},{name:"cookie-manager-popup",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,detectCmp:[{exists:"#notice-cookie-block #allow-functional-cookies, #notice-cookie-block #btn-cookie-settings"}],detectPopup:[{visible:"#notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{if:{exists:"#allow-functional-cookies"},then:[{click:"#allow-functional-cookies"}],else:[{waitForThenClick:"#btn-cookie-settings"},{waitForVisible:".modal-body"},{click:'.modal-body input:checked, .switch[data-switch="on"]',all:!0,optional:!0},{click:'[role="dialog"] .modal-footer button'}]}],prehideSelectors:["#btn-cookie-settings"],test:[{eval:"EVAL_COOKIE_MANAGER_POPUP_0"}]},{name:"cookie-notice",prehideSelectors:["#cookie-notice"],cosmetic:!0,detectCmp:[{visible:"#cookie-notice .cookie-notice-container"}],detectPopup:[{visible:"#cookie-notice"}],optIn:[{click:"#cn-accept-cookie"}],optOut:[{hide:"#cookie-notice"}]},{name:"cookie-script",vendorUrl:"https://cookie-script.com/",prehideSelectors:["#cookiescript_injected"],detectCmp:[{exists:"#cookiescript_injected"}],detectPopup:[{visible:"#cookiescript_injected"}],optOut:[{if:{exists:"#cookiescript_reject"},then:[{wait:100},{click:"#cookiescript_reject"}],else:[{click:"#cookiescript_manage"},{waitForVisible:".cookiescript_fsd_main"},{waitForThenClick:"#cookiescript_reject"}]}],optIn:[{click:"#cookiescript_accept"}]},{name:"cookieacceptbar",vendorUrl:"https://unknown",cosmetic:!0,prehideSelectors:["#cookieAcceptBar.cookieAcceptBar"],detectCmp:[{exists:"#cookieAcceptBar.cookieAcceptBar"}],detectPopup:[{visible:"#cookieAcceptBar.cookieAcceptBar"}],optIn:[{waitForThenClick:"#cookieAcceptBarConfirm"}],optOut:[{hide:"#cookieAcceptBar.cookieAcceptBar"}]},{name:"cookiealert",intermediate:!1,prehideSelectors:[],runContext:{frame:!0,main:!0},detectCmp:[{exists:".cookie-alert-extended"}],detectPopup:[{visible:".cookie-alert-extended-modal"}],optIn:[{click:"button[data-controller='cookie-alert/extended/button/accept']"},{eval:"EVAL_COOKIEALERT_0"}],optOut:[{click:"a[data-controller='cookie-alert/extended/detail-link']"},{click:".cookie-alert-configuration-input:checked",all:!0,optional:!0},{click:"button[data-controller='cookie-alert/extended/button/configuration']"},{eval:"EVAL_COOKIEALERT_0"}],test:[{eval:"EVAL_COOKIEALERT_2"}]},{name:"cookieconsent2",vendorUrl:"https://www.github.com/orestbida/cookieconsent",comment:"supports v2.x.x of the library",prehideSelectors:["#cc--main"],detectCmp:[{exists:"#cc--main"}],detectPopup:[{visible:"#cm"},{exists:"#s-all-bn"}],optIn:[{waitForThenClick:"#s-all-bn"}],optOut:[{waitForThenClick:"#s-rall-bn"}],test:[{eval:"EVAL_COOKIECONSENT2_TEST"}]},{name:"cookieconsent3",vendorUrl:"https://www.github.com/orestbida/cookieconsent",comment:"supports v3.x.x of the library",prehideSelectors:["#cc-main"],detectCmp:[{exists:"#cc-main"}],detectPopup:[{visible:"#cc-main .cm-wrapper"}],optIn:[{waitForThenClick:".cm__btn[data-role=all]"}],optOut:[{waitForThenClick:".cm__btn[data-role=necessary]"}],test:[{eval:"EVAL_COOKIECONSENT3_TEST"}]},{name:"cookiecuttr",vendorUrl:"https://github.com/cdwharton/cookieCuttr",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:""},prehideSelectors:[".cc-cookies"],detectCmp:[{exists:".cc-cookies .cc-cookie-accept"}],detectPopup:[{visible:".cc-cookies .cc-cookie-accept"}],optIn:[{waitForThenClick:".cc-cookies .cc-cookie-accept"}],optOut:[{if:{exists:".cc-cookies .cc-cookie-decline"},then:[{click:".cc-cookies .cc-cookie-decline"}],else:[{hide:".cc-cookies"}]}]},{name:"cookiefirst.com",prehideSelectors:["#cookiefirst-root,.cookiefirst-root,[aria-labelledby=cookie-preference-panel-title]"],detectCmp:[{exists:"#cookiefirst-root,.cookiefirst-root"}],detectPopup:[{visible:"#cookiefirst-root,.cookiefirst-root"}],optIn:[{click:"button[data-cookiefirst-action=accept]"}],optOut:[{if:{exists:"button[data-cookiefirst-action=adjust]"},then:[{click:"button[data-cookiefirst-action=adjust]"},{waitForVisible:"[data-cookiefirst-widget=modal]",timeout:1e3},{eval:"EVAL_COOKIEFIRST_1"},{wait:1e3},{click:"button[data-cookiefirst-action=save]"}],else:[{click:"button[data-cookiefirst-action=reject]"}]}],test:[{eval:"EVAL_COOKIEFIRST_0"}]},{name:"Cookie Information Banner",prehideSelectors:["#cookie-information-template-wrapper"],detectCmp:[{exists:"#cookie-information-template-wrapper"}],detectPopup:[{visible:"#cookie-information-template-wrapper"}],optIn:[{eval:"EVAL_COOKIEINFORMATION_1"}],optOut:[{hide:"#cookie-information-template-wrapper",comment:"some templates don't hide the banner automatically"},{eval:"EVAL_COOKIEINFORMATION_0"}],test:[{eval:"EVAL_COOKIEINFORMATION_2"}]},{name:"cookieyes",prehideSelectors:[".cky-overlay,.cky-consent-container"],detectCmp:[{exists:".cky-consent-container"}],detectPopup:[{visible:".cky-consent-container"}],optIn:[{waitForThenClick:".cky-consent-container [data-cky-tag=accept-button]"}],optOut:[{if:{exists:".cky-consent-container [data-cky-tag=reject-button]"},then:[{waitForThenClick:".cky-consent-container [data-cky-tag=reject-button]"}],else:[{if:{exists:".cky-consent-container [data-cky-tag=settings-button]"},then:[{click:".cky-consent-container [data-cky-tag=settings-button]"},{waitFor:".cky-modal-open input[type=checkbox]"},{click:".cky-modal-open input[type=checkbox]:checked",all:!0,optional:!0},{waitForThenClick:".cky-modal [data-cky-tag=detail-save-button]"}],else:[{hide:".cky-consent-container,.cky-overlay"}]}]}],test:[{eval:"EVAL_COOKIEYES_0"}]},{name:"corona-in-zahlen.de",prehideSelectors:[".cookiealert"],detectCmp:[{exists:".cookiealert"}],detectPopup:[{visible:".cookiealert"}],optOut:[{click:".configurecookies"},{click:".confirmcookies"}],optIn:[{click:".acceptcookies"}]},{name:"crossfit-com",cosmetic:!0,prehideSelectors:['body #modal > div > div[class^="_wrapper_"]'],detectCmp:[{exists:'body #modal > div > div[class^="_wrapper_"]'}],detectPopup:[{visible:'body #modal > div > div[class^="_wrapper_"]'}],optIn:[{click:'button[aria-label="accept cookie policy"]'}],optOut:[{hide:'body #modal > div > div[class^="_wrapper_"]'}]},{name:"csu-landtag-de",runContext:{urlPattern:"^https://(www\\.|)?csu-landtag\\.de"},prehideSelectors:["#cookie-disclaimer"],detectCmp:[{exists:"#cookie-disclaimer"}],detectPopup:[{visible:"#cookie-disclaimer"}],optIn:[{click:"#cookieall"}],optOut:[{click:"#cookiesel"}]},{name:"dailymotion-us",cosmetic:!0,prehideSelectors:['div[class*="CookiePopup__desktopContainer"]:has(div[class*="CookiePopup"])'],detectCmp:[{exists:'div[class*="CookiePopup__desktopContainer"]'}],detectPopup:[{visible:'div[class*="CookiePopup__desktopContainer"]'}],optIn:[{click:'div[class*="CookiePopup__desktopContainer"] > button > span'}],optOut:[{hide:'div[class*="CookiePopup__desktopContainer"]'}]},{name:"dailymotion.com",runContext:{urlPattern:"^https://(www\\.)?dailymotion\\.com/"},prehideSelectors:['div[class*="Overlay__container"]:has(div[class*="TCF2Popup"])'],detectCmp:[{exists:'div[class*="TCF2Popup"]'}],detectPopup:[{visible:'[class*="TCF2Popup"] a[href^="https://www.dailymotion.com/legal/cookiemanagement"]'}],optIn:[{waitForThenClick:'button[class*="TCF2Popup__button"]:not([class*="TCF2Popup__personalize"])'}],optOut:[{waitForThenClick:'button[class*="TCF2ContinueWithoutAcceptingButton"]'}],test:[{eval:"EVAL_DAILYMOTION_0"}]},{name:"dan-com",vendorUrl:"https://unknown",runContext:{main:!0,frame:!1},prehideSelectors:[],detectCmp:[{exists:".cookie-banner.show .cookie-banner__content-all-btn"}],detectPopup:[{visible:".cookie-banner.show .cookie-banner__content-all-btn"}],optIn:[{waitForThenClick:".cookie-banner__content-all-btn"}],optOut:[{waitForThenClick:".cookie-banner__content-essential-btn"}]},{name:"deepl.com",prehideSelectors:[".dl_cookieBanner_container"],detectCmp:[{exists:".dl_cookieBanner_container"}],detectPopup:[{visible:".dl_cookieBanner_container"}],optOut:[{click:".dl_cookieBanner--buttonSelected"}],optIn:[{click:".dl_cookieBanner--buttonAll"}]},{name:"delta.com",runContext:{urlPattern:"^https://www\\.delta\\.com/"},cosmetic:!0,prehideSelectors:["ngc-cookie-banner"],detectCmp:[{exists:"div.cookie-footer-container"}],detectPopup:[{visible:"div.cookie-footer-container"}],optIn:[{click:" button.cookie-close-icon"}],optOut:[{hide:"div.cookie-footer-container"}]},{name:"dmgmedia-us",prehideSelectors:["#mol-ads-cmp-iframe, div.mol-ads-cmp > form > div"],detectCmp:[{exists:"div.mol-ads-cmp > form > div"}],detectPopup:[{waitForVisible:"div.mol-ads-cmp > form > div"}],optIn:[{waitForThenClick:"button.mol-ads-cmp--btn-primary"}],optOut:[{waitForThenClick:"div.mol-ads-ccpa--message > u > a"},{waitForVisible:".mol-ads-cmp--modal-dialog"},{waitForThenClick:"a.mol-ads-cmp-footer-privacy"},{waitForThenClick:"button.mol-ads-cmp--btn-secondary"}]},{name:"dmgmedia",prehideSelectors:['[data-project="mol-fe-cmp"]'],detectCmp:[{exists:'[data-project="mol-fe-cmp"] [class*=footer]'}],detectPopup:[{visible:'[data-project="mol-fe-cmp"] [class*=footer]'}],optIn:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=primary]'}],optOut:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=basic]'},{waitForVisible:'[data-project="mol-fe-cmp"] div[class*="tabContent"]'},{waitForThenClick:'[data-project="mol-fe-cmp"] div[class*="toggle"][class*="enabled"]',all:!0},{waitForThenClick:['[data-project="mol-fe-cmp"] [class*=footer]',"xpath///button[contains(., 'Save & Exit')]"]}]},{name:"dndbeyond",vendorUrl:"https://www.dndbeyond.com/",runContext:{urlPattern:"^https://(www\\.)?dndbeyond\\.com/"},prehideSelectors:["[id^=cookie-consent-banner]"],detectCmp:[{exists:"[id^=cookie-consent-banner]"}],detectPopup:[{visible:"[id^=cookie-consent-banner]"}],optIn:[{waitForThenClick:"#cookie-consent-granted"}],optOut:[{waitForThenClick:"#cookie-consent-denied"}],test:[{eval:"EVAL_DNDBEYOND_TEST"}]},{name:"dpgmedia-nl",prehideSelectors:["#pg-shadow-root-host"],detectCmp:[{exists:"#pg-shadow-root-host"}],detectPopup:[{visible:["#pg-shadow-root-host","#pg-modal"]}],optIn:[{waitForThenClick:["#pg-shadow-root-host","#pg-accept-btn"]}],optOut:[{waitForThenClick:["#pg-shadow-root-host","#pg-configure-btn"]},{waitForThenClick:["#pg-shadow-root-host","#pg-reject-btn"]}]},{name:"Drupal",detectCmp:[{exists:"#drupalorg-crosssite-gdpr"}],detectPopup:[{visible:"#drupalorg-crosssite-gdpr"}],optOut:[{click:".no"}],optIn:[{click:".yes"}]},{name:"WP DSGVO Tools",link:"https://wordpress.org/plugins/shapepress-dsgvo/",prehideSelectors:[".sp-dsgvo"],cosmetic:!0,detectCmp:[{exists:".sp-dsgvo.sp-dsgvo-popup-overlay"}],detectPopup:[{visible:".sp-dsgvo.sp-dsgvo-popup-overlay",check:"any"}],optIn:[{click:".sp-dsgvo-privacy-btn-accept-all",all:!0}],optOut:[{hide:".sp-dsgvo.sp-dsgvo-popup-overlay"}],test:[{eval:"EVAL_DSGVO_0"}]},{name:"dunelm.com",prehideSelectors:["div[data-testid=cookie-consent-modal-backdrop]"],detectCmp:[{exists:"div[data-testid=cookie-consent-message-contents]"}],detectPopup:[{visible:"div[data-testid=cookie-consent-message-contents]"}],optIn:[{click:'[data-testid="cookie-consent-allow-all"]'}],optOut:[{click:"button[data-testid=cookie-consent-adjust-settings]"},{click:"button[data-testid=cookie-consent-preferences-save]"}],test:[{eval:"EVAL_DUNELM_0"}]},{name:"ebay",vendorUrl:"https://ebay.com",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?ebay\\.([.a-z]+)/"},prehideSelectors:["#gdpr-banner"],detectCmp:[{exists:"#gdpr-banner"}],detectPopup:[{visible:"#gdpr-banner"}],optIn:[{waitForThenClick:"#gdpr-banner-accept"}],optOut:[{waitForThenClick:"#gdpr-banner-decline"}]},{name:"ecosia",vendorUrl:"https://www.ecosia.org/",runContext:{urlPattern:"^https://www\\.ecosia\\.org/"},prehideSelectors:[".cookie-wrapper"],detectCmp:[{exists:".cookie-wrapper > .cookie-notice"}],detectPopup:[{visible:".cookie-wrapper > .cookie-notice"}],optIn:[{waitForThenClick:"[data-test-id=cookie-notice-accept]"}],optOut:[{waitForThenClick:"[data-test-id=cookie-notice-reject]"}]},{name:"Ensighten ensModal",prehideSelectors:[".ensModal"],detectCmp:[{exists:".ensModal"},{visible:"#ensModalWrapper[style*=block]"}],detectPopup:[{visible:"#ensModalWrapper[style*=block]"}],optIn:[{waitForThenClick:"#modalAcceptButton"}],optOut:[{wait:500},{visible:"#ensModalWrapper[style*=block]"},{waitForThenClick:".ensCheckbox:checked",all:!0},{waitForThenClick:"#ensSave"}]},{name:"Ensighten ensNotifyBanner",prehideSelectors:["#ensNotifyBanner"],detectCmp:[{exists:"#ensNotifyBanner"}],detectPopup:[{visible:"#ensNotifyBanner[style*=block]"}],optIn:[{waitForThenClick:"#ensCloseBanner"}],optOut:[{wait:500},{visible:"#ensNotifyBanner[style*=block]"},{waitForThenClick:"#ensRejectAll,#rejectAll,#ensRejectBanner,.rejectAll,#ensCloseBanner",timeout:2e3}]},{name:"espace-personnel.agirc-arrco.fr",runContext:{urlPattern:"^https://espace-personnel\\.agirc-arrco\\.fr/"},prehideSelectors:[".cdk-overlay-container"],detectCmp:[{exists:".cdk-overlay-container app-esaa-cookie-component"}],detectPopup:[{visible:".cdk-overlay-container app-esaa-cookie-component"}],optIn:[{waitForThenClick:".btn-cookie-accepter"}],optOut:[{waitForThenClick:".btn-cookie-refuser"}]},{name:"etsy",prehideSelectors:["#gdpr-single-choice-overlay","#gdpr-privacy-settings"],detectCmp:[{exists:"#gdpr-single-choice-overlay"}],detectPopup:[{visible:"#gdpr-single-choice-overlay"}],optOut:[{click:"button[data-gdpr-open-full-settings]"},{waitForVisible:".gdpr-overlay-body input",timeout:3e3},{wait:1e3},{eval:"EVAL_ETSY_0"},{eval:"EVAL_ETSY_1"}],optIn:[{click:"button[data-gdpr-single-choice-accept]"}]},{name:"eu-cookie-compliance-banner",detectCmp:[{exists:"body.eu-cookie-compliance-popup-open"}],detectPopup:[{exists:"body.eu-cookie-compliance-popup-open"}],optIn:[{click:".agree-button"}],optOut:[{if:{visible:".decline-button,.eu-cookie-compliance-save-preferences-button"},then:[{click:".decline-button,.eu-cookie-compliance-save-preferences-button"}]},{hide:".eu-cookie-compliance-banner-info, #sliding-popup"}],test:[{eval:"EVAL_EU_COOKIE_COMPLIANCE_0"}]},{name:"EU Cookie Law",prehideSelectors:[".pea_cook_wrapper,.pea_cook_more_info_popover"],cosmetic:!0,detectCmp:[{exists:".pea_cook_wrapper"}],detectPopup:[{wait:500},{visible:".pea_cook_wrapper"}],optIn:[{click:"#pea_cook_btn"}],optOut:[{hide:".pea_cook_wrapper"}],test:[{eval:"EVAL_EU_COOKIE_LAW_0"}]},{name:"europa-eu",vendorUrl:"https://ec.europa.eu/",runContext:{urlPattern:"^https://[^/]*europa\\.eu/"},prehideSelectors:["#cookie-consent-banner"],detectCmp:[{exists:".cck-container"}],detectPopup:[{visible:".cck-container"}],optIn:[{waitForThenClick:'.cck-actions-button[href="#accept"]'}],optOut:[{waitForThenClick:'.cck-actions-button[href="#refuse"]',hide:".cck-container"}]},{name:"EZoic",prehideSelectors:["#ez-cookie-dialog-wrapper"],detectCmp:[{exists:"#ez-cookie-dialog-wrapper"}],detectPopup:[{visible:"#ez-cookie-dialog-wrapper"}],optIn:[{click:"#ez-accept-all",optional:!0},{eval:"EVAL_EZOIC_0",optional:!0}],optOut:[{wait:500},{click:"#ez-manage-settings"},{waitFor:"#ez-cookie-dialog input[type=checkbox]"},{click:"#ez-cookie-dialog input[type=checkbox]:checked",all:!0},{click:"#ez-save-settings"}],test:[{eval:"EVAL_EZOIC_1"}]},{name:"facebook",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?facebook\\.com/"},prehideSelectors:['div[data-testid="cookie-policy-manage-dialog"]'],detectCmp:[{exists:'div[data-testid="cookie-policy-manage-dialog"]'}],detectPopup:[{visible:'div[data-testid="cookie-policy-manage-dialog"]'}],optIn:[{waitForThenClick:'button[data-cookiebanner="accept_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}],optOut:[{waitForThenClick:'button[data-cookiebanner="accept_only_essential_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}]},{name:"fides",vendorUrl:"https://github.com/ethyca/fides",prehideSelectors:["#fides-overlay"],detectCmp:[{exists:"#fides-overlay #fides-banner"}],detectPopup:[{visible:"#fides-overlay #fides-banner"},{eval:"EVAL_FIDES_DETECT_POPUP"}],optIn:[{waitForThenClick:"#fides-banner .fides-accept-all-button"}],optOut:[{waitForThenClick:"#fides-banner .fides-reject-all-button"}]},{name:"funding-choices",prehideSelectors:[".fc-consent-root,.fc-dialog-container,.fc-dialog-overlay,.fc-dialog-content"],detectCmp:[{exists:".fc-consent-root"}],detectPopup:[{exists:".fc-dialog-container"}],optOut:[{click:".fc-cta-do-not-consent,.fc-cta-manage-options"},{click:".fc-preference-consent:checked,.fc-preference-legitimate-interest:checked",all:!0,optional:!0},{click:".fc-confirm-choices",optional:!0}],optIn:[{click:".fc-cta-consent"}]},{name:"geeks-for-geeks",runContext:{urlPattern:"^https://www\\.geeksforgeeks\\.org/"},cosmetic:!0,prehideSelectors:[".cookie-consent"],detectCmp:[{exists:".cookie-consent"}],detectPopup:[{visible:".cookie-consent"}],optIn:[{click:".cookie-consent button.consent-btn"}],optOut:[{hide:".cookie-consent"}]},{name:"google-consent-standalone",prehideSelectors:[],detectCmp:[{exists:'a[href^="https://policies.google.com/technologies/cookies"'},{exists:'form[action^="https://consent.google."][action$="/save"]'}],detectPopup:[{visible:'a[href^="https://policies.google.com/technologies/cookies"'}],optIn:[{waitForThenClick:'form[action^="https://consent.google."][action$="/save"]:has(input[name=set_eom][value=false]) button'}],optOut:[{waitForThenClick:'form[action^="https://consent.google."][action$="/save"]:has(input[name=set_eom][value=true]) button'}]},{name:"google-cookiebar",vendorUrl:"https://www.android.com/better-together/quick-share-app/",cosmetic:!1,prehideSelectors:[".glue-cookie-notification-bar"],detectCmp:[{exists:".glue-cookie-notification-bar"}],detectPopup:[{visible:".glue-cookie-notification-bar"}],optIn:[{waitForThenClick:".glue-cookie-notification-bar__accept"}],optOut:[{if:{exists:".glue-cookie-notification-bar__reject"},then:[{click:".glue-cookie-notification-bar__reject"}],else:[{hide:".glue-cookie-notification-bar"}]}],test:[]},{name:"google.com",prehideSelectors:[".HTjtHe#xe7COe"],detectCmp:[{exists:".HTjtHe#xe7COe"},{exists:'.HTjtHe#xe7COe a[href^="https://policies.google.com/technologies/cookies"]'}],detectPopup:[{visible:".HTjtHe#xe7COe button#W0wltc"}],optIn:[{waitForThenClick:".HTjtHe#xe7COe button#L2AGLb"}],optOut:[{waitForThenClick:".HTjtHe#xe7COe button#W0wltc"}],test:[{eval:"EVAL_GOOGLE_0"}]},{name:"gov.uk",detectCmp:[{exists:"#global-cookie-message"}],detectPopup:[{exists:"#global-cookie-message"}],optIn:[{click:"button[data-accept-cookies=true]"}],optOut:[{click:"button[data-reject-cookies=true],#reject-cookies"},{click:"button[data-hide-cookie-banner=true],#hide-cookie-decision"}]},{name:"hashicorp",vendorUrl:"https://hashicorp.com/",runContext:{urlPattern:"^https://[^.]*\\.hashicorp\\.com/"},prehideSelectors:["[data-testid=consent-banner]"],detectCmp:[{exists:"[data-testid=consent-banner]"}],detectPopup:[{visible:"[data-testid=consent-banner]"}],optIn:[{waitForThenClick:"[data-testid=accept]"}],optOut:[{waitForThenClick:"[data-testid=manage-preferences]"},{waitForThenClick:"[data-testid=consent-mgr-dialog] [data-ga-button=save-preferences]"}]},{name:"healthline-media",prehideSelectors:["#modal-host > div.no-hash > div.window-wrapper"],detectCmp:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],detectPopup:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],optIn:[{click:"#modal-host > div.no-hash > div.window-wrapper > div:last-child button"}],optOut:[{if:{exists:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'},then:[{click:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'}],else:[{waitForVisible:"div#__next"},{click:"#__next div:nth-child(1) > button:first-child"}]}]},{name:"hema",prehideSelectors:[".cookie-modal"],detectCmp:[{visible:".cookie-modal .cookie-accept-btn"}],detectPopup:[{visible:".cookie-modal .cookie-accept-btn"}],optIn:[{waitForThenClick:".cookie-modal .cookie-accept-btn"}],optOut:[{waitForThenClick:".cookie-modal .js-cookie-reject-btn"}],test:[{eval:"EVAL_HEMA_TEST_0"}]},{name:"hetzner.com",runContext:{urlPattern:"^https://www\\.hetzner\\.com/"},prehideSelectors:["#CookieConsent"],detectCmp:[{exists:"#CookieConsent"}],detectPopup:[{visible:"#CookieConsent"}],optIn:[{click:"#CookieConsentGiven"}],optOut:[{click:"#CookieConsentDeclined"}]},{name:"hl.co.uk",prehideSelectors:[".cookieModalContent","#cookie-banner-overlay"],detectCmp:[{exists:"#cookie-banner-overlay"}],detectPopup:[{exists:"#cookie-banner-overlay"}],optIn:[{click:"#acceptCookieButton"}],optOut:[{click:"#manageCookie"},{hide:".cookieSettingsModal"},{waitFor:"#AOCookieToggle"},{click:"#AOCookieToggle[aria-pressed=true]",optional:!0},{waitFor:"#TPCookieToggle"},{click:"#TPCookieToggle[aria-pressed=true]",optional:!0},{click:"#updateCookieButton"}]},{name:"holidaymedia",vendorUrl:"https://holidaymedia.nl/",prehideSelectors:["dialog[data-cookie-consent]"],detectCmp:[{exists:"dialog[data-cookie-consent]"}],detectPopup:[{visible:"dialog[data-cookie-consent]"}],optIn:[{waitForThenClick:"button.cookie-consent__button--accept-all"}],optOut:[{waitForThenClick:'a[data-cookie-accept="functional"]',timeout:2e3}]},{name:"hu-manity",vendorUrl:"https://hu-manity.co/",prehideSelectors:["#hu.hu-wrapper"],detectCmp:[{exists:"#hu.hu-visible"}],detectPopup:[{visible:"#hu.hu-visible"}],optIn:[{waitForThenClick:"[data-hu-action=cookies-notice-consent-choices-3]"},{waitForThenClick:"#hu-cookies-save"}],optOut:[{waitForThenClick:"#hu-cookies-save"}]},{name:"hubspot",detectCmp:[{exists:"#hs-eu-cookie-confirmation"}],detectPopup:[{visible:"#hs-eu-cookie-confirmation"}],optIn:[{click:"#hs-eu-confirmation-button"}],optOut:[{click:"#hs-eu-decline-button"}]},{name:"indeed.com",cosmetic:!0,prehideSelectors:["#CookiePrivacyNotice"],detectCmp:[{exists:"#CookiePrivacyNotice"}],detectPopup:[{visible:"#CookiePrivacyNotice"}],optIn:[{click:"#CookiePrivacyNotice button[data-gnav-element-name=CookiePrivacyNoticeOk]"}],optOut:[{hide:"#CookiePrivacyNotice"}]},{name:"ing.de",runContext:{urlPattern:"^https://www\\.ing\\.de/"},cosmetic:!0,prehideSelectors:['div[slot="backdrop"]'],detectCmp:[{exists:'[data-tag-name="ing-cc-dialog-frame"]'}],detectPopup:[{visible:'[data-tag-name="ing-cc-dialog-frame"]'}],optIn:[{click:['[data-tag-name="ing-cc-dialog-level0"]','[data-tag-name="ing-cc-button"][class*="accept"]']}],optOut:[{click:['[data-tag-name="ing-cc-dialog-level0"]','[data-tag-name="ing-cc-button"][class*="more"]']}]},{name:"instagram",vendorUrl:"https://instagram.com",runContext:{urlPattern:"^https://www\\.instagram\\.com/"},prehideSelectors:[],detectCmp:[{exists:'xpath///span[contains(., "Vill du tillåta användningen av cookies från Instagram i den här webbläsaren?") or contains(., "Allow the use of cookies from Instagram on this browser?") or contains(., "Povolit v prohlížeči použití souborů cookie z Instagramu?") or contains(., "Dopustiti upotrebu kolačića s Instagrama na ovom pregledniku?") or contains(., "Разрешить использование файлов cookie от Instagram в этом браузере?") or contains(., "Vuoi consentire l\'uso dei cookie di Instagram su questo browser?") or contains(., "Povoliť používanie cookies zo služby Instagram v tomto prehliadači?") or contains(., "Die Verwendung von Cookies durch Instagram in diesem Browser erlauben?") or contains(., "Sallitaanko Instagramin evästeiden käyttö tällä selaimella?") or contains(., "Engedélyezed az Instagram cookie-jainak használatát ebben a böngészőben?") or contains(., "Het gebruik van cookies van Instagram toestaan in deze browser?") or contains(., "Bu tarayıcıda Instagram\'dan çerez kullanımına izin verilsin mi?") or contains(., "Permitir o uso de cookies do Instagram neste navegador?") or contains(., "Permiţi folosirea modulelor cookie de la Instagram în acest browser?") or contains(., "Autoriser l’utilisation des cookies d’Instagram sur ce navigateur ?") or contains(., "¿Permitir el uso de cookies de Instagram en este navegador?") or contains(., "Zezwolić na użycie plików cookie z Instagramu w tej przeglądarce?") or contains(., "Να επιτρέπεται η χρήση cookies από τo Instagram σε αυτό το πρόγραμμα περιήγησης;") or contains(., "Разрешавате ли използването на бисквитки от Instagram на този браузър?") or contains(., "Vil du tillade brugen af cookies fra Instagram i denne browser?") or contains(., "Vil du tillate bruk av informasjonskapsler fra Instagram i denne nettleseren?")]'}],detectPopup:[{visible:'xpath///span[contains(., "Vill du tillåta användningen av cookies från Instagram i den här webbläsaren?") or contains(., "Allow the use of cookies from Instagram on this browser?") or contains(., "Povolit v prohlížeči použití souborů cookie z Instagramu?") or contains(., "Dopustiti upotrebu kolačića s Instagrama na ovom pregledniku?") or contains(., "Разрешить использование файлов cookie от Instagram в этом браузере?") or contains(., "Vuoi consentire l\'uso dei cookie di Instagram su questo browser?") or contains(., "Povoliť používanie cookies zo služby Instagram v tomto prehliadači?") or contains(., "Die Verwendung von Cookies durch Instagram in diesem Browser erlauben?") or contains(., "Sallitaanko Instagramin evästeiden käyttö tällä selaimella?") or contains(., "Engedélyezed az Instagram cookie-jainak használatát ebben a böngészőben?") or contains(., "Het gebruik van cookies van Instagram toestaan in deze browser?") or contains(., "Bu tarayıcıda Instagram\'dan çerez kullanımına izin verilsin mi?") or contains(., "Permitir o uso de cookies do Instagram neste navegador?") or contains(., "Permiţi folosirea modulelor cookie de la Instagram în acest browser?") or contains(., "Autoriser l’utilisation des cookies d’Instagram sur ce navigateur ?") or contains(., "¿Permitir el uso de cookies de Instagram en este navegador?") or contains(., "Zezwolić na użycie plików cookie z Instagramu w tej przeglądarce?") or contains(., "Να επιτρέπεται η χρήση cookies από τo Instagram σε αυτό το πρόγραμμα περιήγησης;") or contains(., "Разрешавате ли използването на бисквитки от Instagram на този браузър?") or contains(., "Vil du tillade brugen af cookies fra Instagram i denne browser?") or contains(., "Vil du tillate bruk av informasjonskapsler fra Instagram i denne nettleseren?")]'}],optIn:[{waitForThenClick:"xpath///button[contains(., 'Tillad alle cookies') or contains(., 'Alle Cookies erlauben') or contains(., 'Allow all cookies') or contains(., 'Разрешаване на всички бисквитки') or contains(., 'Tillåt alla cookies') or contains(., 'Povolit všechny soubory cookie') or contains(., 'Tüm çerezlere izin ver') or contains(., 'Permite toate modulele cookie') or contains(., 'Να επιτρέπονται όλα τα cookies') or contains(., 'Tillat alle informasjonskapsler') or contains(., 'Povoliť všetky cookies') or contains(., 'Permitir todas las cookies') or contains(., 'Permitir todos os cookies') or contains(., 'Alle cookies toestaan') or contains(., 'Salli kaikki evästeet') or contains(., 'Consenti tutti i cookie') or contains(., 'Az összes cookie engedélyezése') or contains(., 'Autoriser tous les cookies') or contains(., 'Zezwól na wszystkie pliki cookie') or contains(., 'Разрешить все cookie') or contains(., 'Dopusti sve kolačiće')]"}],optOut:[{waitForThenClick:"xpath///button[contains(., 'Отклонить необязательные файлы cookie') or contains(., 'Decline optional cookies') or contains(., 'Refuser les cookies optionnels') or contains(., 'Hylkää valinnaiset evästeet') or contains(., 'Afvis valgfrie cookies') or contains(., 'Odmietnuť nepovinné cookies') or contains(., 'Απόρριψη προαιρετικών cookies') or contains(., 'Neka valfria cookies') or contains(., 'Optionale Cookies ablehnen') or contains(., 'Rifiuta cookie facoltativi') or contains(., 'Odbij neobavezne kolačiće') or contains(., 'Avvis valgfrie informasjonskapsler') or contains(., 'İsteğe bağlı çerezleri reddet') or contains(., 'Recusar cookies opcionais') or contains(., 'Optionele cookies afwijzen') or contains(., 'Rechazar cookies opcionales') or contains(., 'Odrzuć opcjonalne pliki cookie') or contains(., 'Отхвърляне на бисквитките по избор') or contains(., 'Odmítnout volitelné soubory cookie') or contains(., 'Refuză modulele cookie opţionale') or contains(., 'A nem kötelező cookie-k elutasítása')]"},{wait:2e3}]},{name:"ionos.de",prehideSelectors:[".privacy-consent--backdrop",".privacy-consent--modal"],detectCmp:[{exists:".privacy-consent--modal"}],detectPopup:[{visible:".privacy-consent--modal"}],optIn:[{click:"#selectAll"}],optOut:[{click:".footer-config-link"},{click:"#confirmSelection"}]},{name:"itopvpn.com",cosmetic:!0,prehideSelectors:[".pop-cookie"],detectCmp:[{exists:".pop-cookie"}],detectPopup:[{exists:".pop-cookie"}],optIn:[{click:"#_pcookie"}],optOut:[{hide:".pop-cookie"}]},{name:"iubenda",prehideSelectors:["#iubenda-cs-banner"],detectCmp:[{exists:"#iubenda-cs-banner"}],detectPopup:[{visible:".iubenda-cs-accept-btn"}],optIn:[{waitForThenClick:".iubenda-cs-accept-btn"}],optOut:[{waitForThenClick:".iubenda-cs-customize-btn"},{eval:"EVAL_IUBENDA_0"},{waitForThenClick:"#iubFooterBtn"}],test:[{eval:"EVAL_IUBENDA_1"}]},{name:"iWink",prehideSelectors:["body.cookies-request #cookie-bar"],detectCmp:[{exists:"body.cookies-request #cookie-bar"}],detectPopup:[{visible:"body.cookies-request #cookie-bar"}],optIn:[{waitForThenClick:"body.cookies-request #cookie-bar .allow-cookies"}],optOut:[{waitForThenClick:"body.cookies-request #cookie-bar .disallow-cookies"}],test:[{eval:"EVAL_IWINK_TEST"}]},{name:"jdsports",vendorUrl:"https://www.jdsports.co.uk/",runContext:{urlPattern:"^https://(www|m)\\.jdsports\\."},prehideSelectors:[".miniConsent,#PrivacyPolicyBanner"],detectCmp:[{exists:".miniConsent,#PrivacyPolicyBanner"}],detectPopup:[{visible:".miniConsent,#PrivacyPolicyBanner"}],optIn:[{waitForThenClick:".miniConsent .accept-all-cookies"}],optOut:[{if:{exists:"#PrivacyPolicyBanner"},then:[{hide:"#PrivacyPolicyBanner"}],else:[{waitForThenClick:"#cookie-settings"},{waitForThenClick:"#reject-all-cookies"}]}]},{name:"johnlewis.com",prehideSelectors:["div[class^=pecr-cookie-banner-]"],detectCmp:[{exists:"div[class^=pecr-cookie-banner-]"}],detectPopup:[{exists:"div[class^=pecr-cookie-banner-]"}],optOut:[{click:"button[data-test^=manage-cookies]"},{wait:"500"},{click:"label[data-test^=toggle][class*=checked]:not([class*=disabled])",all:!0,optional:!0},{click:"button[data-test=save-preferences]"}],optIn:[{click:"button[data-test=allow-all]"}]},{name:"jquery.cookieBar",vendorUrl:"https://github.com/kovarp/jquery.cookieBar",prehideSelectors:[".cookie-bar"],cosmetic:!0,detectCmp:[{exists:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons"}],detectPopup:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"any"}],optIn:[{click:".cookie-bar .cookie-bar__btn"}],optOut:[{hide:".cookie-bar"}],test:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"none"},{eval:"EVAL_JQUERY_COOKIEBAR_0"}]},{name:"justwatch.com",prehideSelectors:[".consent-banner"],detectCmp:[{exists:".consent-banner .consent-banner__actions"}],detectPopup:[{visible:".consent-banner .consent-banner__actions"}],optIn:[{click:".consent-banner__actions button.basic-button.primary"}],optOut:[{click:".consent-banner__actions button.basic-button.secondary"},{waitForThenClick:".consent-modal__footer button.basic-button.secondary"},{waitForThenClick:".consent-modal ion-content > div > a:nth-child(9)"},{click:"label.consent-switch input[type=checkbox]:checked",all:!0,optional:!0},{waitForVisible:".consent-modal__footer button.basic-button.primary"},{click:".consent-modal__footer button.basic-button.primary"}]},{name:"kconsent",cosmetic:!1,runContext:{main:!0,frame:!1},prehideSelectors:[".kc-overlay"],detectCmp:[{exists:"#kconsent"}],detectPopup:[{visible:".kc-dialog"}],optIn:[{waitForThenClick:"#kc-acceptAndHide"}],optOut:[{waitForThenClick:"#kc-denyAndHide"}]},{name:"ketch",vendorUrl:"https://www.ketch.com",runContext:{frame:!1,main:!0},intermediate:!1,prehideSelectors:["#lanyard_root div[role='dialog']"],detectCmp:[{exists:"#lanyard_root div[role='dialog']"}],detectPopup:[{visible:"#lanyard_root div[role='dialog']"}],optIn:[{if:{exists:"#lanyard_root button[class='confirmButton']"},then:[{waitForThenClick:"#lanyard_root div[class*=buttons] > :nth-child(2)"},{click:"#lanyard_root button[class='confirmButton']"}],else:[{waitForThenClick:"#lanyard_root div[class*=buttons] > :nth-child(2)"}]}],optOut:[{if:{exists:"#lanyard_root [aria-describedby=banner-description]"},then:[{waitForThenClick:"#lanyard_root div[class*=buttons] > button[class*=secondaryButton], #lanyard_root button[class*=buttons-secondary]",comment:"can be either settings or reject button"}]},{waitFor:"#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description], #ketch-preferences",timeout:1e3,optional:!0},{if:{exists:"#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description], #ketch-preferences"},then:[{waitForThenClick:"#lanyard_root button[class*=rejectButton], #lanyard_root button[class*=rejectAllButton]"},{click:"#lanyard_root button[class*=confirmButton],#lanyard_root div[class*=actions_] > button:nth-child(1), #lanyard_root button[class*=actionButton]"}]}],test:[{eval:"EVAL_KETCH_TEST"}]},{name:"kleinanzeigen-de",runContext:{urlPattern:"^https?://(www\\.)?kleinanzeigen\\.de"},prehideSelectors:["#gdpr-banner-container"],detectCmp:[{any:[{exists:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{exists:"#ConsentManagementPage"}]}],detectPopup:[{any:[{visible:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{visible:"#ConsentManagementPage"}]}],optIn:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-accept]"}],else:[{click:"#ConsentManagementPage .Button-primary"}]}],optOut:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"}],else:[{click:"#ConsentManagementPage .Button-secondary"}]}]},{name:"lightbox",prehideSelectors:[".darken-layer.open,.lightbox.lightbox--cookie-consent"],detectCmp:[{exists:"body.cookie-consent-is-active div.lightbox--cookie-consent > div.lightbox__content > div.cookie-consent[data-jsb]"}],detectPopup:[{visible:"body.cookie-consent-is-active div.lightbox--cookie-consent > div.lightbox__content > div.cookie-consent[data-jsb]"}],optOut:[{click:".cookie-consent__footer > button[type='submit']:not([data-button='selectAll'])"}],optIn:[{click:".cookie-consent__footer > button[type='submit'][data-button='selectAll']"}]},{name:"lineagrafica",vendorUrl:"https://addons.prestashop.com/en/legal/8734-eu-cookie-law-gdpr-banner-blocker.html",cosmetic:!0,prehideSelectors:["#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"],detectCmp:[{exists:"#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"}],detectPopup:[{exists:"#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"}],optIn:[{waitForThenClick:"#lgcookieslaw_accept"}],optOut:[{hide:"#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"}]},{name:"linkedin.com",prehideSelectors:[".artdeco-global-alert[type=COOKIE_CONSENT]"],detectCmp:[{exists:".artdeco-global-alert[type=COOKIE_CONSENT]"}],detectPopup:[{visible:".artdeco-global-alert[type=COOKIE_CONSENT]"}],optIn:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"}],optOut:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"}],test:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT]",check:"none"}]},{name:"livejasmin",vendorUrl:"https://www.livejasmin.com/",runContext:{urlPattern:"^https://(m|www)\\.livejasmin\\.com/"},prehideSelectors:["#consent_modal"],detectCmp:[{exists:"#consent_modal"}],detectPopup:[{visible:"#consent_modal"}],optIn:[{waitForThenClick:"#consent_modal button[data-testid=ButtonStyledButton]:first-of-type"}],optOut:[{waitForThenClick:"#consent_modal button[data-testid=ButtonStyledButton]:nth-of-type(2)"},{waitForVisible:"[data-testid=PrivacyPreferenceCenterWithConsentCookieContent]"},{click:"[data-testid=PrivacyPreferenceCenterWithConsentCookieContent] input[data-testid=PrivacyPreferenceCenterWithConsentCookieSwitch]:checked",optional:!0,all:!0},{waitForThenClick:"[data-testid=PrivacyPreferenceCenterWithConsentCookieContent] button[data-testid=ButtonStyledButton]:last-child"}]},{name:"macpaw.com",cosmetic:!0,prehideSelectors:['div[data-banner="cookies"]'],detectCmp:[{exists:'div[data-banner="cookies"]'}],detectPopup:[{exists:'div[data-banner="cookies"]'}],optIn:[{click:'button[data-banner-close="cookies"]'}],optOut:[{hide:'div[data-banner="cookies"]'}]},{name:"marksandspencer.com",cosmetic:!0,detectCmp:[{exists:".navigation-cookiebbanner"}],detectPopup:[{visible:".navigation-cookiebbanner"}],optOut:[{hide:".navigation-cookiebbanner"}],optIn:[{click:".navigation-cookiebbanner__submit"}]},{name:"mediamarkt.de",prehideSelectors:["div[aria-labelledby=pwa-consent-layer-title]","div[class^=StyledConsentLayerWrapper-]"],detectCmp:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],detectPopup:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],optOut:[{click:"button[data-test^=pwa-consent-layer-deny-all]"}],optIn:[{click:"button[data-test^=pwa-consent-layer-accept-all"}]},{name:"Mediavine",prehideSelectors:['[data-name="mediavine-gdpr-cmp"]'],detectCmp:[{exists:'[data-name="mediavine-gdpr-cmp"]'}],detectPopup:[{wait:500},{visible:'[data-name="mediavine-gdpr-cmp"]'}],optIn:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [format="primary"]'}],optOut:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [data-view="manageSettings"]'},{waitFor:'[data-name="mediavine-gdpr-cmp"] input[type=checkbox]'},{eval:"EVAL_MEDIAVINE_0",optional:!0},{click:'[data-name="mediavine-gdpr-cmp"] [format="secondary"]'}]},{name:"medium",vendorUrl:"https://medium.com",cosmetic:!0,runContext:{main:!0,frame:!1,urlPattern:"^https://([a-z0-9-]+\\.)?medium\\.com/"},prehideSelectors:[],detectCmp:[{exists:'div:has(> div > div > div[role=alert] > a[href^="https://policy.medium.com/medium-privacy-policy-"])'}],detectPopup:[{visible:'div:has(> div > div > div[role=alert] > a[href^="https://policy.medium.com/medium-privacy-policy-"])'}],optIn:[{waitForThenClick:"[data-testid=close-button]"}],optOut:[{hide:'div:has(> div > div > div[role=alert] > a[href^="https://policy.medium.com/medium-privacy-policy-"])'}]},{name:"microsoft.com",prehideSelectors:["#wcpConsentBannerCtrl"],detectCmp:[{exists:"#wcpConsentBannerCtrl"}],detectPopup:[{exists:"#wcpConsentBannerCtrl"}],optOut:[{eval:"EVAL_MICROSOFT_0"}],optIn:[{eval:"EVAL_MICROSOFT_1"}],test:[{eval:"EVAL_MICROSOFT_2"}]},{name:"midway-usa",runContext:{urlPattern:"^https://www\\.midwayusa\\.com/"},cosmetic:!0,prehideSelectors:["#cookie-container"],detectCmp:[{exists:['div[aria-label="Cookie Policy Banner"]']}],detectPopup:[{visible:"#cookie-container"}],optIn:[{click:"button#cookie-btn"}],optOut:[{hide:'div[aria-label="Cookie Policy Banner"]'}]},{name:"moneysavingexpert.com",detectCmp:[{exists:"dialog[data-testid=accept-our-cookies-dialog]"}],detectPopup:[{visible:"dialog[data-testid=accept-our-cookies-dialog]"}],optIn:[{click:"#banner-accept"}],optOut:[{click:"#banner-manage"},{click:"#pc-confirm"}]},{name:"monzo.com",prehideSelectors:[".cookie-alert, cookie-alert__content"],detectCmp:[{exists:'div.cookie-alert[role="dialog"]'},{exists:'a[href*="monzo"]'}],detectPopup:[{visible:".cookie-alert__content"}],optIn:[{click:".js-accept-cookie-policy"}],optOut:[{click:".js-decline-cookie-policy"}]},{name:"Moove",prehideSelectors:["#moove_gdpr_cookie_info_bar"],detectCmp:[{exists:"#moove_gdpr_cookie_info_bar"}],detectPopup:[{visible:"#moove_gdpr_cookie_info_bar:not(.moove-gdpr-info-bar-hidden)"}],optIn:[{waitForThenClick:".moove-gdpr-infobar-allow-all"}],optOut:[{if:{exists:"#moove_gdpr_cookie_info_bar .change-settings-button"},then:[{click:"#moove_gdpr_cookie_info_bar .change-settings-button"},{waitForVisible:"#moove_gdpr_cookie_modal"},{eval:"EVAL_MOOVE_0"},{click:".moove-gdpr-modal-save-settings"}],else:[{hide:"#moove_gdpr_cookie_info_bar"}]}],test:[{visible:"#moove_gdpr_cookie_info_bar",check:"none"}]},{name:"national-lottery.co.uk",detectCmp:[{exists:".cuk_cookie_consent"}],detectPopup:[{visible:".cuk_cookie_consent",check:"any"}],optOut:[{click:".cuk_cookie_consent_manage_pref"},{click:".cuk_cookie_consent_save_pref"},{click:".cuk_cookie_consent_close"}],optIn:[{click:".cuk_cookie_consent_accept_all"}]},{name:"nba.com",runContext:{urlPattern:"^https://(www\\.)?nba.com/"},cosmetic:!0,prehideSelectors:["#onetrust-banner-sdk"],detectCmp:[{exists:"#onetrust-banner-sdk"}],detectPopup:[{visible:"#onetrust-banner-sdk"}],optIn:[{click:"#onetrust-accept-btn-handler"}],optOut:[{hide:"#onetrust-banner-sdk"}]},{name:"netbeat.de",runContext:{urlPattern:"^https://(www\\.)?netbeat\\.de/"},prehideSelectors:["div#cookieWarning"],detectCmp:[{exists:"div#cookieWarning"}],detectPopup:[{visible:"div#cookieWarning"}],optIn:[{waitForThenClick:"a#btnCookiesAcceptAll"}],optOut:[{waitForThenClick:"a#btnCookiesDenyAll"}]},{name:"netflix.de",detectCmp:[{exists:"#cookie-disclosure"}],detectPopup:[{visible:".cookie-disclosure-message",check:"any"}],optIn:[{click:".btn-accept"}],optOut:[{hide:"#cookie-disclosure"},{click:".btn-reject"}]},{name:"nhs.uk",prehideSelectors:["#nhsuk-cookie-banner"],detectCmp:[{exists:"#nhsuk-cookie-banner"}],detectPopup:[{exists:"#nhsuk-cookie-banner"}],optOut:[{click:"#nhsuk-cookie-banner__link_accept"}],optIn:[{click:"#nhsuk-cookie-banner__link_accept_analytics"}]},{name:"nike",vendorUrl:"https://nike.com",runContext:{urlPattern:"^https://(www\\.)?nike\\.com/"},prehideSelectors:[],detectCmp:[{exists:"[data-testid=cookie-dialog-root]"}],detectPopup:[{visible:"[data-testid=cookie-dialog-root]"}],optIn:[{waitForThenClick:"[data-testid=dialog-accept-button]"}],optOut:[{waitForThenClick:"input[type=radio][id$=-declineLabel]",all:!0},{waitForThenClick:"[data-testid=confirm-choice-button]"}]},{name:"notice-cookie",prehideSelectors:[".button--notice"],cosmetic:!0,detectCmp:[{exists:".notice--cookie"}],detectPopup:[{visible:".notice--cookie"}],optIn:[{click:".button--notice"}],optOut:[{hide:".notice--cookie"}]},{name:"nrk.no",cosmetic:!0,prehideSelectors:[".nrk-masthead__info-banner--cookie"],detectCmp:[{exists:".nrk-masthead__info-banner--cookie"}],detectPopup:[{exists:".nrk-masthead__info-banner--cookie"}],optIn:[{click:"div.nrk-masthead__info-banner--cookie button > span:has(+ svg.nrk-close)"}],optOut:[{hide:".nrk-masthead__info-banner--cookie"}]},{name:"obi.de",prehideSelectors:[".disc-cp--active"],detectCmp:[{exists:".disc-cp-modal__modal"}],detectPopup:[{visible:".disc-cp-modal__modal"}],optIn:[{click:".js-disc-cp-accept-all"}],optOut:[{click:".js-disc-cp-deny-all"}]},{name:"om",vendorUrl:"https://olli-machts.de/en/extension/cookie-manager",prehideSelectors:[".tx-om-cookie-consent"],detectCmp:[{exists:".tx-om-cookie-consent .active[data-omcookie-panel]"}],detectPopup:[{exists:".tx-om-cookie-consent .active[data-omcookie-panel]"}],optIn:[{waitForThenClick:"[data-omcookie-panel-save=all]"}],optOut:[{if:{exists:"[data-omcookie-panel-save=min]"},then:[{waitForThenClick:"[data-omcookie-panel-save=min]"}],else:[{click:"input[data-omcookie-panel-grp]:checked:not(:disabled)",all:!0,optional:!0},{waitForThenClick:"[data-omcookie-panel-save=save]"}]}]},{name:"onlyFans.com",runContext:{urlPattern:"^https://onlyfans\\.com/"},prehideSelectors:["div.b-cookies-informer"],detectCmp:[{exists:"div.b-cookies-informer"}],detectPopup:[{exists:"div.b-cookies-informer"}],optIn:[{click:"div.b-cookies-informer__nav > button:nth-child(2)"}],optOut:[{click:"div.b-cookies-informer__nav > button:nth-child(1)"},{if:{exists:"div.b-cookies-informer__switchers"},then:[{click:"div.b-cookies-informer__switchers input:not([disabled])",all:!0},{click:"div.b-cookies-informer__nav > button"}]}]},{name:"openai",vendorUrl:"https://platform.openai.com/",cosmetic:!1,runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?openai\\.com/"},prehideSelectors:["[data-testid=cookie-consent-banner]"],detectCmp:[{exists:"[data-testid=cookie-consent-banner]"}],detectPopup:[{visible:"[data-testid=cookie-consent-banner]"}],optIn:[{waitForThenClick:"xpath///button[contains(., 'Accept all')]"}],optOut:[{waitForThenClick:"xpath///button[contains(., 'Reject all')]"}],test:[{wait:500},{eval:"EVAL_OPENAI_TEST"}]},{name:"openli",vendorUrl:"https://openli.com",prehideSelectors:[".legalmonster-cleanslate"],detectCmp:[{exists:".legalmonster-cleanslate"}],detectPopup:[{visible:".legalmonster-cleanslate #lm-cookie-wall-container",check:"any"}],optIn:[{waitForThenClick:"#lm-accept-all"}],optOut:[{waitForThenClick:"#lm-accept-necessary"}]},{name:"opera.com",vendorUrl:"https://unknown",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,prehideSelectors:[],detectCmp:[{exists:"#cookie-consent .manage-cookies__btn"}],detectPopup:[{visible:"#cookie-consent .cookie-basic-consent__btn"}],optIn:[{waitForThenClick:"#cookie-consent .cookie-basic-consent__btn"}],optOut:[{waitForThenClick:"#cookie-consent .manage-cookies__btn"},{waitForThenClick:"#cookie-consent .active.marketing_option_switch.cookie-consent__switch",all:!0},{waitForThenClick:"#cookie-consent .cookie-selection__btn"}],test:[{eval:"EVAL_OPERA_0"}]},{name:"osano",prehideSelectors:[".osano-cm-window,.osano-cm-dialog"],detectCmp:[{exists:".osano-cm-window"}],detectPopup:[{visible:".osano-cm-dialog"}],optIn:[{click:".osano-cm-accept-all",optional:!0}],optOut:[{waitForThenClick:".osano-cm-denyAll"}]},{name:"otto.de",prehideSelectors:[".cookieBanner--visibility"],detectCmp:[{exists:".cookieBanner--visibility"}],detectPopup:[{visible:".cookieBanner__wrapper"}],optIn:[{click:".js_cookieBannerPermissionButton"}],optOut:[{click:".js_cookieBannerProhibitionButton"}]},{name:"ourworldindata",vendorUrl:"https://ourworldindata.org/",runContext:{urlPattern:"^https://ourworldindata\\.org/"},prehideSelectors:[".cookie-manager"],detectCmp:[{exists:".cookie-manager"}],detectPopup:[{visible:".cookie-manager .cookie-notice.open"}],optIn:[{waitForThenClick:".cookie-notice [data-test=accept]"}],optOut:[{waitForThenClick:".cookie-notice [data-test=reject]"}]},{name:"pabcogypsum",vendorUrl:"https://unknown",prehideSelectors:[".js-cookie-notice:has(#cookie_settings-form)"],detectCmp:[{exists:".js-cookie-notice #cookie_settings-form"}],detectPopup:[{visible:".js-cookie-notice #cookie_settings-form"}],optIn:[{waitForThenClick:".js-cookie-notice button[value=allow]"}],optOut:[{waitForThenClick:".js-cookie-notice button[value=disable]"}]},{name:"paypal-us",prehideSelectors:["#ccpaCookieContent_wrapper, article.ppvx_modal--overpanel"],detectCmp:[{exists:"#ccpaCookieBanner, .privacy-sheet-content"}],detectPopup:[{visible:"#ccpaCookieBanner, .privacy-sheet-content"}],optIn:[{click:"#acceptAllButton"}],optOut:[{if:{exists:"#bannerDeclineButton"},then:[{click:"#bannerDeclineButton"}],else:[{if:{exists:"a#manageCookiesLink"},then:[{click:"a#manageCookiesLink"}],else:[{waitForVisible:".privacy-sheet-content #formContent"},{click:"#formContent .cookiepref-11m2iee-checkbox_base input:checked",all:!0,optional:!0},{click:".cookieAction.saveCookie,.confirmCookie #submitCookiesBtn"}]}]}]},{name:"paypal.com",prehideSelectors:["#gdprCookieBanner"],detectCmp:[{exists:"#gdprCookieBanner"}],detectPopup:[{visible:"#gdprCookieContent_wrapper"}],optIn:[{click:"#acceptAllButton"}],optOut:[{wait:200},{click:".gdprCookieBanner_decline-button"}],test:[{wait:500},{eval:"EVAL_PAYPAL_0"}]},{name:"pinetools.com",cosmetic:!0,prehideSelectors:["#aviso_cookies"],detectCmp:[{exists:"#aviso_cookies"}],detectPopup:[{exists:".lang_en #aviso_cookies"}],optIn:[{click:"#aviso_cookies .a_boton_cerrar"}],optOut:[{hide:"#aviso_cookies"}]},{name:"pinterest-business",vendorUrl:"https://business.pinterest.com/",runContext:{urlPattern:"^https://.*\\.pinterest\\.com/"},prehideSelectors:[".BusinessCookieConsent"],detectCmp:[{exists:".BusinessCookieConsent"}],detectPopup:[{visible:".BusinessCookieConsent [data-id=cookie-consent-banner-buttons]"}],optIn:[{waitForThenClick:"[data-id=cookie-consent-banner-buttons] > div:nth-child(1) button"}],optOut:[{waitForThenClick:"[data-id=cookie-consent-banner-buttons] > div:nth-child(2) button"}]},{name:"pmc",cosmetic:!0,prehideSelectors:["#pmc-pp-tou--notice"],detectCmp:[{exists:"#pmc-pp-tou--notice"}],detectPopup:[{visible:"#pmc-pp-tou--notice"}],optIn:[{click:"span.pmc-pp-tou--notice-close-btn"}],optOut:[{hide:"#pmc-pp-tou--notice"}]},{name:"pornhub.com",runContext:{urlPattern:"^https://(www\\.)?pornhub\\.com/"},cosmetic:!1,prehideSelectors:["#cookieBanner #cookieBannerContent"],detectCmp:[{exists:"#cookieBanner #cookieBannerContent"}],detectPopup:[{visible:"#cookieBanner #cookieBannerContent"}],optIn:[{waitForThenClick:"#cookieBanner [data-label=accept_all]"}],optOut:[{waitForThenClick:"#cookieBanner [data-label=accept_essential]"}]},{name:"pornpics.com",cosmetic:!0,prehideSelectors:["#cookie-contract"],detectCmp:[{exists:"#cookie-contract"}],detectPopup:[{visible:"#cookie-contract"}],optIn:[{click:"#cookie-contract .icon-cross"}],optOut:[{hide:"#cookie-contract"}]},{name:"PrimeBox CookieBar",prehideSelectors:["#cookie-bar"],detectCmp:[{exists:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy"}],detectPopup:[{visible:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy",check:"any"}],optIn:[{waitForThenClick:"#cookie-bar .cb-enable"}],optOut:[{click:"#cookie-bar .cb-disable",optional:!0},{hide:"#cookie-bar"}],test:[{eval:"EVAL_PRIMEBOX_0"}]},{name:"privacymanager.io",prehideSelectors:["#gdpr-consent-tool-wrapper",'iframe[src^="https://cmp-consent-tool.privacymanager.io"]'],runContext:{urlPattern:"^https://cmp-consent-tool\\.privacymanager\\.io/",main:!1,frame:!0},detectCmp:[{exists:"button#save"}],detectPopup:[{visible:"button#save"}],optIn:[{click:"button#save"}],optOut:[{if:{exists:"#denyAll"},then:[{click:"#denyAll"},{waitForThenClick:".okButton"}],else:[{waitForThenClick:"#manageSettings"},{waitFor:".purposes-overview-list"},{waitFor:"button#saveAndExit"},{click:"span[role=checkbox][aria-checked=true]",all:!0,optional:!0},{click:"button#saveAndExit"}]}]},{name:"productz.com",vendorUrl:"https://productz.com/",runContext:{urlPattern:"^https://productz\\.com/"},prehideSelectors:[],detectCmp:[{exists:".c-modal.is-active"}],detectPopup:[{visible:".c-modal.is-active"}],optIn:[{waitForThenClick:".c-modal.is-active .is-accept"}],optOut:[{waitForThenClick:".c-modal.is-active .is-dismiss"}]},{name:"pubtech",prehideSelectors:["#pubtech-cmp"],detectCmp:[{exists:"#pubtech-cmp"}],detectPopup:[{visible:"#pubtech-cmp #pt-actions"}],optIn:[{if:{exists:"#pt-accept-all"},then:[{click:"#pubtech-cmp #pt-actions #pt-accept-all"}],else:[{click:"#pubtech-cmp #pt-actions button:nth-of-type(2)"}]}],optOut:[{click:"#pubtech-cmp #pt-close"}],test:[{eval:"EVAL_PUBTECH_0"}]},{name:"quantcast",prehideSelectors:["#qc-cmp2-main,#qc-cmp2-container"],detectCmp:[{exists:"#qc-cmp2-container"}],detectPopup:[{visible:"#qc-cmp2-ui"}],optOut:[{waitFor:'.qc-cmp2-summary-buttons > button[mode="secondary"]',timeout:2e3},{if:{exists:'.qc-cmp2-summary-buttons > button[mode="secondary"]:nth-of-type(2)'},then:[{click:'.qc-cmp2-summary-buttons > button[mode="secondary"]:nth-of-type(2)'}],else:[{click:'.qc-cmp2-summary-buttons > button[mode="secondary"]:nth-of-type(1)'},{waitFor:"#qc-cmp2-ui"},{click:'.qc-cmp2-toggle-switch > button[aria-checked="true"]',all:!0,optional:!0},{click:'.qc-cmp2-main button[aria-label="REJECT ALL"]',optional:!0},{waitForThenClick:'.qc-cmp2-main button[aria-label="SAVE & EXIT"],.qc-cmp2-buttons-desktop > button[mode="primary"]',timeout:5e3}]}],optIn:[{click:'.qc-cmp2-summary-buttons > button[mode="primary"]'}]},{name:"reddit.com",runContext:{urlPattern:"^https://www\\.reddit\\.com/"},prehideSelectors:["[bundlename=reddit_cookie_banner]"],detectCmp:[{exists:"reddit-cookie-banner"}],detectPopup:[{visible:"reddit-cookie-banner"}],optIn:[{waitForThenClick:["reddit-cookie-banner","#accept-all-cookies-button > button"]}],optOut:[{waitForThenClick:["reddit-cookie-banner","#reject-nonessential-cookies-button > button"]}],test:[{eval:"EVAL_REDDIT_0"}]},{name:"roblox",vendorUrl:"https://roblox.com",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?roblox\\.com/"},prehideSelectors:[],detectCmp:[{exists:".cookie-banner-wrapper"}],detectPopup:[{visible:".cookie-banner-wrapper .cookie-banner"}],optIn:[{waitForThenClick:".cookie-banner-wrapper button.btn-cta-lg"}],optOut:[{waitForThenClick:".cookie-banner-wrapper button.btn-secondary-lg"}],test:[{eval:"EVAL_ROBLOX_TEST"}]},{name:"rog-forum.asus.com",runContext:{urlPattern:"^https://rog-forum\\.asus\\.com/"},prehideSelectors:["#cookie-policy-info"],detectCmp:[{exists:"#cookie-policy-info"}],detectPopup:[{visible:"#cookie-policy-info"}],optIn:[{click:'div.cookie-btn-box > div[aria-label="Accept"]'}],optOut:[{click:'div.cookie-btn-box > div[aria-label="Reject"]'},{waitForThenClick:'.cookie-policy-lightbox-bottom > div[aria-label="Save Settings"]'}]},{name:"roofingmegastore.co.uk",runContext:{urlPattern:"^https://(www\\.)?roofingmegastore\\.co\\.uk"},prehideSelectors:["#m-cookienotice"],detectCmp:[{exists:"#m-cookienotice"}],detectPopup:[{visible:"#m-cookienotice"}],optIn:[{click:"#accept-cookies"}],optOut:[{click:"#manage-cookies"},{waitForThenClick:"#accept-selected"}]},{name:"samsung.com",runContext:{urlPattern:"^https://www\\.samsung\\.com/"},cosmetic:!0,prehideSelectors:["div.cookie-bar"],detectCmp:[{exists:"div.cookie-bar"}],detectPopup:[{visible:"div.cookie-bar"}],optIn:[{click:"div.cookie-bar__manage > a"}],optOut:[{hide:"div.cookie-bar"}]},{name:"setapp.com",vendorUrl:"https://setapp.com/",cosmetic:!0,runContext:{urlPattern:"^https://setapp\\.com/"},prehideSelectors:[],detectCmp:[{exists:".cookie-banner.js-cookie-banner"}],detectPopup:[{visible:".cookie-banner.js-cookie-banner"}],optIn:[{waitForThenClick:".cookie-banner.js-cookie-banner button"}],optOut:[{hide:".cookie-banner.js-cookie-banner"}]},{name:"sibbo",prehideSelectors:["sibbo-cmp-layout"],detectCmp:[{exists:"sibbo-cmp-layout"}],detectPopup:[{visible:"#rejectAllMain"}],optIn:[{click:"#acceptAllMain"}],optOut:[{click:"#rejectAllMain"}]},{name:"similarweb.com",cosmetic:!0,prehideSelectors:[".app-cookies-notification"],detectCmp:[{exists:".app-cookies-notification"}],detectPopup:[{exists:".app-layout .app-cookies-notification"}],optIn:[{click:"button.app-cookies-notification__dismiss"}],optOut:[{hide:".app-layout .app-cookies-notification"}]},{name:"Sirdata",cosmetic:!1,prehideSelectors:["#sd-cmp"],detectCmp:[{exists:"#sd-cmp"}],detectPopup:[{visible:"#sd-cmp"}],optIn:[{waitForThenClick:"#sd-cmp .sd-cmp-3cRQ2"}],optOut:[{waitForThenClick:["#sd-cmp","xpath///span[contains(., 'Do not accept') or contains(., 'Acceptera inte') or contains(., 'No aceptar') or contains(., 'Ikke acceptere') or contains(., 'Nicht akzeptieren') or contains(., 'Не приемам') or contains(., 'Να μην γίνει αποδοχή') or contains(., 'Niet accepteren') or contains(., 'Nepřijímat') or contains(., 'Nie akceptuj') or contains(., 'Nu acceptați') or contains(., 'Não aceitar') or contains(., 'Continuer sans accepter') or contains(., 'Non accettare') or contains(., 'Nem fogad el')]"]}]},{name:"skyscanner",vendorUrl:"https://skyscanner.com",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?skyscanner[\\.a-z]+/"},prehideSelectors:[".cookie-banner-wrapper"],detectCmp:[{exists:"#cookieBannerContent"}],detectPopup:[{visible:"#cookieBannerContent"}],optIn:[{waitForThenClick:"[data-tracking-element-id=cookie_banner_accept_all]"}],optOut:[{waitForThenClick:"[data-tracking-element-id=cookie_banner_essential_only]"},{waitForVisible:"#cookieBannerContent",check:"none"}],test:[{eval:"EVAL_SKYSCANNER_TEST"}]},{name:"snigel",detectCmp:[{exists:".snigel-cmp-framework"}],detectPopup:[{visible:".snigel-cmp-framework"}],optOut:[{click:"#sn-b-custom"},{click:"#sn-b-save"}],test:[{eval:"EVAL_SNIGEL_0"}],optIn:[{click:".snigel-cmp-framework #accept-choices"}]},{name:"steampowered.com",detectCmp:[{exists:".cookiepreferences_popup"},{visible:".cookiepreferences_popup"}],detectPopup:[{visible:".cookiepreferences_popup"}],optOut:[{click:"#rejectAllButton"}],optIn:[{click:"#acceptAllButton"}],test:[{wait:1e3},{eval:"EVAL_STEAMPOWERED_0"}]},{name:"strato.de",prehideSelectors:[".consent__wrapper"],runContext:{urlPattern:"^https://www\\.strato\\.de/"},detectCmp:[{exists:".consent"}],detectPopup:[{visible:".consent"}],optIn:[{click:"button.consentAgree"}],optOut:[{click:"button.consentSettings"},{waitForThenClick:"button#consentSubmit"}]},{name:"svt.se",vendorUrl:"https://www.svt.se/",runContext:{urlPattern:"^https://www\\.svt\\.se/"},prehideSelectors:["[class*=CookieConsent__root___]"],detectCmp:[{exists:"[class*=CookieConsent__root___]"}],detectPopup:[{visible:"[class*=CookieConsent__modal___]"}],optIn:[{waitForThenClick:"[class*=CookieConsent__modal___] > div > button[class*=primary]"}],optOut:[{waitForThenClick:"[class*=CookieConsent__modal___] > div > button[class*=secondary]:nth-child(2)"}],test:[{eval:"EVAL_SVT_TEST"}]},{name:"takealot.com",cosmetic:!0,prehideSelectors:['div[class^="cookies-banner-module_"]'],detectCmp:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],detectPopup:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],optIn:[{click:'button[class*="cookies-banner-module_dismiss-button_"]'}],optOut:[{hide:'div[class^="cookies-banner-module_"]'},{if:{exists:'div[class^="cookies-banner-module_small-cookie-banner_"]'},then:[{eval:"EVAL_TAKEALOT_0"}],else:[]}]},{name:"tarteaucitron.js",prehideSelectors:["#tarteaucitronRoot"],detectCmp:[{exists:"#tarteaucitronRoot"}],detectPopup:[{visible:"#tarteaucitronRoot #tarteaucitronAlertBig",check:"any"}],optIn:[{eval:"EVAL_TARTEAUCITRON_1"}],optOut:[{eval:"EVAL_TARTEAUCITRON_0"}],test:[{eval:"EVAL_TARTEAUCITRON_2",comment:"sometimes there are required categories, so we check that at least something is false"}]},{name:"taunton",vendorUrl:"https://www.taunton.com/",prehideSelectors:["#taunton-user-consent__overlay"],detectCmp:[{exists:"#taunton-user-consent__overlay"}],detectPopup:[{exists:"#taunton-user-consent__overlay:not([aria-hidden=true])"}],optIn:[{click:"#taunton-user-consent__toolbar input[type=checkbox]:not(:checked)"},{click:"#taunton-user-consent__toolbar button[type=submit]"}],optOut:[{click:"#taunton-user-consent__toolbar input[type=checkbox]:checked",optional:!0,all:!0},{click:"#taunton-user-consent__toolbar button[type=submit]"}],test:[{eval:"EVAL_TAUNTON_TEST"}]},{name:"Tealium",prehideSelectors:["#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs,#__tealiumImplicitmodal,#consent-layer"],detectCmp:[{exists:"#__tealiumGDPRecModal *,#__tealiumGDPRcpPrefs *,#__tealiumImplicitmodal *"},{eval:"EVAL_TEALIUM_0"}],detectPopup:[{visible:"#__tealiumGDPRecModal *,#__tealiumGDPRcpPrefs *,#__tealiumImplicitmodal *",check:"any"}],optOut:[{eval:"EVAL_TEALIUM_1"},{eval:"EVAL_TEALIUM_DONOTSELL"},{hide:"#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs,#__tealiumImplicitmodal"},{waitForThenClick:"#cm-acceptNone,.js-accept-essential-cookies,#continueWithoutAccepting",timeout:1e3,optional:!0}],optIn:[{hide:"#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs"},{eval:"EVAL_TEALIUM_2"}],test:[{eval:"EVAL_TEALIUM_3"},{eval:"EVAL_TEALIUM_DONOTSELL_CHECK"},{visible:"#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs",check:"none"}]},{name:"temu",vendorUrl:"https://temu.com",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?temu\\.com/"},prehideSelectors:[],detectCmp:[{exists:'div > div > div > div > span[href*="/cookie-and-similar-technologies-policy.html"]'}],detectPopup:[{visible:'div > div > div > div > span[href*="/cookie-and-similar-technologies-policy.html"]'}],optIn:[{waitForThenClick:'div > div > div:has(> div > span[href*="/cookie-and-similar-technologies-policy.html"]) > [role=button]:nth-child(3)'}],optOut:[{if:{exists:"xpath///span[contains(., 'Alle afwijzen') or contains(., 'Reject all') or contains(., 'Tümünü reddet') or contains(., 'Odrzuć wszystko')]"},then:[{waitForThenClick:"xpath///span[contains(., 'Alle afwijzen') or contains(., 'Reject all') or contains(., 'Tümünü reddet') or contains(., 'Odrzuć wszystko')]"}],else:[{waitForThenClick:'div > div > div:has(> div > span[href*="/cookie-and-similar-technologies-policy.html"]) > [role=button]:nth-child(2)'}]}]},{name:"Termly",prehideSelectors:["#termly-code-snippet-support"],detectCmp:[{exists:"#termly-code-snippet-support"}],detectPopup:[{visible:"#termly-code-snippet-support div"}],optIn:[{waitForThenClick:'[data-tid="banner-accept"]'}],optOut:[{if:{exists:'[data-tid="banner-decline"]'},then:[{click:'[data-tid="banner-decline"]'}],else:[{click:".t-preference-button"},{wait:500},{if:{exists:".t-declineAllButton"},then:[{click:".t-declineAllButton"}],else:[{waitForThenClick:".t-preference-modal input[type=checkbox][checked]:not([disabled])",all:!0},{waitForThenClick:".t-saveButton"}]}]}]},{name:"termsfeed",vendorUrl:"https://termsfeed.com",comment:"v4.x.x",prehideSelectors:[".termsfeed-com---nb"],detectCmp:[{exists:".termsfeed-com---nb"}],detectPopup:[{visible:".termsfeed-com---nb"}],optIn:[{waitForThenClick:".cc-nb-okagree"}],optOut:[{waitForThenClick:".cc-nb-reject"}]},{name:"termsfeed3",vendorUrl:"https://termsfeed.com",comment:"v3.x.x",prehideSelectors:[".cc_dialog.cc_css_reboot,.cc_overlay_lock"],detectCmp:[{exists:".cc_dialog.cc_css_reboot"}],detectPopup:[{visible:".cc_dialog.cc_css_reboot"}],optIn:[{waitForThenClick:".cc_dialog.cc_css_reboot .cc_b_ok"}],optOut:[{if:{exists:".cc_dialog.cc_css_reboot .cc_b_cp"},then:[{click:".cc_dialog.cc_css_reboot .cc_b_cp"},{waitForVisible:".cookie-consent-preferences-dialog .cc_cp_f_save button"},{waitForThenClick:".cookie-consent-preferences-dialog .cc_cp_f_save button"}],else:[{hide:".cc_dialog.cc_css_reboot,.cc_overlay_lock"}]}]},{name:"tesco",vendorUrl:"https://www.tesco.com",cosmetic:!1,runContext:{urlPattern:"^https://(www\\.)?tesco\\.com/"},prehideSelectors:["[class*=CookieBanner__Sizer]"],detectCmp:[{exists:"[aria-label=consent-banner]"}],detectPopup:[{visible:"[aria-label=consent-banner]"}],optIn:[{wait:1e3},{waitForThenClick:"xpath///button[contains(., 'Accept all')]"}],optOut:[{wait:1e3},{waitForThenClick:"xpath///button[contains(., 'Reject all')]"}]},{name:"tesla",vendorUrl:"https://tesla.com/",runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?tesla\\.com/"},prehideSelectors:[],detectCmp:[{exists:"#cookie_banner"}],detectPopup:[{visible:"#cookie_banner"}],optIn:[{waitForThenClick:"#tsla-accept-cookie"}],optOut:[{waitForThenClick:"#tsla-reject-cookie"}],test:[{eval:"EVAL_TESLA_TEST"}]},{name:"Test page cosmetic CMP",cosmetic:!0,prehideSelectors:["#privacy-test-page-cmp-test-prehide"],detectCmp:[{exists:"#privacy-test-page-cmp-test-banner"}],detectPopup:[{visible:"#privacy-test-page-cmp-test-banner"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{hide:"#privacy-test-page-cmp-test-banner"}],test:[{wait:500},{eval:"EVAL_TESTCMP_COSMETIC_0"}]},{name:"Test page CMP",prehideSelectors:["#reject-all"],detectCmp:[{exists:"#privacy-test-page-cmp-test"}],detectPopup:[{visible:"#privacy-test-page-cmp-test"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{waitFor:"#reject-all"},{eval:"EVAL_TESTCMP_STEP"},{click:"#reject-all"}],test:[{eval:"EVAL_TESTCMP_0"}]},{name:"thalia.de",prehideSelectors:[".consent-banner-box"],detectCmp:[{exists:"consent-banner[component=consent-banner]"}],detectPopup:[{visible:".consent-banner-box"}],optIn:[{click:".button-zustimmen"}],optOut:[{click:"button[data-consent=disagree]"}]},{name:"thefreedictionary.com",prehideSelectors:["#cmpBanner"],detectCmp:[{exists:"#cmpBanner"}],detectPopup:[{visible:"#cmpBanner"}],optIn:[{eval:"EVAL_THEFREEDICTIONARY_1"}],optOut:[{eval:"EVAL_THEFREEDICTIONARY_0"}]},{name:"theverge",runContext:{frame:!1,main:!0,urlPattern:"^https://(www)?\\.theverge\\.com"},intermediate:!1,prehideSelectors:[".duet--cta--cookie-banner"],detectCmp:[{exists:".duet--cta--cookie-banner"}],detectPopup:[{visible:".duet--cta--cookie-banner"}],optIn:[{click:".duet--cta--cookie-banner button.tracking-12",all:!1}],optOut:[{click:".duet--cta--cookie-banner button.tracking-12 > span"}],test:[{eval:"EVAL_THEVERGE_0"}]},{name:"tidbits-com",cosmetic:!0,prehideSelectors:["#eu_cookie_law_widget-2"],detectCmp:[{exists:"#eu_cookie_law_widget-2"}],detectPopup:[{visible:"#eu_cookie_law_widget-2"}],optIn:[{click:"#eu-cookie-law form > input.accept"}],optOut:[{hide:"#eu_cookie_law_widget-2"}]},{name:"tractor-supply",runContext:{urlPattern:"^https://www\\.tractorsupply\\.com/"},cosmetic:!0,prehideSelectors:[".tsc-cookie-banner"],detectCmp:[{exists:".tsc-cookie-banner"}],detectPopup:[{visible:".tsc-cookie-banner"}],optIn:[{click:"#cookie-banner-cancel"}],optOut:[{hide:".tsc-cookie-banner"}]},{name:"trader-joes-com",cosmetic:!0,prehideSelectors:['div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'],detectCmp:[{exists:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],detectPopup:[{visible:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],optIn:[{click:'div[class^="CookiesAlert_cookiesAlert__container__"] button'}],optOut:[{hide:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}]},{name:"transcend",vendorUrl:"https://unknown",cosmetic:!0,prehideSelectors:["#transcend-consent-manager"],detectCmp:[{exists:"#transcend-consent-manager"}],detectPopup:[{visible:"#transcend-consent-manager"}],optIn:[{waitForThenClick:["#transcend-consent-manager","#consentManagerMainDialog .inner-container button"]}],optOut:[{hide:"#transcend-consent-manager"}]},{name:"transip-nl",runContext:{urlPattern:"^https://www\\.transip\\.nl/"},prehideSelectors:["#consent-modal"],detectCmp:[{any:[{exists:"#consent-modal"},{exists:"#privacy-settings-content"}]}],detectPopup:[{any:[{visible:"#consent-modal"},{visible:"#privacy-settings-content"}]}],optIn:[{click:'button[type="submit"]'}],optOut:[{if:{exists:"#privacy-settings-content"},then:[{click:'button[type="submit"]'}],else:[{click:"div.one-modal__action-footer-column--secondary > a"}]}]},{name:"tropicfeel-com",prehideSelectors:["#shopify-section-cookies-controller"],detectCmp:[{exists:"#shopify-section-cookies-controller"}],detectPopup:[{visible:"#shopify-section-cookies-controller #cookies-controller-main-pane",check:"any"}],optIn:[{waitForThenClick:"#cookies-controller-main-pane form[data-form-allow-all] button"}],optOut:[{click:"#cookies-controller-main-pane a[data-tab-target=manage-cookies]"},{waitFor:"#manage-cookies-pane.active"},{click:"#manage-cookies-pane.active input[type=checkbox][checked]:not([disabled])",all:!0},{click:"#manage-cookies-pane.active button[type=submit]"}],test:[]},{name:"true-car",runContext:{urlPattern:"^https://www\\.truecar\\.com/"},cosmetic:!0,prehideSelectors:[['div[aria-labelledby="cookie-banner-heading"]']],detectCmp:[{exists:'div[aria-labelledby="cookie-banner-heading"]'}],detectPopup:[{visible:'div[aria-labelledby="cookie-banner-heading"]'}],optIn:[{click:'div[aria-labelledby="cookie-banner-heading"] > button[aria-label="Close"]'}],optOut:[{hide:'div[aria-labelledby="cookie-banner-heading"]'}]},{name:"truyo",prehideSelectors:["#truyo-consent-module"],detectCmp:[{exists:"#truyo-cookieBarContent"}],detectPopup:[{visible:"#truyo-consent-module"}],optIn:[{click:"button#acceptAllCookieButton"}],optOut:[{click:"button#declineAllCookieButton"}]},{name:"twcc",vendorUrl:"https://unknown",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:""},prehideSelectors:["#twcc__mechanism"],detectCmp:[{exists:"#twcc__mechanism .twcc__notice"}],detectPopup:[{visible:"#twcc__mechanism .twcc__notice"}],optIn:[{waitForThenClick:"#twcc__accept-button"}],optOut:[{waitForThenClick:"#twcc__decline-button"}],test:[{eval:"EVAL_TWCC_TEST"}]},{name:"twitch-mobile",vendorUrl:"https://m.twitch.tv/",cosmetic:!0,runContext:{urlPattern:"^https?://m\\.twitch\\.tv"},prehideSelectors:[],detectCmp:[{exists:'.ReactModal__Overlay [href="https://www.twitch.tv/p/cookie-policy"]'}],detectPopup:[{visible:'.ReactModal__Overlay [href="https://www.twitch.tv/p/cookie-policy"]'}],optIn:[{waitForThenClick:'.ReactModal__Overlay:has([href="https://www.twitch.tv/p/cookie-policy"]) button'}],optOut:[{hide:'.ReactModal__Overlay:has([href="https://www.twitch.tv/p/cookie-policy"])'}]},{name:"twitch.tv",runContext:{urlPattern:"^https?://(www\\.)?twitch\\.tv"},prehideSelectors:["div:has(> .consent-banner .consent-banner__content--gdpr-v2),.ReactModalPortal:has([data-a-target=consent-modal-save])"],detectCmp:[{exists:".consent-banner .consent-banner__content--gdpr-v2"}],detectPopup:[{visible:".consent-banner .consent-banner__content--gdpr-v2"}],optIn:[{click:'button[data-a-target="consent-banner-accept"]'}],optOut:[{hide:"div:has(> .consent-banner .consent-banner__content--gdpr-v2)"},{click:'button[data-a-target="consent-banner-manage-preferences"]'},{waitFor:"input[type=checkbox][data-a-target=tw-checkbox]"},{click:"input[type=checkbox][data-a-target=tw-checkbox][checked]:not([disabled])",all:!0,optional:!0},{waitForThenClick:"[data-a-target=consent-modal-save]"},{waitForVisible:".ReactModalPortal:has([data-a-target=consent-modal-save])",check:"none"}]},{name:"twitter",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?(twitter|x)\\.com/"},prehideSelectors:['[data-testid="BottomBar"]'],detectCmp:[{exists:'[data-testid="BottomBar"] div'}],detectPopup:[{visible:'[data-testid="BottomBar"] div'}],optIn:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>button[role=button]>span) > div:last-child > button[role=button]:first-child'}],optOut:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>button[role=button]>span) > div:last-child > button[role=button]:last-child'}],TODOtest:[{eval:"EVAL_document.cookie.includes('d_prefs=MjoxLGNvbnNlbnRfdmVyc2lvbjoy')"}]},{name:"ubuntu.com",prehideSelectors:["dialog.cookie-policy"],detectCmp:[{any:[{exists:"dialog.cookie-policy header"},{exists:'xpath///*[@id="modal"]/div/header'}]}],detectPopup:[{any:[{visible:"dialog header"},{visible:'xpath///*[@id="modal"]/div/header'}]}],optIn:[{any:[{waitForThenClick:"#cookie-policy-button-accept"},{waitForThenClick:'xpath///*[@id="cookie-policy-button-accept"]'}]}],optOut:[{any:[{waitForThenClick:"button.js-manage"},{waitForThenClick:'xpath///*[@id="cookie-policy-content"]/p[4]/button[2]'}]},{waitForThenClick:"dialog.cookie-policy .p-switch__input:checked",optional:!0,all:!0,timeout:500},{any:[{waitForThenClick:"dialog.cookie-policy .js-save-preferences"},{waitForThenClick:'xpath///*[@id="modal"]/div/button'}]}],test:[{eval:"EVAL_UBUNTU_COM_0"}]},{name:"UK Cookie Consent",prehideSelectors:["#catapult-cookie-bar"],cosmetic:!0,detectCmp:[{exists:"#catapult-cookie-bar"}],detectPopup:[{exists:".has-cookie-bar #catapult-cookie-bar"}],optIn:[{click:"#catapultCookie"}],optOut:[{hide:"#catapult-cookie-bar"}],test:[{eval:"EVAL_UK_COOKIE_CONSENT_0"}]},{name:"urbanarmorgear-com",cosmetic:!0,prehideSelectors:['div[class^="Layout__CookieBannerContainer-"]'],detectCmp:[{exists:'div[class^="Layout__CookieBannerContainer-"]'}],detectPopup:[{visible:'div[class^="Layout__CookieBannerContainer-"]'}],optIn:[{click:'button[class^="CookieBanner__AcceptButton"]'}],optOut:[{hide:'div[class^="Layout__CookieBannerContainer-"]'}]},{name:"usercentrics-api",detectCmp:[{exists:"#usercentrics-root,#usercentrics-cmp-ui"}],detectPopup:[{eval:"EVAL_USERCENTRICS_API_0"},{if:{exists:"#usercentrics-cmp-ui"},then:[{waitForVisible:"#usercentrics-cmp-ui",timeout:2e3}],else:[{exists:["#usercentrics-root","[data-testid=uc-container]"]},{waitForVisible:"#usercentrics-root",timeout:2e3}]}],optIn:[{eval:"EVAL_USERCENTRICS_API_3"},{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_5"}],optOut:[{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_2"}],test:[{eval:"EVAL_USERCENTRICS_API_6"}]},{name:"usercentrics-button",detectCmp:[{exists:"#usercentrics-button"}],detectPopup:[{visible:"#usercentrics-button #uc-btn-accept-banner"}],optIn:[{click:"#usercentrics-button #uc-btn-accept-banner"}],optOut:[{click:"#usercentrics-button #uc-btn-deny-banner"}],test:[{eval:"EVAL_USERCENTRICS_BUTTON_0"}]},{name:"uswitch.com",runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?uswitch\\.com/"},prehideSelectors:[".ucb"],detectCmp:[{exists:".ucb-banner"}],detectPopup:[{visible:".ucb-banner"}],optIn:[{waitForThenClick:".ucb-banner .ucb-btn-accept"}],optOut:[{waitForThenClick:".ucb-banner .ucb-btn-save"}]},{name:"vodafone.de",runContext:{urlPattern:"^https://www\\.vodafone\\.de/"},prehideSelectors:[".dip-consent,.dip-consent-container"],detectCmp:[{exists:".dip-consent-container"}],detectPopup:[{visible:".dip-consent-content"}],optOut:[{click:'.dip-consent-btn[tabindex="2"]'}],optIn:[{click:'.dip-consent-btn[tabindex="1"]'}]},{name:"waitrose.com",prehideSelectors:["div[aria-labelledby=CookieAlertModalHeading]","section[data-test=initial-waitrose-cookie-consent-banner]","section[data-test=cookie-consent-modal]"],detectCmp:[{exists:"section[data-test=initial-waitrose-cookie-consent-banner]"}],detectPopup:[{visible:"section[data-test=initial-waitrose-cookie-consent-banner]"}],optIn:[{click:"button[data-test=accept-all]"}],optOut:[{click:"button[data-test=manage-cookies]"},{wait:200},{eval:"EVAL_WAITROSE_0"},{click:"button[data-test=submit]"}],test:[{eval:"EVAL_WAITROSE_1"}]},{name:"webflow",vendorUrl:"https://webflow.com/",prehideSelectors:[".fs-cc-components"],detectCmp:[{exists:".fs-cc-components"}],detectPopup:[{visible:".fs-cc-components"},{visible:"[fs-cc=banner]"}],optIn:[{wait:500},{waitForThenClick:"[fs-cc=banner] [fs-cc=allow]"}],optOut:[{wait:500},{waitForThenClick:"[fs-cc=banner] [fs-cc=deny]"}]},{name:"wetransfer.com",detectCmp:[{exists:".welcome__cookie-notice"}],detectPopup:[{visible:".welcome__cookie-notice"}],optIn:[{click:".welcome__button--accept"}],optOut:[{click:".welcome__button--decline"}]},{name:"whitepages.com",runContext:{urlPattern:"^https://www\\.whitepages\\.com/"},cosmetic:!0,prehideSelectors:[".cookie-wrapper, .cookie-overlay"],detectCmp:[{exists:".cookie-wrapper"}],detectPopup:[{visible:".cookie-overlay"}],optIn:[{click:'button[aria-label="Got it"]'}],optOut:[{hide:".cookie-wrapper"}]},{name:"wolframalpha",vendorUrl:"https://www.wolframalpha.com",prehideSelectors:[],cosmetic:!0,runContext:{urlPattern:"^https://www\\.wolframalpha\\.com/"},detectCmp:[{exists:"section._a_yb"}],detectPopup:[{visible:"section._a_yb"}],optIn:[{waitForThenClick:"section._a_yb button"}],optOut:[{hide:"section._a_yb"}]},{name:"woo-commerce-com",prehideSelectors:[".wccom-comp-privacy-banner .wccom-privacy-banner"],detectCmp:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],detectPopup:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],optIn:[{click:".wccom-privacy-banner__content-buttons button.is-primary"}],optOut:[{click:".wccom-privacy-banner__content-buttons button.is-secondary"},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:"div.wccom-modal__footer > button"}]},{name:"WP Cookie Notice for GDPR",vendorUrl:"https://wordpress.org/plugins/gdpr-cookie-consent/",prehideSelectors:["#gdpr-cookie-consent-bar"],detectCmp:[{exists:"#gdpr-cookie-consent-bar"}],detectPopup:[{visible:"#gdpr-cookie-consent-bar"}],optIn:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_accept"}],optOut:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_reject"}],test:[{eval:"EVAL_WP_COOKIE_NOTICE_0"}]},{name:"wpcc",cosmetic:!0,prehideSelectors:[".wpcc-container"],detectCmp:[{exists:".wpcc-container"}],detectPopup:[{exists:".wpcc-container .wpcc-message"}],optIn:[{click:".wpcc-compliance .wpcc-btn"}],optOut:[{hide:".wpcc-container"}]},{name:"xe.com",vendorUrl:"https://www.xe.com/",runContext:{urlPattern:"^https://www\\.xe\\.com/"},prehideSelectors:["[class*=ConsentBanner]"],detectCmp:[{exists:"[class*=ConsentBanner]"}],detectPopup:[{visible:"[class*=ConsentBanner]"}],optIn:[{waitForThenClick:"[class*=ConsentBanner] .egnScw"}],optOut:[{wait:1e3},{waitForThenClick:"[class*=ConsentBanner] .frDWEu"},{waitForThenClick:"[class*=ConsentBanner] .hXIpFU"}],test:[{eval:"EVAL_XE_TEST"}]},{name:"xhamster-eu",prehideSelectors:[".cookies-modal"],detectCmp:[{exists:".cookies-modal"}],detectPopup:[{exists:".cookies-modal"}],optIn:[{click:"button.cmd-button-accept-all"}],optOut:[{click:"button.cmd-button-reject-all"}]},{name:"xhamster-us",runContext:{urlPattern:"^https://(www\\.)?xhamster\\d?\\.com"},cosmetic:!0,prehideSelectors:[".cookie-announce"],detectCmp:[{exists:".cookie-announce"}],detectPopup:[{visible:".cookie-announce .announce-text"}],optIn:[{click:".cookie-announce button.xh-button"}],optOut:[{hide:".cookie-announce"}]},{name:"xing.com",detectCmp:[{exists:"div[class^=cookie-consent-CookieConsent]"}],detectPopup:[{exists:"div[class^=cookie-consent-CookieConsent]"}],optIn:[{click:"#consent-accept-button"}],optOut:[{click:"#consent-settings-button"},{click:".consent-banner-button-accept-overlay"}],test:[{eval:"EVAL_XING_0"}]},{name:"xnxx-com",cosmetic:!0,prehideSelectors:["#cookies-use-alert"],detectCmp:[{exists:"#cookies-use-alert"}],detectPopup:[{visible:"#cookies-use-alert"}],optIn:[{click:"#cookies-use-alert .close"}],optOut:[{hide:"#cookies-use-alert"}]},{name:"xvideos",vendorUrl:"https://xvideos.com",runContext:{urlPattern:"^https://[^/]*xvideos\\.com/"},prehideSelectors:[],detectCmp:[{exists:".disclaimer-opened #disclaimer-cookies"}],detectPopup:[{visible:".disclaimer-opened #disclaimer-cookies"}],optIn:[{waitForThenClick:"#disclaimer-accept_cookies"}],optOut:[{waitForThenClick:"#disclaimer-reject_cookies"}]},{name:"Yahoo",runContext:{urlPattern:"^https://consent\\.yahoo\\.com/v2/"},prehideSelectors:["#reject-all"],detectCmp:[{exists:"#consent-page"}],detectPopup:[{visible:"#consent-page"}],optIn:[{waitForThenClick:"#consent-page button[value=agree]"}],optOut:[{waitForThenClick:"#consent-page button[value=reject]"}]},{name:"youporn.com",cosmetic:!0,prehideSelectors:[".euCookieModal, #js_euCookieModal"],detectCmp:[{exists:".euCookieModal"}],detectPopup:[{exists:".euCookieModal, #js_euCookieModal"}],optIn:[{click:'button[name="user_acceptCookie"]'}],optOut:[{hide:".euCookieModal"}]},{name:"youtube-desktop",prehideSelectors:["tp-yt-iron-overlay-backdrop.opened","ytd-consent-bump-v2-lightbox"],detectCmp:[{exists:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"},{exists:'ytd-consent-bump-v2-lightbox tp-yt-paper-dialog a[href^="https://consent.youtube.com/"]'}],detectPopup:[{visible:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"}],optIn:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child button"},{wait:500}],optOut:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_DESKTOP_0"}]},{name:"youtube-mobile",prehideSelectors:[".consent-bump-v2-lightbox"],detectCmp:[{exists:"ytm-consent-bump-v2-renderer"}],detectPopup:[{visible:"ytm-consent-bump-v2-renderer"}],optIn:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:first-child button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:first-child button"},{wait:500}],optOut:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:nth-child(2) button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:nth-child(2) button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_MOBILE_0"}]},{name:"zdf",prehideSelectors:["#zdf-cmp-banner-sdk"],detectCmp:[{exists:"#zdf-cmp-banner-sdk"}],detectPopup:[{visible:"#zdf-cmp-main.zdf-cmp-show"}],optIn:[{waitForThenClick:"#zdf-cmp-main #zdf-cmp-accept-btn"}],optOut:[{waitForThenClick:"#zdf-cmp-main #zdf-cmp-deny-btn"}],test:[]},{name:"zentralruf-de",runContext:{urlPattern:"^https://(www\\.)?zentralruf\\.de"},prehideSelectors:["#cookie_modal_wrapper"],detectCmp:[{exists:"#cookie_modal_wrapper"}],detectPopup:[{visible:"#cookie_modal_wrapper"}],optIn:[{waitForThenClick:"#cookie_modal_wrapper #cookie_modal_button_consent_all"}],optOut:[{waitForThenClick:"#cookie_modal_wrapper #cookie_modal_button_choose"}]}],kn={"didomi.io":{detectors:[{presentMatcher:{target:{selector:"#didomi-host, #didomi-notice"},type:"css"},showingMatcher:{target:{selector:"body.didomi-popup-open, .didomi-notice-banner"},type:"css"}}],methods:[{action:{target:{selector:".didomi-popup-notice-buttons .didomi-button:not(.didomi-button-highlight), .didomi-notice-banner .didomi-learn-more-button"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{retries:50,target:{selector:"#didomi-purpose-cookies"},type:"waitcss",waitTime:50},{consents:[{description:"Share (everything) with others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:last-child"},type:"click"},type:"X"},{description:"Information storage and access",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:last-child"},type:"click"},type:"D"},{description:"Content selection, offers and marketing",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:last-child"},type:"click"},type:"E"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:last-child"},type:"click"},type:"B"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:last-child"},type:"click"},type:"B"},{description:"Ad and content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection",falseAction:{parent:{childFilter:{target:{selector:"#didomi-purpose-pub-ciblee"}},selector:".didomi-consent-popup-data-processing, .didomi-components-accordion-label-container"},target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - basics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - partners and subsidiaries",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:last-child"},type:"click"},type:"F"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:last-child"},type:"click"},type:"A"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:last-child"},type:"click"},type:"A"},{description:"Content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:last-child"},type:"click"},type:"E"},{description:"Ad delivery",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:last-child"},type:"click"},type:"F"}],type:"consent"},{action:{consents:[{matcher:{childFilter:{target:{selector:":not(.didomi-components-radio__option--selected)"}},type:"css"},trueAction:{target:{selector:":nth-child(2)"},type:"click"},falseAction:{target:{selector:":first-child"},type:"click"},type:"X"}],type:"consent"},target:{selector:".didomi-components-radio"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".didomi-consent-popup-footer .didomi-consent-popup-actions"},target:{selector:".didomi-components-button:first-child"},type:"click"},name:"SAVE_CONSENT"}]},oil:{detectors:[{presentMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"},showingMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".as-js-advanced-settings"},type:"click"},{retries:"10",target:{selector:".as-oil-cpc__purpose-container"},type:"waitcss",waitTime:"250"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{consents:[{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"D"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"B"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:".as-oil__btn-optin"},type:"click"},name:"SAVE_CONSENT"},{action:{target:{selector:"div.as-oil"},type:"hide"},name:"HIDE_CMP"}]},optanon:{detectors:[{presentMatcher:{target:{selector:"#optanon-menu, .optanon-alert-box-wrapper"},type:"css"},showingMatcher:{target:{displayFilter:!0,selector:".optanon-alert-box-wrapper"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".optanon-alert-box-wrapper .optanon-toggle-display, a[onclick*='OneTrust.ToggleInfoDisplay()'], a[onclick*='Optanon.ToggleInfoDisplay()']"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".preference-menu-item #Your-privacy"},type:"click"},{target:{selector:"#optanon-vendor-consent-text"},type:"click"},{action:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},target:{selector:"#optanon-vendor-consent-list .vendor-item"},type:"foreach"},{target:{selector:".vendor-consent-back-link"},type:"click"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"D"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".optanon-save-settings-button"},target:{selector:".optanon-white-button-middle"},type:"click"},name:"SAVE_CONSENT"},{action:{actions:[{target:{selector:"#optanon-popup-wrapper"},type:"hide"},{target:{selector:"#optanon-popup-bg"},type:"hide"},{target:{selector:".optanon-alert-box-wrapper"},type:"hide"}],type:"list"},name:"HIDE_CMP"}]},quantcast2:{detectors:[{presentMatcher:{target:{selector:"[data-tracking-opt-in-overlay]"},type:"css"},showingMatcher:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"css"}}],methods:[{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{type:"wait",waitTime:500},{action:{actions:[{target:{selector:"div",textFilter:["Information storage and access"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"D"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Personalization"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Ad selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Content selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"E"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Measurement"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"B"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Other Partners"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},type:"ifcss"}],type:"list"},parent:{childFilter:{target:{selector:"input"}},selector:"[data-tracking-opt-in-overlay] > div > div"},target:{childFilter:{target:{selector:"input"}},selector:":scope > div"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-save]"},type:"click"},name:"SAVE_CONSENT"}]},springer:{detectors:[{presentMatcher:{parent:null,target:{selector:".cmp-app_gdpr"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".cmp-popup_popup"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".cmp-intro_rejectAll"},type:"click"},{type:"wait",waitTime:250},{target:{selector:".cmp-purposes_purposeItem:not(.cmp-purposes_selectedPurpose)"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{consents:[{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"D"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"}],type:"consent"},name:"DO_CONSENT"},{action:{target:{selector:".cmp-details_save"},type:"click"},name:"SAVE_CONSENT"}]},wordpressgdpr:{detectors:[{presentMatcher:{parent:null,target:{selector:".wpgdprc-consent-bar"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".wpgdprc-consent-bar"},type:"css"}}],methods:[{action:{parent:null,target:{selector:".wpgdprc-consent-bar .wpgdprc-consent-bar__settings",textFilter:null},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Eyeota"},type:"click"},{consents:[{description:"Eyeota Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Advertising"},type:"click"},{consents:[{description:"Advertising Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{parent:null,target:{selector:".wpgdprc-button",textFilter:"Save my settings"},type:"click"},name:"SAVE_CONSENT"}]}},bn={autoconsent:fn,consentomatic:kn},yn=Object.freeze({__proto__:null,autoconsent:fn,consentomatic:kn,default:bn}); +!function(){"use strict";var e=class e{static setBase(t){e.base=t}static findElement(t,o=null,i=!1){let c=null;return c=null!=o?Array.from(o.querySelectorAll(t.selector)):null!=e.base?Array.from(e.base.querySelectorAll(t.selector)):Array.from(document.querySelectorAll(t.selector)),null!=t.textFilter&&(c=c.filter((e=>{const o=e.textContent.toLowerCase();if(Array.isArray(t.textFilter)){let e=!1;for(const i of t.textFilter)if(-1!==o.indexOf(i.toLowerCase())){e=!0;break}return e}return null!=t.textFilter&&-1!==o.indexOf(t.textFilter.toLowerCase())}))),null!=t.styleFilters&&(c=c.filter((e=>{const o=window.getComputedStyle(e);let i=!0;for(const e of t.styleFilters){const t=o[e.option];i=e.negated?i&&t!==e.value:i&&t===e.value}return i}))),null!=t.displayFilter&&(c=c.filter((e=>t.displayFilter?0!==e.offsetHeight:0===e.offsetHeight))),null!=t.iframeFilter&&(c=c.filter((()=>t.iframeFilter?window.location!==window.parent.location:window.location===window.parent.location))),null!=t.childFilter&&(c=c.filter((o=>{const i=e.base;e.setBase(o);const c=e.find(t.childFilter);return e.setBase(i),null!=c.target}))),i?c:(c.length>1&&console.warn("Multiple possible targets: ",c,t,o),c[0])}static find(t,o=!1){const i=[];if(null!=t.parent){const c=e.findElement(t.parent,null,o);if(null!=c){if(c instanceof Array)return c.forEach((c=>{const n=e.findElement(t.target,c,o);n instanceof Array?n.forEach((e=>{i.push({parent:c,target:e})})):i.push({parent:c,target:n})})),i;{const n=e.findElement(t.target,c,o);n instanceof Array?n.forEach((e=>{i.push({parent:c,target:e})})):i.push({parent:c,target:n})}}}else{const c=e.findElement(t.target,null,o);c instanceof Array?c.forEach((e=>{i.push({parent:null,target:e})})):i.push({parent:null,target:c})}return 0===i.length&&i.push({parent:null,target:null}),o?i:(1!==i.length&&console.warn("Multiple results found, even though multiple false",i),i[0])}};e.base=null;var t=e;function o(e){const o=t.find(e);return"css"===e.type?!!o.target:"checkbox"===e.type?!!o.target&&o.target.checked:void 0}async function i(e,a){switch(e.type){case"click":return async function(e){const o=t.find(e);null!=o.target&&o.target.click();return n(c)}(e);case"list":return async function(e,t){for(const o of e.actions)await i(o,t)}(e,a);case"consent":return async function(e,t){for(const c of e.consents){const e=-1!==t.indexOf(c.type);if(c.matcher&&c.toggleAction){o(c.matcher)!==e&&await i(c.toggleAction)}else e?await i(c.trueAction):await i(c.falseAction)}}(e,a);case"ifcss":return async function(e,o){const c=t.find(e);c.target?e.falseAction&&await i(e.falseAction,o):e.trueAction&&await i(e.trueAction,o)}(e,a);case"waitcss":return async function(e){await new Promise((o=>{let i=e.retries||10;const c=e.waitTime||250,n=()=>{const a=t.find(e);(e.negated&&a.target||!e.negated&&!a.target)&&i>0?(i-=1,setTimeout(n,c)):o()};n()}))}(e);case"foreach":return async function(e,o){const c=t.find(e,!0),n=t.base;for(const n of c)n.target&&(t.setBase(n.target),await i(e.action,o));t.setBase(n)}(e,a);case"hide":return async function(e){const o=t.find(e);o.target&&o.target.classList.add("Autoconsent-Hidden")}(e);case"slide":return async function(e){const o=t.find(e),i=t.find(e.dragTarget);if(o.target){const e=o.target.getBoundingClientRect(),t=i.target.getBoundingClientRect();let c=t.top-e.top,n=t.left-e.left;"y"===this.config.axis.toLowerCase()&&(n=0),"x"===this.config.axis.toLowerCase()&&(c=0);const a=window.screenX+e.left+e.width/2,s=window.screenY+e.top+e.height/2,r=e.left+e.width/2,l=e.top+e.height/2,p=document.createEvent("MouseEvents");p.initMouseEvent("mousedown",!0,!0,window,0,a,s,r,l,!1,!1,!1,!1,0,o.target);const d=document.createEvent("MouseEvents");d.initMouseEvent("mousemove",!0,!0,window,0,a+n,s+c,r+n,l+c,!1,!1,!1,!1,0,o.target);const u=document.createEvent("MouseEvents");u.initMouseEvent("mouseup",!0,!0,window,0,a+n,s+c,r+n,l+c,!1,!1,!1,!1,0,o.target),o.target.dispatchEvent(p),await this.waitTimeout(10),o.target.dispatchEvent(d),await this.waitTimeout(10),o.target.dispatchEvent(u)}}(e);case"close":return async function(){window.close()}();case"wait":return async function(e){await n(e.waitTime)}(e);case"eval":return async function(e){return console.log("eval!",e.code),new Promise((t=>{try{e.async?(window.eval(e.code),setTimeout((()=>{t(window.eval("window.__consentCheckResult"))}),e.timeout||250)):t(window.eval(e.code))}catch(o){console.warn("eval error",o,e.code),t(!1)}}))}(e);default:throw new Error("Unknown action type: "+e.type)}}var c=0;function n(e){return new Promise((t=>{setTimeout((()=>{t()}),e)}))}function a(){return crypto&&void 0!==crypto.randomUUID?crypto.randomUUID():Math.random().toString()}var s=class{constructor(e,t=1e3){this.id=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t})),this.timer=window.setTimeout((()=>{this.reject(new Error("timeout"))}),t)}},r={pending:new Map,sendContentMessage:null};var l={EVAL_0:()=>console.log(1),EVAL_CONSENTMANAGER_1:()=>window.__cmp&&"object"==typeof __cmp("getCMPData"),EVAL_CONSENTMANAGER_2:()=>!__cmp("consentStatus").userChoiceExists,EVAL_CONSENTMANAGER_3:()=>__cmp("setConsent",0),EVAL_CONSENTMANAGER_4:()=>__cmp("setConsent",1),EVAL_CONSENTMANAGER_5:()=>__cmp("consentStatus").userChoiceExists,EVAL_COOKIEBOT_1:()=>!!window.Cookiebot,EVAL_COOKIEBOT_2:()=>!window.Cookiebot.hasResponse&&!0===window.Cookiebot.dialog?.visible,EVAL_COOKIEBOT_3:()=>window.Cookiebot.withdraw()||!0,EVAL_COOKIEBOT_4:()=>window.Cookiebot.hide()||!0,EVAL_COOKIEBOT_5:()=>!0===window.Cookiebot.declined,EVAL_KLARO_1:()=>{const e=globalThis.klaroConfig||globalThis.klaro?.getManager&&globalThis.klaro.getManager().config;if(!e)return!0;const t=(e.services||e.apps).filter((e=>!e.required)).map((e=>e.name));if(klaro&&klaro.getManager){const e=klaro.getManager();return t.every((t=>!e.consents[t]))}if(klaroConfig&&"cookie"===klaroConfig.storageMethod){const e=klaroConfig.cookieName||klaroConfig.storageName,o=JSON.parse(decodeURIComponent(document.cookie.split(";").find((t=>t.trim().startsWith(e))).split("=")[1]));return Object.keys(o).filter((e=>t.includes(e))).every((e=>!1===o[e]))}},EVAL_KLARO_OPEN_POPUP:()=>{klaro.show(void 0,!0)},EVAL_KLARO_TRY_API_OPT_OUT:()=>{if(window.klaro&&"function"==typeof klaro.show&&"function"==typeof klaro.getManager)try{return klaro.getManager().changeAll(!1),klaro.getManager().saveAndApplyConsents(),!0}catch(e){return console.warn(e),!1}return!1},EVAL_ONETRUST_1:()=>window.OnetrustActiveGroups.split(",").filter((e=>e.length>0)).length<=1,EVAL_TRUSTARC_TOP:()=>window&&window.truste&&"0"===window.truste.eu.bindMap.prefCookie,EVAL_TRUSTARC_FRAME_TEST:()=>window&&window.QueryString&&"0"===window.QueryString.preferences,EVAL_TRUSTARC_FRAME_GTM:()=>window&&window.QueryString&&"1"===window.QueryString.gtm,EVAL_ABC_TEST:()=>document.cookie.includes("trackingconsent"),EVAL_ADROLL_0:()=>!document.cookie.includes("__adroll_fpc"),EVAL_ALMACMP_0:()=>document.cookie.includes('"name":"Google","consent":false'),EVAL_AFFINITY_SERIF_COM_0:()=>document.cookie.includes("serif_manage_cookies_viewed")&&!document.cookie.includes("serif_allow_analytics"),EVAL_ARBEITSAGENTUR_TEST:()=>document.cookie.includes("cookie_consent=denied"),EVAL_AXEPTIO_0:()=>document.cookie.includes("axeptio_authorized_vendors=%2C%2C"),EVAL_BAHN_TEST:()=>1===utag.gdpr.getSelectedCategories().length,EVAL_BING_0:()=>document.cookie.includes("AD=0"),EVAL_BLOCKSY_0:()=>document.cookie.includes("blocksy_cookies_consent_accepted=no"),EVAL_BORLABS_0:()=>!JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("borlabs-cookie"))).split("=",2)[1])).consents.statistics,EVAL_BUNDESREGIERUNG_DE_0:()=>document.cookie.match("cookie-allow-tracking=0"),EVAL_CANVA_0:()=>!document.cookie.includes("gtm_fpc_engagement_event"),EVAL_CC_BANNER2_0:()=>!!document.cookie.match(/sncc=[^;]+D%3Dtrue/),EVAL_CLICKIO_0:()=>document.cookie.includes("__lxG__consent__v2_daisybit="),EVAL_CLINCH_0:()=>document.cookie.includes("ctc_rejected=1"),EVAL_COOKIECONSENT2_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COOKIECONSENT3_TEST:()=>document.cookie.includes("cc_cookie="),EVAL_COINBASE_0:()=>JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent.length<=1,EVAL_COMPLIANZ_BANNER_0:()=>document.cookie.includes("cmplz_banner-status=dismissed"),EVAL_COOKIE_LAW_INFO_0:()=>CLI.disableAllCookies()||CLI.reject_close()||!0,EVAL_COOKIE_LAW_INFO_1:()=>-1===document.cookie.indexOf("cookielawinfo-checkbox-non-necessary=yes"),EVAL_COOKIE_LAW_INFO_DETECT:()=>!!window.CLI,EVAL_COOKIE_MANAGER_POPUP_0:()=>!1===JSON.parse(document.cookie.split(";").find((e=>e.trim().startsWith("CookieLevel"))).split("=")[1]).social,EVAL_COOKIEALERT_0:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_1:()=>document.querySelector("body").removeAttribute("style")||!0,EVAL_COOKIEALERT_2:()=>!0===window.CookieConsent.declined,EVAL_COOKIEFIRST_0:()=>{return!1===(e=JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>-1!==e.indexOf("cookiefirst"))).trim()).split("=")[1])).performance&&!1===e.functional&&!1===e.advertising;var e},EVAL_COOKIEFIRST_1:()=>document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((e=>"true"===e.getAttribute("aria-checked")&&e.click()))||!0,EVAL_COOKIEINFORMATION_0:()=>CookieInformation.declineAllCategories()||!0,EVAL_COOKIEINFORMATION_1:()=>CookieInformation.submitAllCategories()||!0,EVAL_COOKIEINFORMATION_2:()=>document.cookie.includes("CookieInformationConsent="),EVAL_COOKIEYES_0:()=>document.cookie.includes("advertisement:no"),EVAL_DAILYMOTION_0:()=>!!document.cookie.match("dm-euconsent-v2"),EVAL_DNDBEYOND_TEST:()=>document.cookie.includes("cookie-consent=denied"),EVAL_DSGVO_0:()=>!document.cookie.includes("sp_dsgvo_cookie_settings"),EVAL_DUNELM_0:()=>document.cookie.includes("cc_functional=0")&&document.cookie.includes("cc_targeting=0"),EVAL_ETSY_0:()=>document.querySelectorAll(".gdpr-overlay-body input").forEach((e=>{e.checked=!1}))||!0,EVAL_ETSY_1:()=>document.querySelector(".gdpr-overlay-view button[data-wt-overlay-close]").click()||!0,EVAL_EU_COOKIE_COMPLIANCE_0:()=>-1===document.cookie.indexOf("cookie-agreed=2"),EVAL_EU_COOKIE_LAW_0:()=>!document.cookie.includes("euCookie"),EVAL_EZOIC_0:()=>ezCMP.handleAcceptAllClick(),EVAL_EZOIC_1:()=>!!document.cookie.match(/ez-consent-tcf/),EVAL_FIDES_DETECT_POPUP:()=>window.Fides?.initialized,EVAL_GOOGLE_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_HEMA_TEST_0:()=>document.cookie.includes("cookies_rejected=1"),EVAL_IUBENDA_0:()=>document.querySelectorAll(".purposes-item input[type=checkbox]:not([disabled])").forEach((e=>{e.checked&&e.click()}))||!0,EVAL_IUBENDA_1:()=>!!document.cookie.match(/_iub_cs-\d+=/),EVAL_IWINK_TEST:()=>document.cookie.includes("cookie_permission_granted=no"),EVAL_JQUERY_COOKIEBAR_0:()=>!document.cookie.includes("cookies-state=accepted"),EVAL_KETCH_TEST:()=>document.cookie.includes("_ketch_consent_v1_"),EVAL_MEDIAVINE_0:()=>document.querySelectorAll('[data-name="mediavine-gdpr-cmp"] input[type=checkbox]').forEach((e=>e.checked&&e.click()))||!0,EVAL_MICROSOFT_0:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Reject|Ablehnen")))[0].click()||!0,EVAL_MICROSOFT_1:()=>Array.from(document.querySelectorAll("div > button")).filter((e=>e.innerText.match("Accept|Annehmen")))[0].click()||!0,EVAL_MICROSOFT_2:()=>!!document.cookie.match("MSCC|GHCC"),EVAL_MOOVE_0:()=>document.querySelectorAll("#moove_gdpr_cookie_modal input").forEach((e=>{e.disabled||(e.checked="moove_gdpr_strict_cookies"===e.name||"moove_gdpr_strict_cookies"===e.id)}))||!0,EVAL_ONENINETWO_0:()=>document.cookie.includes("CC_ADVERTISING=NO")&&document.cookie.includes("CC_ANALYTICS=NO"),EVAL_OPENAI_TEST:()=>document.cookie.includes("oai-allow-ne=false"),EVAL_OPERA_0:()=>document.cookie.includes("cookie_consent_essential=true")&&!document.cookie.includes("cookie_consent_marketing=true"),EVAL_PAYPAL_0:()=>!0===document.cookie.includes("cookie_prefs"),EVAL_PRIMEBOX_0:()=>!document.cookie.includes("cb-enabled=accepted"),EVAL_PUBTECH_0:()=>document.cookie.includes("euconsent-v2")&&(document.cookie.match(/.YAAAAAAAAAAA/)||document.cookie.match(/.aAAAAAAAAAAA/)||document.cookie.match(/.YAAACFgAAAAA/)),EVAL_REDDIT_0:()=>document.cookie.includes("eu_cookie={%22opted%22:true%2C%22nonessential%22:false}"),EVAL_ROBLOX_TEST:()=>document.cookie.includes("RBXcb"),EVAL_SKYSCANNER_TEST:()=>document.cookie.match(/gdpr=[^;]*adverts:::false/)&&!document.cookie.match(/gdpr=[^;]*init:::true/),EVAL_SIRDATA_UNBLOCK_SCROLL:()=>(document.documentElement.classList.forEach((e=>{e.startsWith("sd-cmp-")&&document.documentElement.classList.remove(e)})),!0),EVAL_SNIGEL_0:()=>!!document.cookie.match("snconsent"),EVAL_STEAMPOWERED_0:()=>2===JSON.parse(decodeURIComponent(document.cookie.split(";").find((e=>e.trim().startsWith("cookieSettings"))).split("=")[1])).preference_state,EVAL_SVT_TEST:()=>document.cookie.includes('cookie-consent-1={"optedIn":true,"functionality":false,"statistics":false}'),EVAL_TAKEALOT_0:()=>document.body.classList.remove("freeze")||(document.body.style="")||!0,EVAL_TARTEAUCITRON_0:()=>tarteaucitron.userInterface.respondAll(!1)||!0,EVAL_TARTEAUCITRON_1:()=>tarteaucitron.userInterface.respondAll(!0)||!0,EVAL_TARTEAUCITRON_2:()=>document.cookie.match(/tarteaucitron=[^;]*/)?.[0].includes("false"),EVAL_TAUNTON_TEST:()=>document.cookie.includes("taunton_user_consent_submitted=true"),EVAL_TEALIUM_0:()=>void 0!==window.utag&&"object"==typeof utag.gdpr,EVAL_TEALIUM_1:()=>utag.gdpr.setConsentValue(!1)||!0,EVAL_TEALIUM_DONOTSELL:()=>utag.gdpr.dns?.setDnsState(!1)||!0,EVAL_TEALIUM_2:()=>utag.gdpr.setConsentValue(!0)||!0,EVAL_TEALIUM_3:()=>1!==utag.gdpr.getConsentState(),EVAL_TEALIUM_DONOTSELL_CHECK:()=>1!==utag.gdpr.dns?.getDnsState(),EVAL_TESLA_TEST:()=>document.cookie.includes("tsla-cookie-consent=rejected"),EVAL_TESTCMP_STEP:()=>!!document.querySelector("#reject-all"),EVAL_TESTCMP_0:()=>"button_clicked"===window.results.results[0],EVAL_TESTCMP_COSMETIC_0:()=>"banner_hidden"===window.results.results[0],EVAL_THEFREEDICTIONARY_0:()=>cmpUi.showPurposes()||cmpUi.rejectAll()||!0,EVAL_THEFREEDICTIONARY_1:()=>cmpUi.allowAll()||!0,EVAL_THEVERGE_0:()=>document.cookie.includes("_duet_gdpr_acknowledged=1"),EVAL_TWCC_TEST:()=>document.cookie.includes("twCookieConsent="),EVAL_UBUNTU_COM_0:()=>document.cookie.includes("_cookies_accepted=essential"),EVAL_UK_COOKIE_CONSENT_0:()=>!document.cookie.includes("catAccCookies"),EVAL_USERCENTRICS_API_0:()=>"object"==typeof UC_UI,EVAL_USERCENTRICS_API_1:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_2:()=>!!UC_UI.denyAllConsents(),EVAL_USERCENTRICS_API_3:()=>!!UC_UI.acceptAllConsents(),EVAL_USERCENTRICS_API_4:()=>!!UC_UI.closeCMP(),EVAL_USERCENTRICS_API_5:()=>!0===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_API_6:()=>!1===UC_UI.areAllConsentsAccepted(),EVAL_USERCENTRICS_BUTTON_0:()=>JSON.parse(localStorage.getItem("usercentrics")).consents.every((e=>e.isEssential||!e.consentStatus)),EVAL_WAITROSE_0:()=>Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e=>e.click()))||!0,EVAL_WAITROSE_1:()=>document.cookie.includes("wtr_cookies_advertising=0")&&document.cookie.includes("wtr_cookies_analytics=0"),EVAL_WP_COOKIE_NOTICE_0:()=>document.cookie.includes("wpl_viewed_cookie=no"),EVAL_XE_TEST:()=>document.cookie.includes("xeConsentState={%22performance%22:false%2C%22marketing%22:false%2C%22compliance%22:false}"),EVAL_XING_0:()=>document.cookie.includes("userConsent=%7B%22marketing%22%3Afalse"),EVAL_YOUTUBE_DESKTOP_0:()=>!!document.cookie.match(/SOCS=CAE/),EVAL_YOUTUBE_MOBILE_0:()=>!!document.cookie.match(/SOCS=CAE/)};var p={main:!0,frame:!1,urlPattern:""},d=class{constructor(e){this.runContext=p,this.autoconsent=e}get hasSelfTest(){throw new Error("Not Implemented")}get isIntermediate(){throw new Error("Not Implemented")}get isCosmetic(){throw new Error("Not Implemented")}mainWorldEval(e){const t=l[e];if(!t)return console.warn("Snippet not found",e),Promise.resolve(!1);const o=this.autoconsent.config.logs;if(this.autoconsent.config.isMainWorld){o.evals&&console.log("inline eval:",e,t);let i=!1;try{i=!!t.call(globalThis)}catch(t){o.evals&&console.error("error evaluating rule",e,t)}return Promise.resolve(i)}const i=`(${t.toString()})()`;return o.evals&&console.log("async eval:",e,i),function(e,t){const o=a();r.sendContentMessage({type:"eval",id:o,code:e,snippetId:t});const i=new s(o);return r.pending.set(i.id,i),i.promise}(i,e).catch((t=>(o.evals&&console.error("error evaluating rule",e,t),!1)))}checkRunContext(){const e={...p,...this.runContext},t=window.top===window;return!(t&&!e.main)&&(!(!t&&!e.frame)&&!(e.urlPattern&&!window.location.href.match(e.urlPattern)))}detectCmp(){throw new Error("Not Implemented")}async detectPopup(){return!1}optOut(){throw new Error("Not Implemented")}optIn(){throw new Error("Not Implemented")}openCmp(){throw new Error("Not Implemented")}async test(){return Promise.resolve(!0)}click(e,t=!1){return this.autoconsent.domActions.click(e,t)}elementExists(e){return this.autoconsent.domActions.elementExists(e)}elementVisible(e,t){return this.autoconsent.domActions.elementVisible(e,t)}waitForElement(e,t){return this.autoconsent.domActions.waitForElement(e,t)}waitForVisible(e,t,o){return this.autoconsent.domActions.waitForVisible(e,t,o)}waitForThenClick(e,t,o){return this.autoconsent.domActions.waitForThenClick(e,t,o)}wait(e){return this.autoconsent.domActions.wait(e)}hide(e,t){return this.autoconsent.domActions.hide(e,t)}prehide(e){return this.autoconsent.domActions.prehide(e)}undoPrehide(){return this.autoconsent.domActions.undoPrehide()}querySingleReplySelector(e,t){return this.autoconsent.domActions.querySingleReplySelector(e,t)}querySelectorChain(e){return this.autoconsent.domActions.querySelectorChain(e)}elementSelector(e){return this.autoconsent.domActions.elementSelector(e)}},u=class extends d{constructor(e,t){super(t),this.rule=e,this.name=e.name,this.runContext=e.runContext||p}get hasSelfTest(){return!!this.rule.test}get isIntermediate(){return!!this.rule.intermediate}get isCosmetic(){return!!this.rule.cosmetic}get prehideSelectors(){return this.rule.prehideSelectors}async detectCmp(){return!!this.rule.detectCmp&&this._runRulesParallel(this.rule.detectCmp)}async detectPopup(){return!!this.rule.detectPopup&&this._runRulesSequentially(this.rule.detectPopup)}async optOut(){const e=this.autoconsent.config.logs;return!!this.rule.optOut&&(e.lifecycle&&console.log("Initiated optOut()",this.rule.optOut),this._runRulesSequentially(this.rule.optOut))}async optIn(){const e=this.autoconsent.config.logs;return!!this.rule.optIn&&(e.lifecycle&&console.log("Initiated optIn()",this.rule.optIn),this._runRulesSequentially(this.rule.optIn))}async openCmp(){return!!this.rule.openCmp&&this._runRulesSequentially(this.rule.openCmp)}async test(){return this.hasSelfTest?this._runRulesSequentially(this.rule.test):super.test()}async evaluateRuleStep(e){const t=[],o=this.autoconsent.config.logs;if(e.exists&&t.push(this.elementExists(e.exists)),e.visible&&t.push(this.elementVisible(e.visible,e.check)),e.eval){const o=this.mainWorldEval(e.eval);t.push(o)}if(e.waitFor&&t.push(this.waitForElement(e.waitFor,e.timeout)),e.waitForVisible&&t.push(this.waitForVisible(e.waitForVisible,e.timeout,e.check)),e.click&&t.push(this.click(e.click,e.all)),e.waitForThenClick&&t.push(this.waitForThenClick(e.waitForThenClick,e.timeout,e.all)),e.wait&&t.push(this.wait(e.wait)),e.hide&&t.push(this.hide(e.hide,e.method)),e.if){if(!e.if.exists&&!e.if.visible)return console.error("invalid conditional rule",e.if),!1;const i=await this.evaluateRuleStep(e.if);o.rulesteps&&console.log("Condition is",i),i?t.push(this._runRulesSequentially(e.then)):e.else?t.push(this._runRulesSequentially(e.else)):t.push(!0)}if(e.any){for(const t of e.any)if(await this.evaluateRuleStep(t))return!0;return!1}if(0===t.length)return o.errors&&console.warn("Unrecognized rule",e),!1;return(await Promise.all(t)).reduce(((e,t)=>e&&t),!0)}async _runRulesParallel(e){const t=e.map((e=>this.evaluateRuleStep(e)));return(await Promise.all(t)).every((e=>!!e))}async _runRulesSequentially(e){const t=this.autoconsent.config.logs;for(const o of e){t.rulesteps&&console.log("Running rule...",o);const e=await this.evaluateRuleStep(o);if(t.rulesteps&&console.log("...rule result",e),!e&&!o.optional)return!1}return!0}},m=class{constructor(e,t){this.name=e,this.config=t,this.methods=new Map,this.runContext=p,this.isCosmetic=!1,t.methods.forEach((e=>{e.action&&this.methods.set(e.name,e.action)})),this.hasSelfTest=!1}get isIntermediate(){return!1}checkRunContext(){return!0}async detectCmp(){return this.config.detectors.map((e=>o(e.presentMatcher))).some((e=>!!e))}async detectPopup(){return this.config.detectors.map((e=>o(e.showingMatcher))).some((e=>!!e))}async executeAction(e,t){return!this.methods.has(e)||i(this.methods.get(e),t)}async optOut(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",[]),await this.executeAction("SAVE_CONSENT"),!0}async optIn(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),await this.executeAction("HIDE_CMP"),await this.executeAction("DO_CONSENT",["D","A","B","E","F","X"]),await this.executeAction("SAVE_CONSENT"),!0}async openCmp(){return await this.executeAction("HIDE_CMP"),await this.executeAction("OPEN_OPTIONS"),!0}async test(){return!0}};function A(e="autoconsent-css-rules"){const t=`style#${e}`,o=document.querySelector(t);if(o&&o instanceof HTMLStyleElement)return o;{const t=document.head||document.getElementsByTagName("head")[0]||document.documentElement,o=document.createElement("style");return o.id=e,t.appendChild(o),o}}function h(e,t,o="display"){const i=`${t} { ${function(e){return("opacity"===e?"opacity: 0":"display: none")+" !important; z-index: -1 !important; pointer-events: none !important;"}(o)} } `;return e instanceof HTMLStyleElement&&(e.innerText+=i,t.length>0)}async function k(e,t,o){const i=await e();return!i&&t>0?new Promise((i=>{setTimeout((async()=>{i(k(e,t-1,o))}),o)})):Promise.resolve(i)}function b(e){if(!e)return!1;if(null!==e.offsetParent)return!0;{const t=window.getComputedStyle(e);if("fixed"===t.position&&"none"!==t.display)return!0}return!1}function g(e){const t={enabled:!0,autoAction:"optOut",disabledCmps:[],enablePrehide:!0,enableCosmeticRules:!0,enableHeuristicDetection:!1,detectRetries:20,isMainWorld:!1,prehideTimeout:2e3,enableFilterList:!1,logs:{lifecycle:!1,rulesteps:!1,evals:!1,errors:!0,messages:!1,waits:!1}},o=(i=t,globalThis.structuredClone?structuredClone(i):JSON.parse(JSON.stringify(i)));var i;for(const i of Object.keys(t))void 0!==e[i]&&(o[i]=e[i]);return o}var _="#truste-show-consent",y="#truste-consent-track",w=[class extends d{constructor(e){super(e),this.name="TrustArc-top",this.prehideSelectors=[".trustarc-banner-container",`.truste_popframe,.truste_overlay,.truste_box_overlay,${y}`],this.runContext={main:!0,frame:!1},this._shortcutButton=null,this._optInDone=!1}get hasSelfTest(){return!0}get isIntermediate(){return!this._optInDone&&!this._shortcutButton}get isCosmetic(){return!1}async detectCmp(){const e=this.elementExists(`${_},${y}`);return e&&(this._shortcutButton=document.querySelector("#truste-consent-required")),e}async detectPopup(){return this.elementVisible(`#truste-consent-content,#trustarc-banner-overlay,${y}`,"any")}openFrame(){this.click(_)}async optOut(){return this._shortcutButton?(this._shortcutButton.click(),!0):(h(A(),`.truste_popframe, .truste_overlay, .truste_box_overlay, ${y}`),this.click(_),setTimeout((()=>{A().remove()}),1e4),!0)}async optIn(){return this._optInDone=!0,this.click("#truste-consent-button")}async openCmp(){return!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_TOP")}},class extends d{constructor(){super(...arguments),this.name="TrustArc-frame",this.runContext={main:!1,frame:!0,urlPattern:"^https://consent-pref\\.trustarc\\.com/\\?"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return!0}async detectPopup(){return this.elementVisible("#defaultpreferencemanager","any")&&this.elementVisible(".mainContent","any")}async navigateToSettings(){return await k((async()=>this.elementExists(".shp")||this.elementVisible(".advance","any")||this.elementExists(".switch span:first-child")),10,500),this.elementExists(".shp")&&this.click(".shp"),await this.waitForElement(".prefPanel",5e3),this.elementVisible(".advance","any")&&this.click(".advance"),await k((()=>this.elementVisible(".switch span:first-child","any")),5,1e3)}async optOut(){if(await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST"))return!0;let e=3e3;return await this.mainWorldEval("EVAL_TRUSTARC_FRAME_GTM")&&(e=1500),await k((()=>"complete"===document.readyState),20,100),await this.waitForElement(".mainContent[aria-hidden=false]",e),!!this.click(".rejectAll")||(this.elementExists(".prefPanel")&&await this.waitForElement('.prefPanel[style="visibility: visible;"]',e),this.click("#catDetails0")?(this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",e),!0):this.click(".required")?(this.waitForThenClick("#gwt-debug-close_id",e),!0):(await this.navigateToSettings(),this.click(".switch span:nth-child(1):not(.active)",!0),this.click(".submit"),this.waitForThenClick("#gwt-debug-close_id",10*e),!0))}async optIn(){return this.click(".call")||(await this.navigateToSettings(),this.click(".switch span:nth-child(2)",!0),this.click(".submit"),this.waitForElement("#gwt-debug-close_id",3e5).then((()=>{this.click("#gwt-debug-close_id")}))),!0}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_TRUSTARC_FRAME_TEST")}},class extends d{constructor(){super(...arguments),this.name="Cybotcookiebot",this.prehideSelectors=["#CybotCookiebotDialog,#CybotCookiebotDialogBodyUnderlay,#dtcookie-container,#cookiebanner,#cb-cookieoverlay,.modal--cookie-banner,#cookiebanner_outer,#CookieBanner"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return await this.mainWorldEval("EVAL_COOKIEBOT_1")}async detectPopup(){return this.mainWorldEval("EVAL_COOKIEBOT_2")}async optOut(){await this.wait(500);let e=await this.mainWorldEval("EVAL_COOKIEBOT_3");return await this.wait(500),e=e&&await this.mainWorldEval("EVAL_COOKIEBOT_4"),e}async optIn(){return this.elementExists("#dtcookie-container")?this.click(".h-dtcookie-accept"):(this.click(".CybotCookiebotDialogBodyLevelButton:not(:checked):enabled",!0),this.click("#CybotCookiebotDialogBodyLevelButtonAccept"),this.click("#CybotCookiebotDialogBodyButtonAccept"),!0)}async test(){return await this.wait(500),await this.mainWorldEval("EVAL_COOKIEBOT_5")}},class extends d{constructor(){super(...arguments),this.name="Sourcepoint-frame",this.prehideSelectors=["div[id^='sp_message_container_'],.message-overlay","#sp_privacy_manager_container"],this.ccpaNotice=!1,this.ccpaPopup=!1,this.runContext={main:!0,frame:!0}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){const e=new URL(location.href);return e.searchParams.has("message_id")&&"ccpa-notice.sp-prod.net"===e.hostname?(this.ccpaNotice=!0,!0):"ccpa-pm.sp-prod.net"===e.hostname?(this.ccpaPopup=!0,!0):("/index.html"===e.pathname||"/privacy-manager/index.html"===e.pathname||"/ccpa_pm/index.html"===e.pathname)&&(e.searchParams.has("message_id")||e.searchParams.has("requestUUID")||e.searchParams.has("consentUUID"))}async detectPopup(){return!!this.ccpaNotice||(this.ccpaPopup?await this.waitForElement(".priv-save-btn",2e3):(await this.waitForElement(".sp_choice_type_11,.sp_choice_type_12,.sp_choice_type_13,.sp_choice_type_ACCEPT_ALL,.sp_choice_type_SAVE_AND_EXIT",2e3),!this.elementExists(".sp_choice_type_9")))}async optIn(){return await this.waitForElement(".sp_choice_type_11,.sp_choice_type_ACCEPT_ALL",2e3),!!this.click(".sp_choice_type_11")||!!this.click(".sp_choice_type_ACCEPT_ALL")}isManagerOpen(){return"/privacy-manager/index.html"===location.pathname||"/ccpa_pm/index.html"===location.pathname}async optOut(){const e=this.autoconsent.config.logs;if(this.ccpaPopup){const e=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.neutral.on .right");for(const t of e)t.click();const t=document.querySelectorAll(".priv-purpose-container .sp-switch-arrow-block a.switch-bg.on");for(const e of t)e.click();return this.click(".priv-save-btn")}if(!this.isManagerOpen()){if(!await this.waitForElement(".sp_choice_type_12,.sp_choice_type_13"))return!1;if(!this.elementExists(".sp_choice_type_12"))return this.click(".sp_choice_type_13");this.click(".sp_choice_type_12"),await k((()=>this.isManagerOpen()),200,100)}await this.waitForElement(".type-modal",2e4),this.waitForThenClick(".ccpa-stack .pm-switch[aria-checked=true] .slider",500,!0);try{const e=".sp_choice_type_REJECT_ALL",t=".reject-toggle",o=await Promise.race([this.waitForElement(e,2e3).then((e=>e?0:-1)),this.waitForElement(t,2e3).then((e=>e?1:-1)),this.waitForElement(".pm-features",2e3).then((e=>e?2:-1))]);if(0===o)return await this.waitForVisible(e),this.click(e);1===o?this.click(t):2===o&&(await this.waitForElement(".pm-features",1e4),this.click(".checked > span",!0),this.click(".chevron"))}catch(t){e.errors&&console.warn(t)}return this.click(".sp_choice_type_SAVE_AND_EXIT")}},class extends d{constructor(){super(...arguments),this.name="consentmanager.net",this.prehideSelectors=["#cmpbox,#cmpbox2"],this.apiAvailable=!1}get hasSelfTest(){return this.apiAvailable}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.apiAvailable=await this.mainWorldEval("EVAL_CONSENTMANAGER_1"),!!this.apiAvailable||this.elementExists("#cmpbox")}async detectPopup(){return this.apiAvailable?(await this.wait(500),await this.mainWorldEval("EVAL_CONSENTMANAGER_2")):this.elementVisible("#cmpbox .cmpmore","any")}async optOut(){return await this.wait(500),this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_3"):!!this.click(".cmpboxbtnno")||(this.elementExists(".cmpwelcomeprpsbtn")?(this.click(".cmpwelcomeprpsbtn > a[aria-checked=true]",!0),this.click(".cmpboxbtnsave"),!0):(this.click(".cmpboxbtncustom"),await this.waitForElement(".cmptblbox",2e3),this.click(".cmptdchoice > a[aria-checked=true]",!0),this.click(".cmpboxbtnyescustomchoices"),this.hide("#cmpwrapper,#cmpbox","display"),!0))}async optIn(){return this.apiAvailable?await this.mainWorldEval("EVAL_CONSENTMANAGER_4"):this.click(".cmpboxbtnyes")}async test(){if(this.apiAvailable)return await this.mainWorldEval("EVAL_CONSENTMANAGER_5")}},class extends d{constructor(){super(...arguments),this.name="Evidon"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#_evidon_banner")}async detectPopup(){return this.elementVisible("#_evidon_banner","any")}async optOut(){return this.click("#_evidon-decline-button")||(h(A(),"#evidon-prefdiag-overlay,#evidon-prefdiag-background,#_evidon-background"),await this.waitForThenClick("#_evidon-option-button"),await this.waitForElement("#evidon-prefdiag-overlay",5e3),await this.wait(500),await this.waitForThenClick("#evidon-prefdiag-decline")),!0}async optIn(){return this.click("#_evidon-accept-button")}},class extends d{constructor(){super(...arguments),this.name="Onetrust",this.prehideSelectors=["#onetrust-banner-sdk,#onetrust-consent-sdk,.onetrust-pc-dark-filter,.js-consent-banner"],this.runContext={urlPattern:"^(?!.*https://www\\.nba\\.com/)"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("#onetrust-banner-sdk,#onetrust-pc-sdk")}async detectPopup(){return this.elementVisible("#onetrust-banner-sdk,#onetrust-pc-sdk","any")}async optOut(){return this.elementVisible("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies","any")?this.click("#onetrust-reject-all-handler,.ot-pc-refuse-all-handler,.js-reject-cookies"):(this.elementExists("#onetrust-pc-btn-handler")?this.click("#onetrust-pc-btn-handler"):this.click(".ot-sdk-show-settings,button.js-cookie-settings"),await this.waitForElement("#onetrust-consent-sdk",2e3),await this.wait(1e3),this.click("#onetrust-consent-sdk input.category-switch-handler:checked,.js-editor-toggle-state:checked",!0),await this.wait(1e3),await this.waitForElement(".save-preference-btn-handler,.js-consent-save",2e3),this.click(".save-preference-btn-handler,.js-consent-save"),await this.waitForVisible("#onetrust-banner-sdk",5e3,"none"),!0)}async optIn(){return this.click("#onetrust-accept-btn-handler,#accept-recommended-btn-handler,.js-accept-cookies")}async test(){return await k((()=>this.mainWorldEval("EVAL_ONETRUST_1")),10,500)}},class extends d{constructor(){super(...arguments),this.name="Klaro",this.prehideSelectors=[".klaro"],this.settingsOpen=!1}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".klaro > .cookie-modal")?(this.settingsOpen=!0,!0):this.elementExists(".klaro > .cookie-notice")}async detectPopup(){return this.elementVisible(".klaro > .cookie-notice,.klaro > .cookie-modal","any")}async optOut(){return!!await this.mainWorldEval("EVAL_KLARO_TRY_API_OPT_OUT")||(!!this.click(".klaro .cn-decline")||(await this.mainWorldEval("EVAL_KLARO_OPEN_POPUP"),!!this.click(".klaro .cn-decline")||(this.click(".cm-purpose:not(.cm-toggle-all) > input:not(.half-checked,.required,.only-required),.cm-purpose:not(.cm-toggle-all) > div > input:not(.half-checked,.required,.only-required)",!0),this.click(".cm-btn-accept,.cm-button"))))}async optIn(){return!!this.click(".klaro .cm-btn-accept-all")||(this.settingsOpen?(this.click(".cm-purpose:not(.cm-toggle-all) > input.half-checked",!0),this.click(".cm-btn-accept")):this.click(".klaro .cookie-notice .cm-btn-success"))}async test(){return await this.mainWorldEval("EVAL_KLARO_1")}},class extends d{constructor(){super(...arguments),this.name="Uniconsent"}get prehideSelectors(){return[".unic",".modal:has(.unic)"]}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".unic .unic-box,.unic .unic-bar,.unic .unic-modal")}async detectPopup(){return this.elementVisible(".unic .unic-box,.unic .unic-bar,.unic .unic-modal","any")}async optOut(){if(await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic button").forEach((e=>{const t=e.textContent;(t.includes("Manage Options")||t.includes("Optionen verwalten"))&&e.click()})),await this.waitForElement(".unic input[type=checkbox]",1e3)){await this.waitForElement(".unic button",1e3),document.querySelectorAll(".unic input[type=checkbox]").forEach((e=>{e.checked&&e.click()}));for(const e of document.querySelectorAll(".unic button")){const t=e.textContent;for(const o of["Confirm Choices","Save Choices","Auswahl speichern"])if(t.includes(o))return e.click(),await this.wait(500),!0}}return!1}async optIn(){return this.waitForThenClick(".unic #unic-agree")}async test(){await this.wait(1e3);return!this.elementExists(".unic .unic-box,.unic .unic-bar")}},class extends d{constructor(){super(...arguments),this.prehideSelectors=[".cmp-root"],this.name="Conversant"}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists(".cmp-root .cmp-receptacle")}async detectPopup(){return this.elementVisible(".cmp-root .cmp-receptacle","any")}async optOut(){if(!await this.waitForThenClick(".cmp-main-button:not(.cmp-main-button--primary)"))return!1;if(!await this.waitForElement(".cmp-view-tab-tabs"))return!1;await this.waitForThenClick(".cmp-view-tab-tabs > :first-child"),await this.waitForThenClick(".cmp-view-tab-tabs > .cmp-view-tab--active:first-child");for(const e of Array.from(document.querySelectorAll(".cmp-accordion-item"))){e.querySelector(".cmp-accordion-item-title").click(),await k((()=>!!e.querySelector(".cmp-accordion-item-content.cmp-active")),10,50);const t=e.querySelector(".cmp-accordion-item-content.cmp-active");t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-deny:not(.cmp-toggle-deny--active)").forEach((e=>e.click())),t.querySelectorAll(".cmp-toggle-actions .cmp-toggle-checkbox:not(.cmp-toggle-checkbox--active)").forEach((e=>e.click()))}return await this.click(".cmp-main-button:not(.cmp-main-button--primary)"),!0}async optIn(){return this.waitForThenClick(".cmp-main-button.cmp-main-button--primary")}async test(){return document.cookie.includes("cmp-data=0")}},class extends d{constructor(){super(...arguments),this.name="tiktok.com",this.runContext={urlPattern:"tiktok"}}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}getShadowRoot(){const e=document.querySelector("tiktok-cookie-banner");return e?e.shadowRoot:null}async detectCmp(){return this.elementExists("tiktok-cookie-banner")}async detectPopup(){return b(this.getShadowRoot().querySelector(".tiktok-cookie-banner"))}async optOut(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:first-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no decline button found"),!1)}async optIn(){const e=this.autoconsent.config.logs,t=this.getShadowRoot().querySelector(".button-wrapper button:last-child");return t?(e.rulesteps&&console.log("[clicking]",t),t.click(),!0):(e.errors&&console.log("no accept button found"),!1)}async test(){const e=document.cookie.match(/cookie-consent=([^;]+)/);if(!e)return!1;const t=JSON.parse(decodeURIComponent(e[1]));return Object.values(t).every((e=>"boolean"!=typeof e||!1===e))}},class extends d{constructor(){super(...arguments),this.name="airbnb",this.runContext={urlPattern:"^https://(www\\.)?airbnb\\.[^/]+/"},this.prehideSelectors=["div[data-testid=main-cookies-banner-container]",'div:has(> div:first-child):has(> div:last-child):has(> section [data-testid="strictly-necessary-cookies"])']}get hasSelfTest(){return!0}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("div[data-testid=main-cookies-banner-container]")}async detectPopup(){return this.elementVisible("div[data-testid=main-cookies-banner-container","any")}async optOut(){let e;for(await this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._snbhip0");e=document.querySelector("[data-testid=modal-container] button[aria-checked=true]:not([disabled])");)e.click();return this.waitForThenClick("button[data-testid=save-btn]")}async optIn(){return this.waitForThenClick("div[data-testid=main-cookies-banner-container] button._148dgdpk")}async test(){return await k((()=>!!document.cookie.match("OptanonAlertBoxClosed")),20,200)}},class extends d{constructor(){super(...arguments),this.name="tumblr-com",this.runContext={urlPattern:"^https://(www\\.)?tumblr\\.com/"}}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}get prehideSelectors(){return["#cmp-app-container"]}async detectCmp(){return this.elementExists("#cmp-app-container")}async detectPopup(){return this.elementVisible("#cmp-app-container","any")}async optOut(){let e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary");return!!t&&(t.click(),await k((()=>{const e=document.querySelector("#cmp-app-container iframe");return!!e.contentDocument?.querySelector(".cmp__dialog input")}),5,500),e=document.querySelector("#cmp-app-container iframe"),t=e.contentDocument?.querySelector(".cmp-components-button.is-secondary"),!!t&&(t.click(),!0))}async optIn(){const e=document.querySelector("#cmp-app-container iframe").contentDocument.querySelector(".cmp-components-button.is-primary");return!!e&&(e.click(),!0)}},class extends d{constructor(){super(...arguments),this.name="Admiral"}get hasSelfTest(){return!1}get isIntermediate(){return!1}get isCosmetic(){return!1}async detectCmp(){return this.elementExists("div > div[class*=Card] > div[class*=Frame] > div[class*=Pills] > button[class*=Pills__StyledPill]")}async detectPopup(){return this.elementVisible("div > div[class*=Card] > div[class*=Frame] > div[class*=Pills] > button[class*=Pills__StyledPill]","any")}async optOut(){const e="xpath///button[contains(., 'Afvis alle') or contains(., 'Reject all') or contains(., 'Odbaci sve') or contains(., 'Rechazar todo') or contains(., 'Atmesti visus') or contains(., 'Odmítnout vše') or contains(., 'Απόρριψη όλων') or contains(., 'Rejeitar tudo') or contains(., 'Tümünü reddet') or contains(., 'Отклонить все') or contains(., 'Noraidīt visu') or contains(., 'Avvisa alla') or contains(., 'Odrzuć wszystkie') or contains(., 'Alles afwijzen') or contains(., 'Отхвърляне на всички') or contains(., 'Rifiuta tutto') or contains(., 'Zavrni vse') or contains(., 'Az összes elutasítása') or contains(., 'Respingeți tot') or contains(., 'Alles ablehnen') or contains(., 'Tout rejeter') or contains(., 'Odmietnuť všetko') or contains(., 'Lükka kõik tagasi') or contains(., 'Hylkää kaikki')]";if(await this.waitForElement(e,500))return this.click(e);const t="xpath///button[contains(., 'Spara & avsluta') or contains(., 'Save & exit') or contains(., 'Uložit a ukončit') or contains(., 'Enregistrer et quitter') or contains(., 'Speichern & Verlassen') or contains(., 'Tallenna ja poistu') or contains(., 'Išsaugoti ir išeiti') or contains(., 'Opslaan & afsluiten') or contains(., 'Guardar y salir') or contains(., 'Shrani in zapri') or contains(., 'Uložiť a ukončiť') or contains(., 'Kaydet ve çıkış yap') or contains(., 'Сохранить и выйти') or contains(., 'Salvesta ja välju') or contains(., 'Salva ed esci') or contains(., 'Gem & afslut') or contains(., 'Αποθήκευση και έξοδος') or contains(., 'Saglabāt un iziet') or contains(., 'Mentés és kilépés') or contains(., 'Guardar e sair') or contains(., 'Zapisz & zakończ') or contains(., 'Salvare și ieșire') or contains(., 'Spremi i izađi') or contains(., 'Запазване и изход')]";if(await this.waitForThenClick("xpath///button[contains(., 'Zwecke') or contains(., 'Σκοποί') or contains(., 'Purposes') or contains(., 'Цели') or contains(., 'Eesmärgid') or contains(., 'Tikslai') or contains(., 'Svrhe') or contains(., 'Cele') or contains(., 'Účely') or contains(., 'Finalidades') or contains(., 'Mērķi') or contains(., 'Scopuri') or contains(., 'Fines') or contains(., 'Ändamål') or contains(., 'Finalités') or contains(., 'Doeleinden') or contains(., 'Tarkoitukset') or contains(., 'Scopi') or contains(., 'Amaçlar') or contains(., 'Nameni') or contains(., 'Célok') or contains(., 'Formål')]")&&await this.waitForVisible(t)){return this.elementSelector(t)[0].parentElement.parentElement.querySelectorAll("input[type=checkbox]:checked").forEach((e=>e.click())),this.click(t)}return!1}async optIn(){return this.click("xpath///button[contains(., 'Sprejmi vse') or contains(., 'Prihvati sve') or contains(., 'Godkänn alla') or contains(., 'Prijať všetko') or contains(., 'Принять все') or contains(., 'Aceptar todo') or contains(., 'Αποδοχή όλων') or contains(., 'Zaakceptuj wszystkie') or contains(., 'Accetta tutto') or contains(., 'Priimti visus') or contains(., 'Pieņemt visu') or contains(., 'Tümünü kabul et') or contains(., 'Az összes elfogadása') or contains(., 'Accept all') or contains(., 'Приемане на всички') or contains(., 'Accepter alle') or contains(., 'Hyväksy kaikki') or contains(., 'Tout accepter') or contains(., 'Alles accepteren') or contains(., 'Aktsepteeri kõik') or contains(., 'Přijmout vše') or contains(., 'Alles akzeptieren') or contains(., 'Aceitar tudo') or contains(., 'Acceptați tot')]")}}],C=class{constructor(e){this.autoconsentInstance=e}click(e,t=!1){const o=this.elementSelector(e);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[click]",e,t,o),o.length>0&&(t?o.forEach((e=>e.click())):o[0].click()),o.length>0}elementExists(e){return this.elementSelector(e).length>0}elementVisible(e,t){const o=this.elementSelector(e),i=new Array(o.length);return o.forEach(((e,t)=>{i[t]=b(e)})),"none"===t?i.every((e=>!e)):0!==i.length&&("any"===t?i.some((e=>e)):i.every((e=>e)))}waitForElement(e,t=1e4){const o=Math.ceil(t/200);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[waitForElement]",e),k((()=>this.elementSelector(e).length>0),o,200)}waitForVisible(e,t=1e4,o="any"){const i=Math.ceil(t/200);return this.autoconsentInstance.config.logs.rulesteps&&console.log("[waitForVisible]",e),k((()=>this.elementVisible(e,o)),i,200)}async waitForThenClick(e,t=1e4,o=!1){return await this.waitForElement(e,t),this.click(e,o)}wait(e){return this.autoconsentInstance.config.logs.rulesteps&&this.autoconsentInstance.config.logs.waits&&console.log("[wait]",e),new Promise((t=>{setTimeout((()=>{t(!0)}),e)}))}hide(e,t){this.autoconsentInstance.config.logs.rulesteps&&console.log("[hide]",e);return h(A(),e,t)}prehide(e){const t=A("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[prehide]",t,location.href),h(t,e,"opacity")}undoPrehide(){const e=A("autoconsent-prehide");return this.autoconsentInstance.config.logs.lifecycle&&console.log("[undoprehide]",e,location.href),e&&e.remove(),!!e}async createOrUpdateStyleSheet(e,t){return t||(t=new CSSStyleSheet),t=await t.replace(e)}removeStyleSheet(e){return!!e&&(e.replace(""),!0)}querySingleReplySelector(e,t=document){if(e.startsWith("aria/"))return[];if(e.startsWith("xpath/")){const o=e.slice(6),i=document.evaluate(o,t,null,XPathResult.ANY_TYPE,null);let c=null;const n=[];for(;c=i.iterateNext();)n.push(c);return n}return e.startsWith("text/")||e.startsWith("pierce/")?[]:t.shadowRoot?Array.from(t.shadowRoot.querySelectorAll(e)):Array.from(t.querySelectorAll(e))}querySelectorChain(e){let t,o=document;for(const i of e){if(t=this.querySingleReplySelector(i,o),0===t.length)return[];o=t[0]}return t}elementSelector(e){return"string"==typeof e?this.querySingleReplySelector(e):this.querySelectorChain(e)}};(()=>{let e=0;const t=new Int32Array(256);for(let o=0;256!==o;o+=1)e=o,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,e=1&e?-306674912^e>>>1:e>>>1,t[o]=e})(),new Int8Array(new Int16Array([1]).buffer)[0];var v,f,E={attribute:/\[\s*(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)\s*(?:(?\W?=)\s*(?.+?)\s*(?[iIsS])?\s*)?\]/gu,id:/#(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu,class:/\.(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu,comma:/\s*,\s*/g,combinator:/\s*[\s>+~]\s*/g,"pseudo-element":/::(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?:¶*)\))?/gu,"pseudo-class":/:(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?¶*)\))?/gu,type:/(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)|\*/gu},x=Object.assign({},E);x["pseudo-element"]=RegExp(E["pseudo-element"].source.replace("(?¶*)","(?.*?)"),"gu"),x["pseudo-class"]=RegExp(E["pseudo-class"].source.replace("(?¶*)","(?.*)"),"gu"),(f=v||(v={}))[f.Normal=0]="Normal",f[f.Extended=1]="Extended",f[f.Invalid=2]="Invalid";var O,S,T,I,P,F,L,V,R=37,B=5011;function N(e){return"string"!=typeof e||0===e.length?B:function(e,t,o){let i=B;for(let c=t;c>>0}(e,0,e.length)}N("type:beacon"),N("type:csp"),N("type:csp"),N("type:cspviolationreport"),N("type:document"),N("type:other"),N("type:xhr"),N("type:font"),N("type:image"),N("type:image"),N("type:document"),N("type:document"),N("type:other"),N("type:media"),N("type:object"),N("type:object"),N("type:other"),N("type:ping"),N("type:other"),N("type:preflight"),N("type:script"),N("type:signedexchange"),N("type:other"),N("type:stylesheet"),N("type:subdocument"),N("type:subdocument"),N("type:other"),N("type:websocket"),N("type:other"),N("type:websocket"),N("type:xhr"),N("type:other"),N("type:xhr"),N("type:other"),(()=>{const e="undefined"!=typeof document?document.createElement("div"):{matches:()=>{}},t=/^[#.]?[\w-.]+$/})(),(S=O||(O={}))[S.unhide=1]="unhide",S[S.scriptInject=2]="scriptInject",S[S.isUnicode=4]="isUnicode",S[S.isClassSelector=8]="isClassSelector",S[S.isIdSelector=16]="isIdSelector",S[S.isHrefSelector=32]="isHrefSelector",S[S.remove=64]="remove",S[S.extended=128]="extended",S[S.isPureHasSelector=256]="isPureHasSelector",N("http"),N("https"),(I=T||(T={}))[I.fromDocument=1]="fromDocument",I[I.fromFont=2]="fromFont",I[I.fromHttp=4]="fromHttp",I[I.fromHttps=8]="fromHttps",I[I.fromImage=16]="fromImage",I[I.fromMedia=32]="fromMedia",I[I.fromObject=64]="fromObject",I[I.fromOther=128]="fromOther",I[I.fromPing=256]="fromPing",I[I.fromScript=512]="fromScript",I[I.fromStylesheet=1024]="fromStylesheet",I[I.fromSubdocument=2048]="fromSubdocument",I[I.fromWebsocket=4096]="fromWebsocket",I[I.fromXmlHttpRequest=8192]="fromXmlHttpRequest",I[I.firstParty=16384]="firstParty",I[I.thirdParty=32768]="thirdParty",I[I.isReplace=65536]="isReplace",I[I.isBadFilter=131072]="isBadFilter",I[I.isCSP=262144]="isCSP",I[I.isGenericHide=524288]="isGenericHide",I[I.isImportant=1048576]="isImportant",I[I.isSpecificHide=2097152]="isSpecificHide",I[I.isFullRegex=4194304]="isFullRegex",I[I.isRegex=8388608]="isRegex",I[I.isUnicode=16777216]="isUnicode",I[I.isLeftAnchor=33554432]="isLeftAnchor",I[I.isRightAnchor=67108864]="isRightAnchor",I[I.isException=134217728]="isException",I[I.isHostnameAnchor=268435456]="isHostnameAnchor",I[I.isRedirectRule=536870912]="isRedirectRule",I[I.isRedirect=1073741824]="isRedirect",T.fromDocument,T.fromFont,T.fromImage,T.fromMedia,T.fromObject,T.fromOther,T.fromPing,T.fromScript,T.fromStylesheet,T.fromSubdocument,T.fromWebsocket,T.fromXmlHttpRequest,T.fromPing,T.fromDocument,T.fromOther,T.fromXmlHttpRequest,T.fromFont,T.fromImage,T.fromImage,T.fromDocument,T.fromDocument,T.fromMedia,T.fromObject,T.fromObject,T.fromPing,T.fromScript,T.fromStylesheet,T.fromSubdocument,T.fromSubdocument,T.fromWebsocket,T.fromWebsocket,T.fromXmlHttpRequest,T.fromXmlHttpRequest,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,T.fromOther,(F=P||(P={}))[F.INVALID=0]="INVALID",F[F.BEGIF=1]="BEGIF",F[F.ELSE=2]="ELSE",F[F.ENDIF=3]="ENDIF",(V=L||(L={}))[V.NOT_SUPPORTED=0]="NOT_SUPPORTED",V[V.NETWORK=1]="NETWORK",V[V.COSMETIC=2]="COSMETIC",V[V.NOT_SUPPORTED_EMPTY=100]="NOT_SUPPORTED_EMPTY",V[V.NOT_SUPPORTED_COMMENT=101]="NOT_SUPPORTED_COMMENT",V[V.NOT_SUPPORTED_ADGUARD=102]="NOT_SUPPORTED_ADGUARD";var M="video/flv",j={contentType:`${M};base64`,aliases:[M,".flv","flv"],body:"RkxWAQEAAAAJAAAAABIAALgAAAAAAAAAAgAKb25NZXRhRGF0YQgAAAAIAAhkdXJhdGlvbgAAAAAAAAAAAAAFd2lkdGgAP/AAAAAAAAAABmhlaWdodAA/8AAAAAAAAAANdmlkZW9kYXRhcmF0ZQBAaGoAAAAAAAAJZnJhbWVyYXRlAEBZAAAAAAAAAAx2aWRlb2NvZGVjaWQAQAAAAAAAAAAAB2VuY29kZXICAA1MYXZmNTcuNDEuMTAwAAhmaWxlc2l6ZQBAaoAAAAAAAAAACQAAAMM="},U="image/gif",D={contentType:`${U};base64`,aliases:[U,".gif","gif"],body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"},z="text/html",G={contentType:z,aliases:[z,".html","html",".htm","htm","noopframe","noop.html"],body:""},q="image/vnd.microsoft.icon",H={contentType:`${q};base64`,aliases:[q,".ico","ico"],body:"AAABAAEAAQEAAAEAGAAwAAAAFgAAACgAAAABAAAAAgAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAA=="},W="image/jpeg",K={contentType:`${W};base64`,aliases:[W,".jpg","jpg",".jpeg","jpeg"],body:"/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k="},Q="application/javascript",Y={contentType:Q,aliases:[Q,".js","js","javascript",".jsx","jsx","typescript",".ts","ts","noop.js","noopjs"],body:""},X="application/json",Z={contentType:X,aliases:[X,".json","json"],body:"0"},$="audio/mpeg",J={contentType:`${$};base64`,aliases:[$,".mp3","mp3","noop-0.1s.mp3","noopmp3-0.1s"],body:"/+MYxAAAAANIAAAAAExBTUUzLjk4LjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"},ee="video/mp4",te={contentType:`${ee};base64`,aliases:[ee,".mp4","mp4",".m4a","m4a",".m4p","m4p",".m4b","m4b",".m4r","m4r",".m4v","m4v","noop-1s.mp4","noopmp4-1s"],body:"AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAAC721kYXQhEAUgpBv/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3pwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcCEQBSCkG//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADengAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAsJtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAALwABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAB7HRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAIAAAAAAAAALwAAAAAAAAAAAAAAAQEAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAAC8AAAAAAAEAAAAAAWRtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAKxEAAAIAFXEAAAAAAAtaGRscgAAAAAAAAAAc291bgAAAAAAAAAAAAAAAFNvdW5kSGFuZGxlcgAAAAEPbWluZgAAABBzbWhkAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAADTc3RibAAAAGdzdHNkAAAAAAAAAAEAAABXbXA0YQAAAAAAAAABAAAAAAAAAAAAAgAQAAAAAKxEAAAAAAAzZXNkcwAAAAADgICAIgACAASAgIAUQBUAAAAAAfQAAAHz+QWAgIACEhAGgICAAQIAAAAYc3R0cwAAAAAAAAABAAAAAgAABAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAIAAAABAAAAHHN0c3oAAAAAAAAAAAAAAAIAAAFzAAABdAAAABRzdGNvAAAAAAAAAAEAAAAsAAAAYnVkdGEAAABabWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAAHWRhdGEAAAABAAAAAExhdmY1Ni40MC4xMDE="},oe="application/pdf",ie={contentType:`${oe};base64`,aliases:[oe,".pdf","pdf"],body:"JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1szIDAgUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0cmFpbGVyIDw8L1Jvb3QgMSAwIFI+Pg=="},ce="image/png",ne={contentType:`${ce};base64`,aliases:[ce,".png","png"],body:"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="},ae="image/svg+xml",se={contentType:ae,aliases:[ae,".svg","svg"],body:"https://raw.githubusercontent.com/mathiasbynens/small/master/svg.svg"},re="text/plain",le={contentType:re,aliases:[re,".txt","txt","text","nooptext","noop.txt"],body:""},pe="audio/wav",de={contentType:`${pe};base64`,aliases:[pe,".wav","wav"],body:"UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA="},ue="video/webm",me={contentType:`${ue};base64`,aliases:[ue,".webm","webm"],body:"GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA="},Ae="image/webp",he={contentType:`${Ae};base64`,aliases:[Ae,".webp","webp"],body:"UklGRhIAAABXRUJQVlA4TAYAAAAvQWxvAGs="},ke="video/wmv",be={contentType:`${ke};base64`,aliases:[ke,".wmv","wmv"],body:"MCaydY5mzxGm2QCqAGLObOUBAAAAAAAABQAAAAECodyrjEepzxGO5ADADCBTZWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcCAAAAAAAAAIA+1d6xnQEAAAAAAAAAAMAF2QEAAAAAAAAAAAAAAAAcDAAAAAAAAAIAAACADAAAgAwAAEANAwC1A79fLqnPEY7jAMAMIFNlLgAAAAAAAAAR0tOruqnPEY7mAMAMIFNlBgAAAAAAQKTQ0gfj0hGX8ACgyV6oUGQAAAAAAAAAAQAoAFcATQAvAEUAbgBjAG8AZABpAG4AZwBTAGUAdAB0AGkAbgBnAHMAAAAAABwATABhAHYAZgA1ADcALgA0ADEALgAxADAAMAAAAJEH3Le3qc8RjuYAwAwgU2WBAAAAAAAAAMDvGbxNW88RqP0AgF9cRCsAV/sgVVvPEaj9AIBfXEQrAAAAAAAAAAAzAAAAAAAAAAEAAAAAAAEAAAABAAAAAigAKAAAAAEAAAABAAAAAQAYAE1QNDMDAAAAAAAAAAAAAAAAAAAAAAAAAEBS0YYdMdARo6QAoMkDSPZMAAAAAAAAAEFS0YYdMdARo6QAoMkDSPYBAAAAAQAKAG0AcwBtAHAAZQBnADQAdgAzAAAAAAAEAE1QNDM2JrJ1jmbPEabZAKoAYs5sMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQ=="};(()=>{const e={};for(const t of[j,D,G,H,K,Y,Z,J,te,ie,ne,se,le,de,me,he,be])for(const o of t.aliases)e[o]=t})();var ge=[/accept cookies/gi,/accept all/gi,/reject all/gi,/only necessary cookies/gi,/by clicking.*(accept|agree|allow)/gi,/by continuing/gi,/we (use|serve)( optional)? cookies/gi,/we are using cookies/gi,/use of cookies/gi,/(this|our) (web)?site.*cookies/gi,/cookies (and|or) .* technologies/gi,/such as cookies/gi,/read more about.*cookies/gi,/consent to.*cookies/gi,/we and our partners.*cookies/gi,/we.*store.*information.*such as.*cookies/gi,/store and\/or access information.*on a device/gi,/personalised ads and content, ad and content measurement/gi];var _e=[{name:"192.com",detectCmp:[{exists:".ont-cookies"}],detectPopup:[{visible:".ont-cookies"}],optIn:[{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-ok2"}],optOut:[{click:".ont-cookes-btn-manage"},{click:".ont-btn-main.ont-cookies-btn.js-ont-btn-choose"}],test:[{eval:"EVAL_ONENINETWO_0"}]},{name:"1password-com",cosmetic:!0,prehideSelectors:['footer #footer-root [aria-label="Cookie Consent"]'],detectCmp:[{exists:'footer #footer-root [aria-label="Cookie Consent"]'}],detectPopup:[{visible:'footer #footer-root [aria-label="Cookie Consent"]'}],optIn:[{click:'footer #footer-root [aria-label="Cookie Consent"] button'}],optOut:[{hide:'footer #footer-root [aria-label="Cookie Consent"]'}]},{name:"aa",vendorUrl:"https://aa.com",prehideSelectors:[],cosmetic:!0,detectCmp:[{exists:"#aa_optoutmulti-Modal,#cookieBannerMessage"}],detectPopup:[{visible:"#aa_optoutmulti-Modal,#cookieBannerMessage"}],optIn:[{hide:"#aa_optoutmulti-Modal,#cookieBannerMessage"},{waitForThenClick:"#aa_optoutmulti_checkBox"},{waitForThenClick:"#aa_optoutmulti-Modal button.optoutmulti_button"}],optOut:[{hide:"#aa_optoutmulti-Modal,#cookieBannerMessage"}]},{name:"abc",vendorUrl:"https://abc.net.au",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?abc\\.net\\.au/"},prehideSelectors:[],detectCmp:[{exists:"[data-component=CookieBanner]"}],detectPopup:[{visible:"[data-component=CookieBanner] [data-component=CookieBanner_AcceptAll]"}],optIn:[{waitForThenClick:"[data-component=CookieBanner] [data-component=CookieBanner_AcceptAll]"}],optOut:[{waitForThenClick:"[data-component=CookieBanner] [data-component=CookieBanner_AcceptABCRequired]"}],test:[{eval:"EVAL_ABC_TEST"}]},{name:"abconcerts.be",vendorUrl:"https://unknown",intermediate:!1,prehideSelectors:["dialog.cookie-consent"],detectCmp:[{exists:"dialog.cookie-consent form.cookie-consent__form"}],detectPopup:[{visible:"dialog.cookie-consent form.cookie-consent__form"}],optIn:[{waitForThenClick:"dialog.cookie-consent form.cookie-consent__form button[value=yes]"}],optOut:[{if:{exists:"dialog.cookie-consent form.cookie-consent__form button[value=no]"},then:[{click:"dialog.cookie-consent form.cookie-consent__form button[value=no]"}],else:[{click:"dialog.cookie-consent form.cookie-consent__form button.cookie-consent__options-toggle"},{waitForThenClick:'dialog.cookie-consent form.cookie-consent__form button[value="save_options"]'}]}]},{name:"acris",prehideSelectors:["div.acris-cookie-consent"],detectCmp:[{exists:"[data-acris-cookie-consent]"}],detectPopup:[{visible:".acris-cookie-consent.is--modal"}],optIn:[{waitForVisible:"#ccConsentAcceptAllButton",check:"any"},{wait:500},{waitForThenClick:"#ccConsentAcceptAllButton"}],optOut:[{waitForVisible:"#ccAcceptOnlyFunctional",check:"any"},{wait:500},{waitForThenClick:"#ccAcceptOnlyFunctional"}]},{name:"activobank.pt",runContext:{urlPattern:"^https://(www\\.)?activobank\\.pt"},prehideSelectors:["aside#cookies,.overlay-cookies"],detectCmp:[{exists:"#cookies .cookies-btn"}],detectPopup:[{visible:"#cookies #submitCookies"}],optIn:[{waitForThenClick:"#cookies #submitCookies"}],optOut:[{waitForThenClick:"#cookies #rejectCookies"}]},{name:"Adroll",prehideSelectors:["#adroll_consent_container"],detectCmp:[{exists:"#adroll_consent_container"}],detectPopup:[{visible:"#adroll_consent_container"}],optIn:[{waitForThenClick:"#adroll_consent_accept"}],optOut:[{waitForThenClick:"#adroll_consent_reject"}],test:[{eval:"EVAL_ADROLL_0"}]},{name:"affinity.serif.com",detectCmp:[{exists:".c-cookie-banner button[data-qa='allow-all-cookies']"}],detectPopup:[{visible:".c-cookie-banner"}],optIn:[{click:'button[data-qa="allow-all-cookies"]'}],optOut:[{click:'button[data-qa="manage-cookies"]'},{waitFor:'.c-cookie-banner ~ [role="dialog"]'},{waitForThenClick:'.c-cookie-banner ~ [role="dialog"] input[type="checkbox"][value="true"]',all:!0},{click:'.c-cookie-banner ~ [role="dialog"] .c-modal__action button'}],test:[{wait:500},{eval:"EVAL_AFFINITY_SERIF_COM_0"}]},{name:"agolde.com",cosmetic:!0,prehideSelectors:["#modal-1 div[data-micromodal-close]"],detectCmp:[{exists:"#modal-1 div[aria-labelledby=modal-1-title]"}],detectPopup:[{exists:"#modal-1 div[data-micromodal-close]"}],optIn:[{click:'button[aria-label="Close modal"]'}],optOut:[{hide:"#modal-1 div[data-micromodal-close]"}]},{name:"aliexpress",vendorUrl:"https://aliexpress.com/",runContext:{urlPattern:"^https://.*\\.aliexpress\\.com/"},prehideSelectors:["#gdpr-new-container"],detectCmp:[{exists:"#gdpr-new-container,#voyager-gdpr > div"}],detectPopup:[{visible:"#gdpr-new-container,#voyager-gdpr > div"}],optIn:[{waitForThenClick:"#gdpr-new-container .btn-accept,#voyager-gdpr > div > div > button:nth-child(1)"}],optOut:[{if:{exists:"#voyager-gdpr > div"},then:[{waitForThenClick:"#voyager-gdpr > div > div > button:nth-child(2)"}],else:[{waitForThenClick:"#gdpr-new-container .btn-more"},{waitFor:"#gdpr-new-container .gdpr-dialog-switcher"},{click:"#gdpr-new-container .switcher-on",all:!0,optional:!0},{click:"#gdpr-new-container .btn-save"}]}]},{name:"almacmp",prehideSelectors:["#alma-cmpv2-container"],detectCmp:[{exists:"#alma-cmpv2-container"}],detectPopup:[{visible:"#alma-cmpv2-container #almacmp-modal-layer1"}],optIn:[{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer1 #almacmp-modalConfirmBtn"}],optOut:[{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer1 #almacmp-modalSettingBtn"},{waitFor:"#alma-cmpv2-container #almacmp-modal-layer2"},{waitForThenClick:"#alma-cmpv2-container #almacmp-modal-layer2 #almacmp-reject-all-layer2"}],test:[{eval:"EVAL_ALMACMP_0"}]},{name:"altium.com",cosmetic:!0,prehideSelectors:[".altium-privacy-bar"],detectCmp:[{exists:".altium-privacy-bar"}],detectPopup:[{exists:".altium-privacy-bar"}],optIn:[{click:"a.altium-privacy-bar__btn"}],optOut:[{hide:".altium-privacy-bar"}]},{name:"amazon.com",prehideSelectors:['span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'],detectCmp:[{exists:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],detectPopup:[{visible:'span[data-action="sp-cc"][data-sp-cc*="rejectAllAction"]'}],optIn:[{waitForVisible:"#sp-cc-accept"},{wait:500},{click:"#sp-cc-accept"}],optOut:[{waitForVisible:"#sp-cc-rejectall-link"},{wait:500},{click:"#sp-cc-rejectall-link"}]},{name:"amex",vendorUrl:"https://www.americanexpress.com/",cosmetic:!1,prehideSelectors:["#user-consent-management-granular-banner-overlay"],detectCmp:[{exists:"#user-consent-management-granular-banner-overlay"}],detectPopup:[{visible:"#user-consent-management-granular-banner-overlay"}],optIn:[{waitForThenClick:"[data-testid=granular-banner-button-accept-all]"}],optOut:[{waitForThenClick:"[data-testid=granular-banner-button-decline-all]"}]},{name:"aquasana.com",prehideSelectors:["#consent-tracking"],detectCmp:[{exists:"#consent-tracking"}],detectPopup:[{exists:"#consent-tracking"}],optIn:[{waitForThenClick:"#consent-tracking .affirm.btn"}],optOut:[{if:{exists:"#consent-tracking .decline.btn"},then:[{click:"#consent-tracking .decline.btn"}],else:[{hide:"#consent-tracking"}]}]},{name:"arbeitsagentur",vendorUrl:"https://www.arbeitsagentur.de/",prehideSelectors:[".modal-open bahf-cookie-disclaimer-dpl3"],detectCmp:[{exists:"bahf-cookie-disclaimer-dpl3"}],detectPopup:[{visible:"bahf-cookie-disclaimer-dpl3"}],optIn:[{waitForThenClick:["bahf-cookie-disclaimer-dpl3","#bahf-cookie-disclaimer-modal .ba-btn-primary"]}],optOut:[{waitForThenClick:["bahf-cookie-disclaimer-dpl3","#bahf-cookie-disclaimer-modal .ba-btn-contrast"]}],test:[{eval:"EVAL_ARBEITSAGENTUR_TEST"}]},{name:"asus",vendorUrl:"https://www.asus.com/",runContext:{urlPattern:"^https://www\\.asus\\.com/"},prehideSelectors:["#cookie-policy-info,#cookie-policy-info-bg"],detectCmp:[{exists:"#cookie-policy-info"}],detectPopup:[{visible:"#cookie-policy-info"}],optIn:[{waitForThenClick:'#cookie-policy-info [data-agree="Accept Cookies"]'}],optOut:[{if:{exists:"#cookie-policy-info .btn-reject"},then:[{waitForThenClick:"#cookie-policy-info .btn-reject"}],else:[{waitForThenClick:"#cookie-policy-info .btn-setting"},{waitForThenClick:'#cookie-policy-lightbox-wrapper [data-agree="Save Settings"]'}]}]},{name:"athlinks-com",runContext:{urlPattern:"^https://(www\\.)?athlinks\\.com/"},cosmetic:!0,prehideSelectors:["#footer-container ~ div"],detectCmp:[{exists:"#footer-container ~ div"}],detectPopup:[{visible:"#footer-container > div"}],optIn:[{click:"#footer-container ~ div button"}],optOut:[{hide:"#footer-container ~ div"}]},{name:"ausopen.com",cosmetic:!0,detectCmp:[{exists:".gdpr-popup__message"}],detectPopup:[{visible:".gdpr-popup__message"}],optOut:[{hide:".gdpr-popup__message"}],optIn:[{click:".gdpr-popup__message button"}]},{name:"automattic-cmp-optout",prehideSelectors:['form[class*="cookie-banner"][method="post"]'],detectCmp:[{exists:'form[class*="cookie-banner"][method="post"]'}],detectPopup:[{visible:'form[class*="cookie-banner"][method="post"]'}],optIn:[{click:'a[class*="accept-all-button"]'}],optOut:[{click:'form[class*="cookie-banner"] div[class*="simple-options"] a[class*="customize-button"]'},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:'a[class*="accept-selection-button"]'}]},{name:"aws.amazon.com",prehideSelectors:["#awsccc-cb-content","#awsccc-cs-container","#awsccc-cs-modalOverlay","#awsccc-cs-container-inner"],detectCmp:[{exists:"#awsccc-cb-content"}],detectPopup:[{visible:"#awsccc-cb-content"}],optIn:[{click:"button[data-id=awsccc-cb-btn-accept"}],optOut:[{click:"button[data-id=awsccc-cb-btn-customize]"},{waitFor:"input[aria-checked]"},{click:"input[aria-checked=true]",all:!0,optional:!0},{click:"button[data-id=awsccc-cs-btn-save]"}]},{name:"axeptio",prehideSelectors:[".axeptio_widget"],detectCmp:[{exists:".axeptio_widget"}],detectPopup:[{visible:".axeptio_widget"}],optIn:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_acceptAll"}],optOut:[{waitFor:".axeptio-widget--open"},{click:"button#axeptio_btn_dismiss"}],test:[{eval:"EVAL_AXEPTIO_0"}]},{name:"baden-wuerttemberg.de",prehideSelectors:[".cookie-alert.t-dark"],cosmetic:!0,detectCmp:[{exists:".cookie-alert.t-dark"}],detectPopup:[{visible:".cookie-alert.t-dark"}],optIn:[{click:".cookie-alert__form input:not([disabled]):not([checked])"},{click:".cookie-alert__button button"}],optOut:[{hide:".cookie-alert.t-dark"}]},{name:"bahn-de",vendorUrl:"https://www.bahn.de/",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?bahn\\.de/"},intermediate:!1,prehideSelectors:[],detectCmp:[{exists:["body > div:first-child","#consent-layer"]}],detectPopup:[{visible:["body > div:first-child","#consent-layer"]}],optIn:[{waitForThenClick:["body > div:first-child","#consent-layer .js-accept-all-cookies"]}],optOut:[{waitForThenClick:["body > div:first-child","#consent-layer .js-accept-essential-cookies"]}],test:[{eval:"EVAL_BAHN_TEST"}]},{name:"bbb.org",runContext:{urlPattern:"^https://www\\.bbb\\.org/"},cosmetic:!0,prehideSelectors:['div[aria-label="use of cookies on bbb.org"]'],detectCmp:[{exists:'div[aria-label="use of cookies on bbb.org"]'}],detectPopup:[{visible:'div[aria-label="use of cookies on bbb.org"]'}],optIn:[{click:'div[aria-label="use of cookies on bbb.org"] button.bds-button-unstyled span.visually-hidden'}],optOut:[{hide:'div[aria-label="use of cookies on bbb.org"]'}]},{name:"bing.com",prehideSelectors:["#bnp_container"],detectCmp:[{exists:"#bnp_cookie_banner"}],detectPopup:[{visible:"#bnp_cookie_banner"},{visible:"#bnp_btn_accept,#bnp_btn_reject"}],optIn:[{waitForThenClick:"#bnp_btn_accept"}],optOut:[{wait:500},{waitForThenClick:"#bnp_btn_reject"}],test:[{eval:"EVAL_BING_0"}]},{name:"blocksy",vendorUrl:"https://creativethemes.com/blocksy/docs/extensions/cookies-consent/",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,prehideSelectors:[".cookie-notification"],detectCmp:[{exists:"#blocksy-ext-cookies-consent-styles-css"}],detectPopup:[{visible:".cookie-notification"}],optIn:[{click:".cookie-notification .ct-cookies-decline-button"}],optOut:[{waitForThenClick:".cookie-notification .ct-cookies-decline-button"}],test:[{eval:"EVAL_BLOCKSY_0"}]},{name:"borlabs",detectCmp:[{exists:"._brlbs-block-content"}],detectPopup:[{visible:"._brlbs-bar-wrap,._brlbs-box-wrap"}],optIn:[{click:"a[data-cookie-accept-all]"}],optOut:[{click:"a[data-cookie-individual]"},{waitForVisible:".cookie-preference"},{click:"input[data-borlabs-cookie-checkbox]:checked",all:!0,optional:!0},{click:"#CookiePrefSave"},{wait:500}],prehideSelectors:["#BorlabsCookieBox"],test:[{eval:"EVAL_BORLABS_0"}]},{name:"bundesregierung.de",prehideSelectors:[".bpa-cookie-banner"],detectCmp:[{exists:".bpa-cookie-banner"}],detectPopup:[{visible:".bpa-cookie-banner .bpa-module-full-hero"}],optIn:[{click:".bpa-accept-all-button"}],optOut:[{wait:500,comment:"click is not immediately recognized"},{waitForThenClick:".bpa-close-button"}],test:[{eval:"EVAL_BUNDESREGIERUNG_DE_0"}]},{name:"burpee.com",cosmetic:!0,prehideSelectors:["#notice-cookie-block"],detectCmp:[{exists:"#notice-cookie-block"}],detectPopup:[{exists:"#html-body #notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{hide:"#html-body #notice-cookie-block, #notice-cookie"}]},{name:"canva.com",prehideSelectors:['div[role="dialog"] a[data-anchor-id="cookie-policy"]'],detectCmp:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],detectPopup:[{exists:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'}],optIn:[{click:'div[role="dialog"] button:nth-child(1)'}],optOut:[{if:{exists:'div[role="dialog"] button:nth-child(3)'},then:[{click:'div[role="dialog"] button:nth-child(2)'}],else:[{click:'div[role="dialog"] button:nth-child(2)'},{waitFor:'div[role="dialog"] a[data-anchor-id="cookie-policy"]'},{waitFor:'div[role="dialog"] button[role=switch]'},{click:'div[role="dialog"] button:nth-child(2):not([role])'},{click:'div[role="dialog"] div:last-child button:only-child'}]}],test:[{eval:"EVAL_CANVA_0"}]},{name:"canyon.com",runContext:{urlPattern:"^https://www\\.canyon\\.com/"},prehideSelectors:["div.modal.cookiesModal.is-open"],detectCmp:[{exists:"div.modal.cookiesModal.is-open"}],detectPopup:[{visible:"div.modal.cookiesModal.is-open"}],optIn:[{click:'div.cookiesModal__buttonWrapper > button[data-closecause="close-by-submit"]'}],optOut:[{click:'div.cookiesModal__buttonWrapper > button[data-closecause="close-by-manage-cookies"]'},{waitForThenClick:"button#js-manage-data-privacy-save-button"}]},{name:"cassie",vendorUrl:"https://trustcassie.com",cosmetic:!1,runContext:{main:!0,frame:!1},prehideSelectors:[".cassie-cookie-module"],detectCmp:[{exists:".cassie-pre-banner"}],detectPopup:[{visible:"#cassie_pre_banner_text"}],optIn:[{waitForThenClick:".cassie-accept-all"}],optOut:[{waitForThenClick:".cassie-reject-all"}]},{name:"cc-banner-springer",prehideSelectors:[".cc-banner[data-cc-banner]"],detectCmp:[{exists:".cc-banner[data-cc-banner]"}],detectPopup:[{visible:".cc-banner[data-cc-banner]"}],optIn:[{waitForThenClick:".cc-banner[data-cc-banner] button[data-cc-action=accept]"}],optOut:[{if:{exists:".cc-banner[data-cc-banner] button[data-cc-action=reject]"},then:[{click:".cc-banner[data-cc-banner] button[data-cc-action=reject]"}],else:[{waitForThenClick:".cc-banner[data-cc-banner] button[data-cc-action=preferences]"},{waitFor:".cc-preferences[data-cc-preferences]"},{click:".cc-preferences[data-cc-preferences] input[type=radio][data-cc-action=toggle-category][value=off]",all:!0,optional:!0},{if:{exists:".cc-preferences[data-cc-preferences] button[data-cc-action=reject]"},then:[{click:".cc-preferences[data-cc-preferences] button[data-cc-action=reject]"}],else:[{click:".cc-preferences[data-cc-preferences] button[data-cc-action=save]"}]}]}],test:[{eval:"EVAL_CC_BANNER2_0"}]},{name:"cc_banner",cosmetic:!0,prehideSelectors:[".cc_banner-wrapper"],detectCmp:[{exists:".cc_banner-wrapper"}],detectPopup:[{visible:".cc_banner"}],optIn:[{click:".cc_btn_accept_all"}],optOut:[{hide:".cc_banner-wrapper"}]},{name:"check24-partnerprogramm-de",prehideSelectors:["[data-modal-content]:has([data-toggle-target^='cookie'])"],detectCmp:[{exists:"[data-toggle-target^='cookie']"}],detectPopup:[{visible:"[data-toggle-target^='cookie']",check:"any"}],optIn:[{waitForThenClick:"[data-cookie-accept-all]"}],optOut:[{waitForThenClick:"[data-cookie-dismiss-all]"}]},{name:"ciaopeople.it",prehideSelectors:["#cp-gdpr-choices"],detectCmp:[{exists:"#cp-gdpr-choices"}],detectPopup:[{visible:"#cp-gdpr-choices"}],optIn:[{waitForThenClick:".gdpr-btm__right > button:nth-child(2)"}],optOut:[{waitForThenClick:".gdpr-top-content > button"},{waitFor:".gdpr-top-back"},{waitForThenClick:".gdpr-btm__right > button:nth-child(1)"}],test:[{visible:"#cp-gdpr-choices",check:"none"}]},{vendorUrl:"https://www.civicuk.com/cookie-control/",name:"civic-cookie-control",prehideSelectors:["#ccc-module,#ccc-overlay,#ccc"],detectCmp:[{exists:"#ccc-module,#ccc-notify"}],detectPopup:[{visible:"#ccc"},{visible:"#ccc-module,#ccc-notify"}],optOut:[{if:{exists:"#ccc-notify"},then:[{waitForThenClick:["#ccc #ccc-notify .ccc-notify-buttons","xpath///button[contains(., 'Settings') or contains(., 'Cookie Preferences')]"]},{waitForVisible:"#ccc-module"}]},{if:{exists:"#ccc-reject-settings"},then:[{waitForThenClick:"#ccc-reject-settings"}],else:[{waitForThenClick:"#ccc-dismiss-button"}]}],optIn:[{waitForThenClick:"#ccc-recommended-settings,#ccc-notify-accept"}]},{name:"click.io",prehideSelectors:["#cl-consent"],detectCmp:[{exists:"#cl-consent"}],detectPopup:[{visible:"#cl-consent"}],optIn:[{waitForThenClick:'#cl-consent [data-role="b_agree"]'}],optOut:[{waitFor:'#cl-consent [data-role="b_options"]'},{wait:500},{click:'#cl-consent [data-role="b_options"]'},{waitFor:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]'},{click:'.cl-consent-popup.cl-consent-visible [data-role="alloff"]',all:!0},{click:'[data-role="b_save"]'}],test:[{eval:"EVAL_CLICKIO_0",comment:"TODO: this only checks if we interacted at all"}]},{name:"clinch",intermediate:!1,runContext:{frame:!1,main:!0},prehideSelectors:[".consent-modal[role=dialog]"],detectCmp:[{exists:".consent-modal[role=dialog]"}],detectPopup:[{visible:".consent-modal[role=dialog]"}],optIn:[{click:"#consent_agree"}],optOut:[{if:{exists:"#consent_reject"},then:[{click:"#consent_reject"}],else:[{click:"#manage_cookie_preferences"},{click:"#cookie_consent_preferences input:checked",all:!0,optional:!0},{click:"#consent_save"}]}],test:[{eval:"EVAL_CLINCH_0"}]},{name:"clustrmaps.com",runContext:{urlPattern:"^https://(www\\.)?clustrmaps\\.com/"},cosmetic:!0,prehideSelectors:["#gdpr-cookie-message"],detectCmp:[{exists:"#gdpr-cookie-message"}],detectPopup:[{visible:"#gdpr-cookie-message"}],optIn:[{click:"button#gdpr-cookie-accept"}],optOut:[{hide:"#gdpr-cookie-message"}]},{name:"coinbase",intermediate:!1,runContext:{frame:!0,main:!0,urlPattern:"^https://(www|help)\\.coinbase\\.com"},prehideSelectors:[],detectCmp:[{exists:"div[class^=CookieBannerContent__Container]"}],detectPopup:[{visible:"div[class^=CookieBannerContent__Container]"}],optIn:[{click:"div[class^=CookieBannerContent__CTA] :nth-last-child(1)"}],optOut:[{click:"button[class^=CookieBannerContent__Settings]"},{click:"div[class^=CookiePreferencesModal__CategoryContainer] input:checked",all:!0,optional:!0},{click:"div[class^=CookiePreferencesModal__ButtonContainer] > button"}],test:[{eval:"EVAL_COINBASE_0"}]},{name:"Complianz banner",prehideSelectors:["#cmplz-cookiebanner-container"],detectCmp:[{exists:"#cmplz-cookiebanner-container .cmplz-cookiebanner"}],detectPopup:[{visible:"#cmplz-cookiebanner-container .cmplz-cookiebanner",check:"any"}],optIn:[{waitForThenClick:".cmplz-cookiebanner .cmplz-accept"}],optOut:[{waitForThenClick:".cmplz-cookiebanner .cmplz-deny"}],test:[{eval:"EVAL_COMPLIANZ_BANNER_0"}]},{name:"Complianz categories",prehideSelectors:['.cc-type-categories[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-categories[aria-describedby="cookieconsent:desc"]'}],optIn:[{any:[{click:".cc-accept-all"},{click:".cc-allow-all"},{click:".cc-allow"},{click:".cc-dismiss"}]}],optOut:[{if:{exists:'.cc-type-categories[aria-describedby="cookieconsent:desc"] .cc-dismiss'},then:[{click:".cc-dismiss"}],else:[{click:".cc-type-categories input[type=checkbox]:not([disabled]):checked",all:!0,optional:!0},{click:".cc-save"}]}]},{name:"Complianz notice",prehideSelectors:['.cc-type-info[aria-describedby="cookieconsent:desc"]'],cosmetic:!0,detectCmp:[{exists:'.cc-type-info[aria-describedby="cookieconsent:desc"] .cc-compliance .cc-btn'}],detectPopup:[{visible:'.cc-type-info[aria-describedby="cookieconsent:desc"] .cc-compliance .cc-btn'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{if:{exists:".cc-deny"},then:[{click:".cc-deny"}],else:[{hide:'[aria-describedby="cookieconsent:desc"]'}]}]},{name:"Complianz opt-both",prehideSelectors:['[aria-describedby="cookieconsent:desc"] .cc-type-opt-both'],detectCmp:[{exists:'[aria-describedby="cookieconsent:desc"] .cc-type-opt-both'}],detectPopup:[{visible:'[aria-describedby="cookieconsent:desc"] .cc-type-opt-both'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{waitForThenClick:".cc-deny"}]},{name:"Complianz opt-out",prehideSelectors:['[aria-describedby="cookieconsent:desc"].cc-type-opt-out'],detectCmp:[{exists:'[aria-describedby="cookieconsent:desc"].cc-type-opt-out'}],detectPopup:[{visible:'[aria-describedby="cookieconsent:desc"].cc-type-opt-out'}],optIn:[{click:".cc-accept-all",optional:!0},{click:".cc-allow",optional:!0},{click:".cc-dismiss",optional:!0}],optOut:[{if:{exists:".cc-deny"},then:[{click:".cc-deny"}],else:[{if:{exists:".cmp-pref-link"},then:[{click:".cmp-pref-link"},{waitForThenClick:".cmp-body [id*=rejectAll]"},{waitForThenClick:".cmp-body .cmp-save-btn"}]}]}]},{name:"Complianz optin",prehideSelectors:['.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'],detectCmp:[{exists:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],detectPopup:[{visible:'.cc-type-opt-in[aria-describedby="cookieconsent:desc"]'}],optIn:[{any:[{click:".cc-accept-all"},{click:".cc-allow"},{click:".cc-dismiss"}]}],optOut:[{if:{visible:".cc-deny"},then:[{click:".cc-deny"}],else:[{if:{visible:".cc-settings"},then:[{waitForThenClick:".cc-settings"},{waitForVisible:".cc-settings-view"},{click:".cc-settings-view input[type=checkbox]:not([disabled]):checked",all:!0,optional:!0},{click:".cc-settings-view .cc-btn-accept-selected"}],else:[{click:".cc-dismiss"}]}]}]},{name:"cookie-consent-spice",cosmetic:!1,runContext:{main:!0,frame:!1},prehideSelectors:[".spicy-consent-wrapper",".spicy-consent-bar"],detectCmp:[{exists:".spicy-consent-bar"}],detectPopup:[{visible:".spicy-consent-bar"}],optIn:[{waitForThenClick:".spicy-consent-bar__action-accept"}],optOut:[{waitForThenClick:".js-decline-all-cookies"}]},{name:"cookie-law-info",prehideSelectors:["#cookie-law-info-bar"],detectCmp:[{exists:"#cookie-law-info-bar"},{eval:"EVAL_COOKIE_LAW_INFO_DETECT"}],detectPopup:[{visible:"#cookie-law-info-bar"}],optIn:[{click:'[data-cli_action="accept_all"]'}],optOut:[{hide:"#cookie-law-info-bar"},{eval:"EVAL_COOKIE_LAW_INFO_0"}],test:[{eval:"EVAL_COOKIE_LAW_INFO_1"}]},{name:"cookie-manager-popup",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,detectCmp:[{exists:"#notice-cookie-block #allow-functional-cookies, #notice-cookie-block #btn-cookie-settings"}],detectPopup:[{visible:"#notice-cookie-block"}],optIn:[{click:"#btn-cookie-allow"}],optOut:[{if:{exists:"#allow-functional-cookies"},then:[{click:"#allow-functional-cookies"}],else:[{waitForThenClick:"#btn-cookie-settings"},{waitForVisible:".modal-body"},{click:'.modal-body input:checked, .switch[data-switch="on"]',all:!0,optional:!0},{click:'[role="dialog"] .modal-footer button'}]}],prehideSelectors:["#btn-cookie-settings"],test:[{eval:"EVAL_COOKIE_MANAGER_POPUP_0"}]},{name:"cookie-notice",prehideSelectors:["#cookie-notice"],cosmetic:!0,detectCmp:[{visible:"#cookie-notice .cookie-notice-container"}],detectPopup:[{visible:"#cookie-notice"}],optIn:[{click:"#cn-accept-cookie"}],optOut:[{hide:"#cookie-notice"}]},{name:"cookie-script",vendorUrl:"https://cookie-script.com/",prehideSelectors:["#cookiescript_injected"],detectCmp:[{exists:"#cookiescript_injected"}],detectPopup:[{visible:"#cookiescript_injected"}],optOut:[{if:{exists:"#cookiescript_reject"},then:[{wait:100},{click:"#cookiescript_reject"}],else:[{click:"#cookiescript_manage"},{waitForVisible:".cookiescript_fsd_main"},{waitForThenClick:"#cookiescript_reject"}]}],optIn:[{click:"#cookiescript_accept"}]},{name:"cookieacceptbar",vendorUrl:"https://unknown",cosmetic:!0,prehideSelectors:["#cookieAcceptBar.cookieAcceptBar"],detectCmp:[{exists:"#cookieAcceptBar.cookieAcceptBar"}],detectPopup:[{visible:"#cookieAcceptBar.cookieAcceptBar"}],optIn:[{waitForThenClick:"#cookieAcceptBarConfirm"}],optOut:[{hide:"#cookieAcceptBar.cookieAcceptBar"}]},{name:"cookiealert",intermediate:!1,prehideSelectors:[],runContext:{frame:!0,main:!0},detectCmp:[{exists:".cookie-alert-extended"}],detectPopup:[{visible:".cookie-alert-extended-modal"}],optIn:[{click:"button[data-controller='cookie-alert/extended/button/accept']"},{eval:"EVAL_COOKIEALERT_0"}],optOut:[{click:"a[data-controller='cookie-alert/extended/detail-link']"},{click:".cookie-alert-configuration-input:checked",all:!0,optional:!0},{click:"button[data-controller='cookie-alert/extended/button/configuration']"},{eval:"EVAL_COOKIEALERT_0"}],test:[{eval:"EVAL_COOKIEALERT_2"}]},{name:"cookieconsent2",vendorUrl:"https://www.github.com/orestbida/cookieconsent",comment:"supports v2.x.x of the library",prehideSelectors:["#cc--main"],detectCmp:[{exists:"#cc--main"}],detectPopup:[{visible:"#cm"},{exists:"#s-all-bn"}],optIn:[{waitForThenClick:"#s-all-bn"}],optOut:[{waitForThenClick:"#s-rall-bn"}],test:[{eval:"EVAL_COOKIECONSENT2_TEST"}]},{name:"cookieconsent3",vendorUrl:"https://www.github.com/orestbida/cookieconsent",comment:"supports v3.x.x of the library",prehideSelectors:["#cc-main"],detectCmp:[{exists:"#cc-main"}],detectPopup:[{visible:"#cc-main .cm-wrapper"}],optIn:[{waitForThenClick:".cm__btn[data-role=all]"}],optOut:[{waitForThenClick:".cm__btn[data-role=necessary]"}],test:[{eval:"EVAL_COOKIECONSENT3_TEST"}]},{name:"cookiecuttr",vendorUrl:"https://github.com/cdwharton/cookieCuttr",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:""},prehideSelectors:[".cc-cookies"],detectCmp:[{exists:".cc-cookies .cc-cookie-accept"}],detectPopup:[{visible:".cc-cookies .cc-cookie-accept"}],optIn:[{waitForThenClick:".cc-cookies .cc-cookie-accept"}],optOut:[{if:{exists:".cc-cookies .cc-cookie-decline"},then:[{click:".cc-cookies .cc-cookie-decline"}],else:[{hide:".cc-cookies"}]}]},{name:"cookiefirst.com",prehideSelectors:["#cookiefirst-root,.cookiefirst-root,[aria-labelledby=cookie-preference-panel-title]"],detectCmp:[{exists:"#cookiefirst-root,.cookiefirst-root"}],detectPopup:[{visible:"#cookiefirst-root,.cookiefirst-root"}],optIn:[{click:"button[data-cookiefirst-action=accept]"}],optOut:[{if:{exists:"button[data-cookiefirst-action=adjust]"},then:[{click:"button[data-cookiefirst-action=adjust]"},{waitForVisible:"[data-cookiefirst-widget=modal]",timeout:1e3},{eval:"EVAL_COOKIEFIRST_1"},{wait:1e3},{click:"button[data-cookiefirst-action=save]"}],else:[{click:"button[data-cookiefirst-action=reject]"}]}],test:[{eval:"EVAL_COOKIEFIRST_0"}]},{name:"Cookie Information Banner",prehideSelectors:["#cookie-information-template-wrapper"],detectCmp:[{exists:"#cookie-information-template-wrapper"}],detectPopup:[{visible:"#cookie-information-template-wrapper"}],optIn:[{eval:"EVAL_COOKIEINFORMATION_1"}],optOut:[{hide:"#cookie-information-template-wrapper",comment:"some templates don't hide the banner automatically"},{eval:"EVAL_COOKIEINFORMATION_0"}],test:[{eval:"EVAL_COOKIEINFORMATION_2"}]},{name:"cookieyes",prehideSelectors:[".cky-overlay,.cky-consent-container"],detectCmp:[{exists:".cky-consent-container"}],detectPopup:[{visible:".cky-consent-container"}],optIn:[{waitForThenClick:".cky-consent-container [data-cky-tag=accept-button]"}],optOut:[{if:{exists:".cky-consent-container [data-cky-tag=reject-button]"},then:[{waitForThenClick:".cky-consent-container [data-cky-tag=reject-button]"}],else:[{if:{exists:".cky-consent-container [data-cky-tag=settings-button]"},then:[{click:".cky-consent-container [data-cky-tag=settings-button]"},{waitFor:".cky-modal-open input[type=checkbox]"},{click:".cky-modal-open input[type=checkbox]:checked",all:!0,optional:!0},{waitForThenClick:".cky-modal [data-cky-tag=detail-save-button]"}],else:[{hide:".cky-consent-container,.cky-overlay"}]}]}],test:[{eval:"EVAL_COOKIEYES_0"}]},{name:"corona-in-zahlen.de",prehideSelectors:[".cookiealert"],detectCmp:[{exists:".cookiealert"}],detectPopup:[{visible:".cookiealert"}],optOut:[{click:".configurecookies"},{click:".confirmcookies"}],optIn:[{click:".acceptcookies"}]},{name:"crossfit-com",cosmetic:!0,prehideSelectors:['body #modal > div > div[class^="_wrapper_"]'],detectCmp:[{exists:'body #modal > div > div[class^="_wrapper_"]'}],detectPopup:[{visible:'body #modal > div > div[class^="_wrapper_"]'}],optIn:[{click:'button[aria-label="accept cookie policy"]'}],optOut:[{hide:'body #modal > div > div[class^="_wrapper_"]'}]},{name:"csu-landtag-de",runContext:{urlPattern:"^https://(www\\.|)?csu-landtag\\.de"},prehideSelectors:["#cookie-disclaimer"],detectCmp:[{exists:"#cookie-disclaimer"}],detectPopup:[{visible:"#cookie-disclaimer"}],optIn:[{click:"#cookieall"}],optOut:[{click:"#cookiesel"}]},{name:"dailymotion-us",cosmetic:!0,prehideSelectors:['div[class*="CookiePopup__desktopContainer"]:has(div[class*="CookiePopup"])'],detectCmp:[{exists:'div[class*="CookiePopup__desktopContainer"]'}],detectPopup:[{visible:'div[class*="CookiePopup__desktopContainer"]'}],optIn:[{click:'div[class*="CookiePopup__desktopContainer"] > button > span'}],optOut:[{hide:'div[class*="CookiePopup__desktopContainer"]'}]},{name:"dailymotion.com",runContext:{urlPattern:"^https://(www\\.)?dailymotion\\.com/"},prehideSelectors:['div[class*="Overlay__container"]:has(div[class*="TCF2Popup"])'],detectCmp:[{exists:'div[class*="TCF2Popup"]'}],detectPopup:[{visible:'[class*="TCF2Popup"] a[href^="https://www.dailymotion.com/legal/cookiemanagement"]'}],optIn:[{waitForThenClick:'button[class*="TCF2Popup__button"]:not([class*="TCF2Popup__personalize"])'}],optOut:[{waitForThenClick:'button[class*="TCF2ContinueWithoutAcceptingButton"]'}],test:[{eval:"EVAL_DAILYMOTION_0"}]},{name:"dan-com",vendorUrl:"https://unknown",runContext:{main:!0,frame:!1},prehideSelectors:[],detectCmp:[{exists:".cookie-banner.show .cookie-banner__content-all-btn"}],detectPopup:[{visible:".cookie-banner.show .cookie-banner__content-all-btn"}],optIn:[{waitForThenClick:".cookie-banner__content-all-btn"}],optOut:[{waitForThenClick:".cookie-banner__content-essential-btn"}]},{name:"deepl.com",prehideSelectors:[".dl_cookieBanner_container"],detectCmp:[{exists:".dl_cookieBanner_container"}],detectPopup:[{visible:".dl_cookieBanner_container"}],optOut:[{click:".dl_cookieBanner--buttonSelected"}],optIn:[{click:".dl_cookieBanner--buttonAll"}]},{name:"delta.com",runContext:{urlPattern:"^https://www\\.delta\\.com/"},cosmetic:!0,prehideSelectors:["ngc-cookie-banner"],detectCmp:[{exists:"div.cookie-footer-container"}],detectPopup:[{visible:"div.cookie-footer-container"}],optIn:[{click:" button.cookie-close-icon"}],optOut:[{hide:"div.cookie-footer-container"}]},{name:"dmgmedia-us",prehideSelectors:["#mol-ads-cmp-iframe, div.mol-ads-cmp > form > div"],detectCmp:[{exists:"div.mol-ads-cmp > form > div"}],detectPopup:[{waitForVisible:"div.mol-ads-cmp > form > div"}],optIn:[{waitForThenClick:"button.mol-ads-cmp--btn-primary"}],optOut:[{waitForThenClick:"div.mol-ads-ccpa--message > u > a"},{waitForVisible:".mol-ads-cmp--modal-dialog"},{waitForThenClick:"a.mol-ads-cmp-footer-privacy"},{waitForThenClick:"button.mol-ads-cmp--btn-secondary"}]},{name:"dmgmedia",prehideSelectors:['[data-project="mol-fe-cmp"]'],detectCmp:[{exists:'[data-project="mol-fe-cmp"] [class*=footer]'}],detectPopup:[{visible:'[data-project="mol-fe-cmp"] [class*=footer]'}],optIn:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=primary]'}],optOut:[{waitForThenClick:'[data-project="mol-fe-cmp"] button[class*=basic]'},{waitForVisible:'[data-project="mol-fe-cmp"] div[class*="tabContent"]'},{waitForThenClick:'[data-project="mol-fe-cmp"] div[class*="toggle"][class*="enabled"]',all:!0},{waitForThenClick:['[data-project="mol-fe-cmp"] [class*=footer]',"xpath///button[contains(., 'Save & Exit')]"]}]},{name:"dndbeyond",vendorUrl:"https://www.dndbeyond.com/",runContext:{urlPattern:"^https://(www\\.)?dndbeyond\\.com/"},prehideSelectors:["[id^=cookie-consent-banner]"],detectCmp:[{exists:"[id^=cookie-consent-banner]"}],detectPopup:[{visible:"[id^=cookie-consent-banner]"}],optIn:[{waitForThenClick:"#cookie-consent-granted"}],optOut:[{waitForThenClick:"#cookie-consent-denied"}],test:[{eval:"EVAL_DNDBEYOND_TEST"}]},{name:"dpgmedia-nl",prehideSelectors:["#pg-shadow-root-host"],detectCmp:[{exists:"#pg-shadow-root-host"}],detectPopup:[{visible:["#pg-shadow-root-host","#pg-modal"]}],optIn:[{waitForThenClick:["#pg-shadow-root-host","#pg-accept-btn"]}],optOut:[{waitForThenClick:["#pg-shadow-root-host","#pg-configure-btn"]},{waitForThenClick:["#pg-shadow-root-host","#pg-reject-btn"]}]},{name:"Drupal",detectCmp:[{exists:"#drupalorg-crosssite-gdpr"}],detectPopup:[{visible:"#drupalorg-crosssite-gdpr"}],optOut:[{click:".no"}],optIn:[{click:".yes"}]},{name:"WP DSGVO Tools",link:"https://wordpress.org/plugins/shapepress-dsgvo/",prehideSelectors:[".sp-dsgvo"],cosmetic:!0,detectCmp:[{exists:".sp-dsgvo.sp-dsgvo-popup-overlay"}],detectPopup:[{visible:".sp-dsgvo.sp-dsgvo-popup-overlay",check:"any"}],optIn:[{click:".sp-dsgvo-privacy-btn-accept-all",all:!0}],optOut:[{hide:".sp-dsgvo.sp-dsgvo-popup-overlay"}],test:[{eval:"EVAL_DSGVO_0"}]},{name:"dunelm.com",prehideSelectors:["div[data-testid=cookie-consent-modal-backdrop]"],detectCmp:[{exists:"div[data-testid=cookie-consent-message-contents]"}],detectPopup:[{visible:"div[data-testid=cookie-consent-message-contents]"}],optIn:[{click:'[data-testid="cookie-consent-allow-all"]'}],optOut:[{click:"button[data-testid=cookie-consent-adjust-settings]"},{click:"button[data-testid=cookie-consent-preferences-save]"}],test:[{eval:"EVAL_DUNELM_0"}]},{name:"ebay",vendorUrl:"https://ebay.com",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?ebay\\.([.a-z]+)/"},prehideSelectors:["#gdpr-banner"],detectCmp:[{exists:"#gdpr-banner"}],detectPopup:[{visible:"#gdpr-banner"}],optIn:[{waitForThenClick:"#gdpr-banner-accept"}],optOut:[{waitForThenClick:"#gdpr-banner-decline"}]},{name:"ecosia",vendorUrl:"https://www.ecosia.org/",runContext:{urlPattern:"^https://www\\.ecosia\\.org/"},prehideSelectors:[".cookie-wrapper"],detectCmp:[{exists:".cookie-wrapper > .cookie-notice"}],detectPopup:[{visible:".cookie-wrapper > .cookie-notice"}],optIn:[{waitForThenClick:"[data-test-id=cookie-notice-accept]"}],optOut:[{waitForThenClick:"[data-test-id=cookie-notice-reject]"}]},{name:"Ensighten ensModal",prehideSelectors:[".ensModal"],detectCmp:[{exists:".ensModal"},{visible:"#ensModalWrapper[style*=block]"}],detectPopup:[{visible:"#ensModalWrapper[style*=block]"}],optIn:[{waitForThenClick:"#modalAcceptButton"}],optOut:[{wait:500},{visible:"#ensModalWrapper[style*=block]"},{waitForThenClick:".ensCheckbox:checked",all:!0},{waitForThenClick:"#ensSave"}]},{name:"Ensighten ensNotifyBanner",prehideSelectors:["#ensNotifyBanner"],detectCmp:[{exists:"#ensNotifyBanner"}],detectPopup:[{visible:"#ensNotifyBanner[style*=block]"}],optIn:[{waitForThenClick:"#ensCloseBanner"}],optOut:[{wait:500},{visible:"#ensNotifyBanner[style*=block]"},{waitForThenClick:"#ensRejectAll,#rejectAll,#ensRejectBanner,.rejectAll,#ensCloseBanner",timeout:2e3}]},{name:"espace-personnel.agirc-arrco.fr",runContext:{urlPattern:"^https://espace-personnel\\.agirc-arrco\\.fr/"},prehideSelectors:[".cdk-overlay-container"],detectCmp:[{exists:".cdk-overlay-container app-esaa-cookie-component"}],detectPopup:[{visible:".cdk-overlay-container app-esaa-cookie-component"}],optIn:[{waitForThenClick:".btn-cookie-accepter"}],optOut:[{waitForThenClick:".btn-cookie-refuser"}]},{name:"etsy",prehideSelectors:["#gdpr-single-choice-overlay","#gdpr-privacy-settings"],detectCmp:[{exists:"#gdpr-single-choice-overlay"}],detectPopup:[{visible:"#gdpr-single-choice-overlay"}],optOut:[{click:"button[data-gdpr-open-full-settings]"},{waitForVisible:".gdpr-overlay-body input",timeout:3e3},{wait:1e3},{eval:"EVAL_ETSY_0"},{eval:"EVAL_ETSY_1"}],optIn:[{click:"button[data-gdpr-single-choice-accept]"}]},{name:"eu-cookie-compliance-banner",detectCmp:[{exists:"body.eu-cookie-compliance-popup-open"}],detectPopup:[{exists:"body.eu-cookie-compliance-popup-open"}],optIn:[{click:".agree-button"}],optOut:[{if:{visible:".decline-button,.eu-cookie-compliance-save-preferences-button"},then:[{click:".decline-button,.eu-cookie-compliance-save-preferences-button"}]},{hide:".eu-cookie-compliance-banner-info, #sliding-popup"}],test:[{eval:"EVAL_EU_COOKIE_COMPLIANCE_0"}]},{name:"EU Cookie Law",prehideSelectors:[".pea_cook_wrapper,.pea_cook_more_info_popover"],cosmetic:!0,detectCmp:[{exists:".pea_cook_wrapper"}],detectPopup:[{wait:500},{visible:".pea_cook_wrapper"}],optIn:[{click:"#pea_cook_btn"}],optOut:[{hide:".pea_cook_wrapper"}],test:[{eval:"EVAL_EU_COOKIE_LAW_0"}]},{name:"europa-eu",vendorUrl:"https://ec.europa.eu/",runContext:{urlPattern:"^https://[^/]*europa\\.eu/"},prehideSelectors:["#cookie-consent-banner"],detectCmp:[{exists:".cck-container"}],detectPopup:[{visible:".cck-container"}],optIn:[{waitForThenClick:'.cck-actions-button[href="#accept"]'}],optOut:[{waitForThenClick:'.cck-actions-button[href="#refuse"]',hide:".cck-container"}]},{name:"EZoic",prehideSelectors:["#ez-cookie-dialog-wrapper"],detectCmp:[{exists:"#ez-cookie-dialog-wrapper"}],detectPopup:[{visible:"#ez-cookie-dialog-wrapper"}],optIn:[{click:"#ez-accept-all",optional:!0},{eval:"EVAL_EZOIC_0",optional:!0}],optOut:[{wait:500},{click:"#ez-manage-settings"},{waitFor:"#ez-cookie-dialog input[type=checkbox]"},{click:"#ez-cookie-dialog input[type=checkbox]:checked",all:!0},{click:"#ez-save-settings"}],test:[{eval:"EVAL_EZOIC_1"}]},{name:"facebook",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?facebook\\.com/"},prehideSelectors:['div[data-testid="cookie-policy-manage-dialog"]'],detectCmp:[{exists:'div[data-testid="cookie-policy-manage-dialog"]'}],detectPopup:[{visible:'div[data-testid="cookie-policy-manage-dialog"]'}],optIn:[{waitForThenClick:'button[data-cookiebanner="accept_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}],optOut:[{waitForThenClick:'button[data-cookiebanner="accept_only_essential_button"]'},{waitForVisible:'div[data-testid="cookie-policy-manage-dialog"]',check:"none"}]},{name:"fides",vendorUrl:"https://github.com/ethyca/fides",prehideSelectors:["#fides-overlay"],detectCmp:[{exists:"#fides-overlay #fides-banner"}],detectPopup:[{visible:"#fides-overlay #fides-banner"},{eval:"EVAL_FIDES_DETECT_POPUP"}],optIn:[{waitForThenClick:"#fides-banner .fides-accept-all-button"}],optOut:[{waitForThenClick:"#fides-banner .fides-reject-all-button"}]},{name:"funding-choices",prehideSelectors:[".fc-consent-root,.fc-dialog-container,.fc-dialog-overlay,.fc-dialog-content"],detectCmp:[{exists:".fc-consent-root"}],detectPopup:[{exists:".fc-dialog-container"}],optOut:[{click:".fc-cta-do-not-consent,.fc-cta-manage-options"},{click:".fc-preference-consent:checked,.fc-preference-legitimate-interest:checked",all:!0,optional:!0},{click:".fc-confirm-choices",optional:!0}],optIn:[{click:".fc-cta-consent"}]},{name:"geeks-for-geeks",runContext:{urlPattern:"^https://www\\.geeksforgeeks\\.org/"},cosmetic:!0,prehideSelectors:[".cookie-consent"],detectCmp:[{exists:".cookie-consent"}],detectPopup:[{visible:".cookie-consent"}],optIn:[{click:".cookie-consent button.consent-btn"}],optOut:[{hide:".cookie-consent"}]},{name:"google-consent-standalone",prehideSelectors:[],detectCmp:[{exists:'a[href^="https://policies.google.com/technologies/cookies"'},{exists:'form[action^="https://consent.google."][action$="/save"]'}],detectPopup:[{visible:'a[href^="https://policies.google.com/technologies/cookies"'}],optIn:[{waitForThenClick:'form[action^="https://consent.google."][action$="/save"]:has(input[name=set_eom][value=false]) button'}],optOut:[{waitForThenClick:'form[action^="https://consent.google."][action$="/save"]:has(input[name=set_eom][value=true]) button'}]},{name:"google-cookiebar",vendorUrl:"https://www.android.com/better-together/quick-share-app/",cosmetic:!1,prehideSelectors:[".glue-cookie-notification-bar"],detectCmp:[{exists:".glue-cookie-notification-bar"}],detectPopup:[{visible:".glue-cookie-notification-bar"}],optIn:[{waitForThenClick:".glue-cookie-notification-bar__accept"}],optOut:[{if:{exists:".glue-cookie-notification-bar__reject"},then:[{click:".glue-cookie-notification-bar__reject"}],else:[{hide:".glue-cookie-notification-bar"}]}],test:[]},{name:"google.com",prehideSelectors:[".HTjtHe#xe7COe"],detectCmp:[{exists:".HTjtHe#xe7COe"},{exists:'.HTjtHe#xe7COe a[href^="https://policies.google.com/technologies/cookies"]'}],detectPopup:[{visible:".HTjtHe#xe7COe button#W0wltc"}],optIn:[{waitForThenClick:".HTjtHe#xe7COe button#L2AGLb"}],optOut:[{waitForThenClick:".HTjtHe#xe7COe button#W0wltc"}],test:[{eval:"EVAL_GOOGLE_0"}]},{name:"gov.uk",detectCmp:[{exists:"#global-cookie-message"}],detectPopup:[{exists:"#global-cookie-message"}],optIn:[{click:"button[data-accept-cookies=true]"}],optOut:[{click:"button[data-reject-cookies=true],#reject-cookies"},{click:"button[data-hide-cookie-banner=true],#hide-cookie-decision"}]},{name:"hashicorp",vendorUrl:"https://hashicorp.com/",runContext:{urlPattern:"^https://[^.]*\\.hashicorp\\.com/"},prehideSelectors:["[data-testid=consent-banner]"],detectCmp:[{exists:"[data-testid=consent-banner]"}],detectPopup:[{visible:"[data-testid=consent-banner]"}],optIn:[{waitForThenClick:"[data-testid=accept]"}],optOut:[{waitForThenClick:"[data-testid=manage-preferences]"},{waitForThenClick:"[data-testid=consent-mgr-dialog] [data-ga-button=save-preferences]"}]},{name:"healthline-media",prehideSelectors:["#modal-host > div.no-hash > div.window-wrapper"],detectCmp:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],detectPopup:[{exists:"#modal-host > div.no-hash > div.window-wrapper, div[data-testid=qualtrics-container]"}],optIn:[{click:"#modal-host > div.no-hash > div.window-wrapper > div:last-child button"}],optOut:[{if:{exists:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'},then:[{click:'#modal-host > div.no-hash > div.window-wrapper > div:last-child a[href="/privacy-settings"]'}],else:[{waitForVisible:"div#__next"},{click:"#__next div:nth-child(1) > button:first-child"}]}]},{name:"hema",prehideSelectors:[".cookie-modal"],detectCmp:[{visible:".cookie-modal .cookie-accept-btn"}],detectPopup:[{visible:".cookie-modal .cookie-accept-btn"}],optIn:[{waitForThenClick:".cookie-modal .cookie-accept-btn"}],optOut:[{waitForThenClick:".cookie-modal .js-cookie-reject-btn"}],test:[{eval:"EVAL_HEMA_TEST_0"}]},{name:"hetzner.com",runContext:{urlPattern:"^https://www\\.hetzner\\.com/"},prehideSelectors:["#CookieConsent"],detectCmp:[{exists:"#CookieConsent"}],detectPopup:[{visible:"#CookieConsent"}],optIn:[{click:"#CookieConsentGiven"}],optOut:[{click:"#CookieConsentDeclined"}]},{name:"hl.co.uk",prehideSelectors:[".cookieModalContent","#cookie-banner-overlay"],detectCmp:[{exists:"#cookie-banner-overlay"}],detectPopup:[{exists:"#cookie-banner-overlay"}],optIn:[{click:"#acceptCookieButton"}],optOut:[{click:"#manageCookie"},{hide:".cookieSettingsModal"},{waitFor:"#AOCookieToggle"},{click:"#AOCookieToggle[aria-pressed=true]",optional:!0},{waitFor:"#TPCookieToggle"},{click:"#TPCookieToggle[aria-pressed=true]",optional:!0},{click:"#updateCookieButton"}]},{name:"holidaymedia",vendorUrl:"https://holidaymedia.nl/",prehideSelectors:["dialog[data-cookie-consent]"],detectCmp:[{exists:"dialog[data-cookie-consent]"}],detectPopup:[{visible:"dialog[data-cookie-consent]"}],optIn:[{waitForThenClick:"button.cookie-consent__button--accept-all"}],optOut:[{waitForThenClick:'a[data-cookie-accept="functional"]',timeout:2e3}]},{name:"hu-manity",vendorUrl:"https://hu-manity.co/",prehideSelectors:["#hu.hu-wrapper"],detectCmp:[{exists:"#hu.hu-visible"}],detectPopup:[{visible:"#hu.hu-visible"}],optIn:[{waitForThenClick:"[data-hu-action=cookies-notice-consent-choices-3]"},{waitForThenClick:"#hu-cookies-save"}],optOut:[{waitForThenClick:"#hu-cookies-save"}]},{name:"hubspot",detectCmp:[{exists:"#hs-eu-cookie-confirmation"}],detectPopup:[{visible:"#hs-eu-cookie-confirmation"}],optIn:[{click:"#hs-eu-confirmation-button"}],optOut:[{click:"#hs-eu-decline-button"}]},{name:"indeed.com",cosmetic:!0,prehideSelectors:["#CookiePrivacyNotice"],detectCmp:[{exists:"#CookiePrivacyNotice"}],detectPopup:[{visible:"#CookiePrivacyNotice"}],optIn:[{click:"#CookiePrivacyNotice button[data-gnav-element-name=CookiePrivacyNoticeOk]"}],optOut:[{hide:"#CookiePrivacyNotice"}]},{name:"ing.de",runContext:{urlPattern:"^https://www\\.ing\\.de/"},cosmetic:!0,prehideSelectors:['div[slot="backdrop"]'],detectCmp:[{exists:'[data-tag-name="ing-cc-dialog-frame"]'}],detectPopup:[{visible:'[data-tag-name="ing-cc-dialog-frame"]'}],optIn:[{click:['[data-tag-name="ing-cc-dialog-level0"]','[data-tag-name="ing-cc-button"][class*="accept"]']}],optOut:[{click:['[data-tag-name="ing-cc-dialog-level0"]','[data-tag-name="ing-cc-button"][class*="more"]']}]},{name:"instagram",vendorUrl:"https://instagram.com",runContext:{urlPattern:"^https://www\\.instagram\\.com/"},prehideSelectors:[],detectCmp:[{exists:'xpath///span[contains(., "Vill du tillåta användningen av cookies från Instagram i den här webbläsaren?") or contains(., "Allow the use of cookies from Instagram on this browser?") or contains(., "Povolit v prohlížeči použití souborů cookie z Instagramu?") or contains(., "Dopustiti upotrebu kolačića s Instagrama na ovom pregledniku?") or contains(., "Разрешить использование файлов cookie от Instagram в этом браузере?") or contains(., "Vuoi consentire l\'uso dei cookie di Instagram su questo browser?") or contains(., "Povoliť používanie cookies zo služby Instagram v tomto prehliadači?") or contains(., "Die Verwendung von Cookies durch Instagram in diesem Browser erlauben?") or contains(., "Sallitaanko Instagramin evästeiden käyttö tällä selaimella?") or contains(., "Engedélyezed az Instagram cookie-jainak használatát ebben a böngészőben?") or contains(., "Het gebruik van cookies van Instagram toestaan in deze browser?") or contains(., "Bu tarayıcıda Instagram\'dan çerez kullanımına izin verilsin mi?") or contains(., "Permitir o uso de cookies do Instagram neste navegador?") or contains(., "Permiţi folosirea modulelor cookie de la Instagram în acest browser?") or contains(., "Autoriser l’utilisation des cookies d’Instagram sur ce navigateur ?") or contains(., "¿Permitir el uso de cookies de Instagram en este navegador?") or contains(., "Zezwolić na użycie plików cookie z Instagramu w tej przeglądarce?") or contains(., "Να επιτρέπεται η χρήση cookies από τo Instagram σε αυτό το πρόγραμμα περιήγησης;") or contains(., "Разрешавате ли използването на бисквитки от Instagram на този браузър?") or contains(., "Vil du tillade brugen af cookies fra Instagram i denne browser?") or contains(., "Vil du tillate bruk av informasjonskapsler fra Instagram i denne nettleseren?")]'}],detectPopup:[{visible:'xpath///span[contains(., "Vill du tillåta användningen av cookies från Instagram i den här webbläsaren?") or contains(., "Allow the use of cookies from Instagram on this browser?") or contains(., "Povolit v prohlížeči použití souborů cookie z Instagramu?") or contains(., "Dopustiti upotrebu kolačića s Instagrama na ovom pregledniku?") or contains(., "Разрешить использование файлов cookie от Instagram в этом браузере?") or contains(., "Vuoi consentire l\'uso dei cookie di Instagram su questo browser?") or contains(., "Povoliť používanie cookies zo služby Instagram v tomto prehliadači?") or contains(., "Die Verwendung von Cookies durch Instagram in diesem Browser erlauben?") or contains(., "Sallitaanko Instagramin evästeiden käyttö tällä selaimella?") or contains(., "Engedélyezed az Instagram cookie-jainak használatát ebben a böngészőben?") or contains(., "Het gebruik van cookies van Instagram toestaan in deze browser?") or contains(., "Bu tarayıcıda Instagram\'dan çerez kullanımına izin verilsin mi?") or contains(., "Permitir o uso de cookies do Instagram neste navegador?") or contains(., "Permiţi folosirea modulelor cookie de la Instagram în acest browser?") or contains(., "Autoriser l’utilisation des cookies d’Instagram sur ce navigateur ?") or contains(., "¿Permitir el uso de cookies de Instagram en este navegador?") or contains(., "Zezwolić na użycie plików cookie z Instagramu w tej przeglądarce?") or contains(., "Να επιτρέπεται η χρήση cookies από τo Instagram σε αυτό το πρόγραμμα περιήγησης;") or contains(., "Разрешавате ли използването на бисквитки от Instagram на този браузър?") or contains(., "Vil du tillade brugen af cookies fra Instagram i denne browser?") or contains(., "Vil du tillate bruk av informasjonskapsler fra Instagram i denne nettleseren?")]'}],optIn:[{waitForThenClick:"xpath///button[contains(., 'Tillad alle cookies') or contains(., 'Alle Cookies erlauben') or contains(., 'Allow all cookies') or contains(., 'Разрешаване на всички бисквитки') or contains(., 'Tillåt alla cookies') or contains(., 'Povolit všechny soubory cookie') or contains(., 'Tüm çerezlere izin ver') or contains(., 'Permite toate modulele cookie') or contains(., 'Να επιτρέπονται όλα τα cookies') or contains(., 'Tillat alle informasjonskapsler') or contains(., 'Povoliť všetky cookies') or contains(., 'Permitir todas las cookies') or contains(., 'Permitir todos os cookies') or contains(., 'Alle cookies toestaan') or contains(., 'Salli kaikki evästeet') or contains(., 'Consenti tutti i cookie') or contains(., 'Az összes cookie engedélyezése') or contains(., 'Autoriser tous les cookies') or contains(., 'Zezwól na wszystkie pliki cookie') or contains(., 'Разрешить все cookie') or contains(., 'Dopusti sve kolačiće')]"}],optOut:[{waitForThenClick:"xpath///button[contains(., 'Отклонить необязательные файлы cookie') or contains(., 'Decline optional cookies') or contains(., 'Refuser les cookies optionnels') or contains(., 'Hylkää valinnaiset evästeet') or contains(., 'Afvis valgfrie cookies') or contains(., 'Odmietnuť nepovinné cookies') or contains(., 'Απόρριψη προαιρετικών cookies') or contains(., 'Neka valfria cookies') or contains(., 'Optionale Cookies ablehnen') or contains(., 'Rifiuta cookie facoltativi') or contains(., 'Odbij neobavezne kolačiće') or contains(., 'Avvis valgfrie informasjonskapsler') or contains(., 'İsteğe bağlı çerezleri reddet') or contains(., 'Recusar cookies opcionais') or contains(., 'Optionele cookies afwijzen') or contains(., 'Rechazar cookies opcionales') or contains(., 'Odrzuć opcjonalne pliki cookie') or contains(., 'Отхвърляне на бисквитките по избор') or contains(., 'Odmítnout volitelné soubory cookie') or contains(., 'Refuză modulele cookie opţionale') or contains(., 'A nem kötelező cookie-k elutasítása')]"},{wait:2e3}]},{name:"ionos.de",prehideSelectors:[".privacy-consent--backdrop",".privacy-consent--modal"],detectCmp:[{exists:".privacy-consent--modal"}],detectPopup:[{visible:".privacy-consent--modal"}],optIn:[{click:"#selectAll"}],optOut:[{click:".footer-config-link"},{click:"#confirmSelection"}]},{name:"itopvpn.com",cosmetic:!0,prehideSelectors:[".pop-cookie"],detectCmp:[{exists:".pop-cookie"}],detectPopup:[{exists:".pop-cookie"}],optIn:[{click:"#_pcookie"}],optOut:[{hide:".pop-cookie"}]},{name:"iubenda",prehideSelectors:["#iubenda-cs-banner"],detectCmp:[{exists:"#iubenda-cs-banner"}],detectPopup:[{visible:".iubenda-cs-accept-btn"}],optIn:[{waitForThenClick:".iubenda-cs-accept-btn"}],optOut:[{waitForThenClick:".iubenda-cs-customize-btn"},{eval:"EVAL_IUBENDA_0"},{waitForThenClick:"#iubFooterBtn"}],test:[{eval:"EVAL_IUBENDA_1"}]},{name:"iWink",prehideSelectors:["body.cookies-request #cookie-bar"],detectCmp:[{exists:"body.cookies-request #cookie-bar"}],detectPopup:[{visible:"body.cookies-request #cookie-bar"}],optIn:[{waitForThenClick:"body.cookies-request #cookie-bar .allow-cookies"}],optOut:[{waitForThenClick:"body.cookies-request #cookie-bar .disallow-cookies"}],test:[{eval:"EVAL_IWINK_TEST"}]},{name:"jdsports",vendorUrl:"https://www.jdsports.co.uk/",runContext:{urlPattern:"^https://(www|m)\\.jdsports\\."},prehideSelectors:[".miniConsent,#PrivacyPolicyBanner"],detectCmp:[{exists:".miniConsent,#PrivacyPolicyBanner"}],detectPopup:[{visible:".miniConsent,#PrivacyPolicyBanner"}],optIn:[{waitForThenClick:".miniConsent .accept-all-cookies"}],optOut:[{if:{exists:"#PrivacyPolicyBanner"},then:[{hide:"#PrivacyPolicyBanner"}],else:[{waitForThenClick:"#cookie-settings"},{waitForThenClick:"#reject-all-cookies"}]}]},{name:"johnlewis.com",prehideSelectors:["div[class^=pecr-cookie-banner-]"],detectCmp:[{exists:"div[class^=pecr-cookie-banner-]"}],detectPopup:[{exists:"div[class^=pecr-cookie-banner-]"}],optOut:[{click:"button[data-test^=manage-cookies]"},{wait:"500"},{click:"label[data-test^=toggle][class*=checked]:not([class*=disabled])",all:!0,optional:!0},{click:"button[data-test=save-preferences]"}],optIn:[{click:"button[data-test=allow-all]"}]},{name:"jquery.cookieBar",vendorUrl:"https://github.com/kovarp/jquery.cookieBar",prehideSelectors:[".cookie-bar"],cosmetic:!0,detectCmp:[{exists:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons"}],detectPopup:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"any"}],optIn:[{click:".cookie-bar .cookie-bar__btn"}],optOut:[{hide:".cookie-bar"}],test:[{visible:".cookie-bar .cookie-bar__message,.cookie-bar .cookie-bar__buttons",check:"none"},{eval:"EVAL_JQUERY_COOKIEBAR_0"}]},{name:"justwatch.com",prehideSelectors:[".consent-banner"],detectCmp:[{exists:".consent-banner .consent-banner__actions"}],detectPopup:[{visible:".consent-banner .consent-banner__actions"}],optIn:[{click:".consent-banner__actions button.basic-button.primary"}],optOut:[{click:".consent-banner__actions button.basic-button.secondary"},{waitForThenClick:".consent-modal__footer button.basic-button.secondary"},{waitForThenClick:".consent-modal ion-content > div > a:nth-child(9)"},{click:"label.consent-switch input[type=checkbox]:checked",all:!0,optional:!0},{waitForVisible:".consent-modal__footer button.basic-button.primary"},{click:".consent-modal__footer button.basic-button.primary"}]},{name:"kconsent",cosmetic:!1,runContext:{main:!0,frame:!1},prehideSelectors:[".kc-overlay"],detectCmp:[{exists:"#kconsent"}],detectPopup:[{visible:".kc-dialog"}],optIn:[{waitForThenClick:"#kc-acceptAndHide"}],optOut:[{waitForThenClick:"#kc-denyAndHide"}]},{name:"ketch",vendorUrl:"https://www.ketch.com",runContext:{frame:!1,main:!0},intermediate:!1,prehideSelectors:["#lanyard_root div[role='dialog']"],detectCmp:[{exists:"#lanyard_root div[role='dialog']"}],detectPopup:[{visible:"#lanyard_root div[role='dialog']"}],optIn:[{if:{exists:"#lanyard_root button[class='confirmButton']"},then:[{waitForThenClick:"#lanyard_root div[class*=buttons] > :nth-child(2)"},{click:"#lanyard_root button[class='confirmButton']"}],else:[{waitForThenClick:"#lanyard_root div[class*=buttons] > :nth-child(2)"}]}],optOut:[{if:{exists:"#lanyard_root [aria-describedby=banner-description]"},then:[{waitForThenClick:"#lanyard_root div[class*=buttons] > button[class*=secondaryButton], #lanyard_root button[class*=buttons-secondary]",comment:"can be either settings or reject button"}]},{waitFor:"#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description], #ketch-preferences",timeout:1e3,optional:!0},{if:{exists:"#lanyard_root [aria-describedby=preference-description],#lanyard_root [aria-describedby=modal-description], #ketch-preferences"},then:[{waitForThenClick:"#lanyard_root button[class*=rejectButton], #lanyard_root button[class*=rejectAllButton]"},{click:"#lanyard_root button[class*=confirmButton],#lanyard_root div[class*=actions_] > button:nth-child(1), #lanyard_root button[class*=actionButton]"}]}],test:[{eval:"EVAL_KETCH_TEST"}]},{name:"kleinanzeigen-de",runContext:{urlPattern:"^https?://(www\\.)?kleinanzeigen\\.de"},prehideSelectors:["#gdpr-banner-container"],detectCmp:[{any:[{exists:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{exists:"#ConsentManagementPage"}]}],detectPopup:[{any:[{visible:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"},{visible:"#ConsentManagementPage"}]}],optIn:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-accept]"}],else:[{click:"#ConsentManagementPage .Button-primary"}]}],optOut:[{if:{exists:"#gdpr-banner-container #gdpr-banner"},then:[{click:"#gdpr-banner-container #gdpr-banner [data-testid=gdpr-banner-cmp-button]"}],else:[{click:"#ConsentManagementPage .Button-secondary"}]}]},{name:"lightbox",prehideSelectors:[".darken-layer.open,.lightbox.lightbox--cookie-consent"],detectCmp:[{exists:"body.cookie-consent-is-active div.lightbox--cookie-consent > div.lightbox__content > div.cookie-consent[data-jsb]"}],detectPopup:[{visible:"body.cookie-consent-is-active div.lightbox--cookie-consent > div.lightbox__content > div.cookie-consent[data-jsb]"}],optOut:[{click:".cookie-consent__footer > button[type='submit']:not([data-button='selectAll'])"}],optIn:[{click:".cookie-consent__footer > button[type='submit'][data-button='selectAll']"}]},{name:"lineagrafica",vendorUrl:"https://addons.prestashop.com/en/legal/8734-eu-cookie-law-gdpr-banner-blocker.html",cosmetic:!0,prehideSelectors:["#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"],detectCmp:[{exists:"#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"}],detectPopup:[{exists:"#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"}],optIn:[{waitForThenClick:"#lgcookieslaw_accept"}],optOut:[{hide:"#lgcookieslaw_banner,#lgcookieslaw_modal,.lgcookieslaw-overlay"}]},{name:"linkedin.com",prehideSelectors:[".artdeco-global-alert[type=COOKIE_CONSENT]"],detectCmp:[{exists:".artdeco-global-alert[type=COOKIE_CONSENT]"}],detectPopup:[{visible:".artdeco-global-alert[type=COOKIE_CONSENT]"}],optIn:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=ACCEPT]"}],optOut:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"},{wait:500},{waitForThenClick:".artdeco-global-alert[type=COOKIE_CONSENT] button[action-type=DENY]"}],test:[{waitForVisible:".artdeco-global-alert[type=COOKIE_CONSENT]",check:"none"}]},{name:"livejasmin",vendorUrl:"https://www.livejasmin.com/",runContext:{urlPattern:"^https://(m|www)\\.livejasmin\\.com/"},prehideSelectors:["#consent_modal"],detectCmp:[{exists:"#consent_modal"}],detectPopup:[{visible:"#consent_modal"}],optIn:[{waitForThenClick:"#consent_modal button[data-testid=ButtonStyledButton]:first-of-type"}],optOut:[{waitForThenClick:"#consent_modal button[data-testid=ButtonStyledButton]:nth-of-type(2)"},{waitForVisible:"[data-testid=PrivacyPreferenceCenterWithConsentCookieContent]"},{click:"[data-testid=PrivacyPreferenceCenterWithConsentCookieContent] input[data-testid=PrivacyPreferenceCenterWithConsentCookieSwitch]:checked",optional:!0,all:!0},{waitForThenClick:"[data-testid=PrivacyPreferenceCenterWithConsentCookieContent] button[data-testid=ButtonStyledButton]:last-child"}]},{name:"macpaw.com",cosmetic:!0,prehideSelectors:['div[data-banner="cookies"]'],detectCmp:[{exists:'div[data-banner="cookies"]'}],detectPopup:[{exists:'div[data-banner="cookies"]'}],optIn:[{click:'button[data-banner-close="cookies"]'}],optOut:[{hide:'div[data-banner="cookies"]'}]},{name:"marksandspencer.com",cosmetic:!0,detectCmp:[{exists:".navigation-cookiebbanner"}],detectPopup:[{visible:".navigation-cookiebbanner"}],optOut:[{hide:".navigation-cookiebbanner"}],optIn:[{click:".navigation-cookiebbanner__submit"}]},{name:"mediamarkt.de",prehideSelectors:["div[aria-labelledby=pwa-consent-layer-title]","div[class^=StyledConsentLayerWrapper-]"],detectCmp:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],detectPopup:[{exists:"div[aria-labelledby^=pwa-consent-layer-title]"}],optOut:[{click:"button[data-test^=pwa-consent-layer-deny-all]"}],optIn:[{click:"button[data-test^=pwa-consent-layer-accept-all"}]},{name:"Mediavine",prehideSelectors:['[data-name="mediavine-gdpr-cmp"]'],detectCmp:[{exists:'[data-name="mediavine-gdpr-cmp"]'}],detectPopup:[{wait:500},{visible:'[data-name="mediavine-gdpr-cmp"]'}],optIn:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [format="primary"]'}],optOut:[{waitForThenClick:'[data-name="mediavine-gdpr-cmp"] [data-view="manageSettings"]'},{waitFor:'[data-name="mediavine-gdpr-cmp"] input[type=checkbox]'},{eval:"EVAL_MEDIAVINE_0",optional:!0},{click:'[data-name="mediavine-gdpr-cmp"] [format="secondary"]'}]},{name:"medium",vendorUrl:"https://medium.com",cosmetic:!0,runContext:{main:!0,frame:!1,urlPattern:"^https://([a-z0-9-]+\\.)?medium\\.com/"},prehideSelectors:[],detectCmp:[{exists:'div:has(> div > div > div[role=alert] > a[href^="https://policy.medium.com/medium-privacy-policy-"])'}],detectPopup:[{visible:'div:has(> div > div > div[role=alert] > a[href^="https://policy.medium.com/medium-privacy-policy-"])'}],optIn:[{waitForThenClick:"[data-testid=close-button]"}],optOut:[{hide:'div:has(> div > div > div[role=alert] > a[href^="https://policy.medium.com/medium-privacy-policy-"])'}]},{name:"microsoft.com",prehideSelectors:["#wcpConsentBannerCtrl"],detectCmp:[{exists:"#wcpConsentBannerCtrl"}],detectPopup:[{exists:"#wcpConsentBannerCtrl"}],optOut:[{eval:"EVAL_MICROSOFT_0"}],optIn:[{eval:"EVAL_MICROSOFT_1"}],test:[{eval:"EVAL_MICROSOFT_2"}]},{name:"midway-usa",runContext:{urlPattern:"^https://www\\.midwayusa\\.com/"},cosmetic:!0,prehideSelectors:["#cookie-container"],detectCmp:[{exists:['div[aria-label="Cookie Policy Banner"]']}],detectPopup:[{visible:"#cookie-container"}],optIn:[{click:"button#cookie-btn"}],optOut:[{hide:'div[aria-label="Cookie Policy Banner"]'}]},{name:"moneysavingexpert.com",detectCmp:[{exists:"dialog[data-testid=accept-our-cookies-dialog]"}],detectPopup:[{visible:"dialog[data-testid=accept-our-cookies-dialog]"}],optIn:[{click:"#banner-accept"}],optOut:[{click:"#banner-manage"},{click:"#pc-confirm"}]},{name:"monzo.com",prehideSelectors:[".cookie-alert, cookie-alert__content"],detectCmp:[{exists:'div.cookie-alert[role="dialog"]'},{exists:'a[href*="monzo"]'}],detectPopup:[{visible:".cookie-alert__content"}],optIn:[{click:".js-accept-cookie-policy"}],optOut:[{click:".js-decline-cookie-policy"}]},{name:"Moove",prehideSelectors:["#moove_gdpr_cookie_info_bar"],detectCmp:[{exists:"#moove_gdpr_cookie_info_bar"}],detectPopup:[{visible:"#moove_gdpr_cookie_info_bar:not(.moove-gdpr-info-bar-hidden)"}],optIn:[{waitForThenClick:".moove-gdpr-infobar-allow-all"}],optOut:[{if:{exists:"#moove_gdpr_cookie_info_bar .change-settings-button"},then:[{click:"#moove_gdpr_cookie_info_bar .change-settings-button"},{waitForVisible:"#moove_gdpr_cookie_modal"},{eval:"EVAL_MOOVE_0"},{click:".moove-gdpr-modal-save-settings"}],else:[{hide:"#moove_gdpr_cookie_info_bar"}]}],test:[{visible:"#moove_gdpr_cookie_info_bar",check:"none"}]},{name:"national-lottery.co.uk",detectCmp:[{exists:".cuk_cookie_consent"}],detectPopup:[{visible:".cuk_cookie_consent",check:"any"}],optOut:[{click:".cuk_cookie_consent_manage_pref"},{click:".cuk_cookie_consent_save_pref"},{click:".cuk_cookie_consent_close"}],optIn:[{click:".cuk_cookie_consent_accept_all"}]},{name:"nba.com",runContext:{urlPattern:"^https://(www\\.)?nba.com/"},cosmetic:!0,prehideSelectors:["#onetrust-banner-sdk"],detectCmp:[{exists:"#onetrust-banner-sdk"}],detectPopup:[{visible:"#onetrust-banner-sdk"}],optIn:[{click:"#onetrust-accept-btn-handler"}],optOut:[{hide:"#onetrust-banner-sdk"}]},{name:"netbeat.de",runContext:{urlPattern:"^https://(www\\.)?netbeat\\.de/"},prehideSelectors:["div#cookieWarning"],detectCmp:[{exists:"div#cookieWarning"}],detectPopup:[{visible:"div#cookieWarning"}],optIn:[{waitForThenClick:"a#btnCookiesAcceptAll"}],optOut:[{waitForThenClick:"a#btnCookiesDenyAll"}]},{name:"netflix.de",detectCmp:[{exists:"#cookie-disclosure"}],detectPopup:[{visible:".cookie-disclosure-message",check:"any"}],optIn:[{click:".btn-accept"}],optOut:[{hide:"#cookie-disclosure"},{click:".btn-reject"}]},{name:"nhs.uk",prehideSelectors:["#nhsuk-cookie-banner"],detectCmp:[{exists:"#nhsuk-cookie-banner"}],detectPopup:[{exists:"#nhsuk-cookie-banner"}],optOut:[{click:"#nhsuk-cookie-banner__link_accept"}],optIn:[{click:"#nhsuk-cookie-banner__link_accept_analytics"}]},{name:"nike",vendorUrl:"https://nike.com",runContext:{urlPattern:"^https://(www\\.)?nike\\.com/"},prehideSelectors:[],detectCmp:[{exists:"[data-testid=cookie-dialog-root]"}],detectPopup:[{visible:"[data-testid=cookie-dialog-root]"}],optIn:[{waitForThenClick:"[data-testid=dialog-accept-button]"}],optOut:[{waitForThenClick:"input[type=radio][id$=-declineLabel]",all:!0},{waitForThenClick:"[data-testid=confirm-choice-button]"}]},{name:"notice-cookie",prehideSelectors:[".button--notice"],cosmetic:!0,detectCmp:[{exists:".notice--cookie"}],detectPopup:[{visible:".notice--cookie"}],optIn:[{click:".button--notice"}],optOut:[{hide:".notice--cookie"}]},{name:"nrk.no",cosmetic:!0,prehideSelectors:[".nrk-masthead__info-banner--cookie"],detectCmp:[{exists:".nrk-masthead__info-banner--cookie"}],detectPopup:[{exists:".nrk-masthead__info-banner--cookie"}],optIn:[{click:"div.nrk-masthead__info-banner--cookie button > span:has(+ svg.nrk-close)"}],optOut:[{hide:".nrk-masthead__info-banner--cookie"}]},{name:"obi.de",prehideSelectors:[".disc-cp--active"],detectCmp:[{exists:".disc-cp-modal__modal"}],detectPopup:[{visible:".disc-cp-modal__modal"}],optIn:[{click:".js-disc-cp-accept-all"}],optOut:[{click:".js-disc-cp-deny-all"}]},{name:"om",vendorUrl:"https://olli-machts.de/en/extension/cookie-manager",prehideSelectors:[".tx-om-cookie-consent"],detectCmp:[{exists:".tx-om-cookie-consent .active[data-omcookie-panel]"}],detectPopup:[{exists:".tx-om-cookie-consent .active[data-omcookie-panel]"}],optIn:[{waitForThenClick:"[data-omcookie-panel-save=all]"}],optOut:[{if:{exists:"[data-omcookie-panel-save=min]"},then:[{waitForThenClick:"[data-omcookie-panel-save=min]"}],else:[{click:"input[data-omcookie-panel-grp]:checked:not(:disabled)",all:!0,optional:!0},{waitForThenClick:"[data-omcookie-panel-save=save]"}]}]},{name:"onlyFans.com",runContext:{urlPattern:"^https://onlyfans\\.com/"},prehideSelectors:["div.b-cookies-informer"],detectCmp:[{exists:"div.b-cookies-informer"}],detectPopup:[{exists:"div.b-cookies-informer"}],optIn:[{click:"div.b-cookies-informer__nav > button:nth-child(2)"}],optOut:[{click:"div.b-cookies-informer__nav > button:nth-child(1)"},{if:{exists:"div.b-cookies-informer__switchers"},then:[{click:"div.b-cookies-informer__switchers input:not([disabled])",all:!0},{click:"div.b-cookies-informer__nav > button"}]}]},{name:"openai",vendorUrl:"https://platform.openai.com/",cosmetic:!1,runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?openai\\.com/"},prehideSelectors:["[data-testid=cookie-consent-banner]"],detectCmp:[{exists:"[data-testid=cookie-consent-banner]"}],detectPopup:[{visible:"[data-testid=cookie-consent-banner]"}],optIn:[{waitForThenClick:"xpath///button[contains(., 'Accept all')]"}],optOut:[{waitForThenClick:"xpath///button[contains(., 'Reject all')]"}],test:[{wait:500},{eval:"EVAL_OPENAI_TEST"}]},{name:"openli",vendorUrl:"https://openli.com",prehideSelectors:[".legalmonster-cleanslate"],detectCmp:[{exists:".legalmonster-cleanslate"}],detectPopup:[{visible:".legalmonster-cleanslate #lm-cookie-wall-container",check:"any"}],optIn:[{waitForThenClick:"#lm-accept-all"}],optOut:[{waitForThenClick:"#lm-accept-necessary"}]},{name:"opera.com",vendorUrl:"https://unknown",cosmetic:!1,runContext:{main:!0,frame:!1},intermediate:!1,prehideSelectors:[],detectCmp:[{exists:"#cookie-consent .manage-cookies__btn"}],detectPopup:[{visible:"#cookie-consent .cookie-basic-consent__btn"}],optIn:[{waitForThenClick:"#cookie-consent .cookie-basic-consent__btn"}],optOut:[{waitForThenClick:"#cookie-consent .manage-cookies__btn"},{waitForThenClick:"#cookie-consent .active.marketing_option_switch.cookie-consent__switch",all:!0},{waitForThenClick:"#cookie-consent .cookie-selection__btn"}],test:[{eval:"EVAL_OPERA_0"}]},{name:"osano",prehideSelectors:[".osano-cm-window,.osano-cm-dialog"],detectCmp:[{exists:".osano-cm-window"}],detectPopup:[{visible:".osano-cm-dialog"}],optIn:[{click:".osano-cm-accept-all",optional:!0}],optOut:[{waitForThenClick:".osano-cm-denyAll"}]},{name:"otto.de",prehideSelectors:[".cookieBanner--visibility"],detectCmp:[{exists:".cookieBanner--visibility"}],detectPopup:[{visible:".cookieBanner__wrapper"}],optIn:[{click:".js_cookieBannerPermissionButton"}],optOut:[{click:".js_cookieBannerProhibitionButton"}]},{name:"ourworldindata",vendorUrl:"https://ourworldindata.org/",runContext:{urlPattern:"^https://ourworldindata\\.org/"},prehideSelectors:[".cookie-manager"],detectCmp:[{exists:".cookie-manager"}],detectPopup:[{visible:".cookie-manager .cookie-notice.open"}],optIn:[{waitForThenClick:".cookie-notice [data-test=accept]"}],optOut:[{waitForThenClick:".cookie-notice [data-test=reject]"}]},{name:"pabcogypsum",vendorUrl:"https://unknown",prehideSelectors:[".js-cookie-notice:has(#cookie_settings-form)"],detectCmp:[{exists:".js-cookie-notice #cookie_settings-form"}],detectPopup:[{visible:".js-cookie-notice #cookie_settings-form"}],optIn:[{waitForThenClick:".js-cookie-notice button[value=allow]"}],optOut:[{waitForThenClick:".js-cookie-notice button[value=disable]"}]},{name:"paypal-us",prehideSelectors:["#ccpaCookieContent_wrapper, article.ppvx_modal--overpanel"],detectCmp:[{exists:"#ccpaCookieBanner, .privacy-sheet-content"}],detectPopup:[{visible:"#ccpaCookieBanner, .privacy-sheet-content"}],optIn:[{click:"#acceptAllButton"}],optOut:[{if:{exists:"#bannerDeclineButton"},then:[{click:"#bannerDeclineButton"}],else:[{if:{exists:"a#manageCookiesLink"},then:[{click:"a#manageCookiesLink"}],else:[{waitForVisible:".privacy-sheet-content #formContent"},{click:"#formContent .cookiepref-11m2iee-checkbox_base input:checked",all:!0,optional:!0},{click:".cookieAction.saveCookie,.confirmCookie #submitCookiesBtn"}]}]}]},{name:"paypal.com",prehideSelectors:["#gdprCookieBanner"],detectCmp:[{exists:"#gdprCookieBanner"}],detectPopup:[{visible:"#gdprCookieContent_wrapper"}],optIn:[{click:"#acceptAllButton"}],optOut:[{wait:200},{click:".gdprCookieBanner_decline-button"}],test:[{wait:500},{eval:"EVAL_PAYPAL_0"}]},{name:"pinetools.com",cosmetic:!0,prehideSelectors:["#aviso_cookies"],detectCmp:[{exists:"#aviso_cookies"}],detectPopup:[{exists:".lang_en #aviso_cookies"}],optIn:[{click:"#aviso_cookies .a_boton_cerrar"}],optOut:[{hide:"#aviso_cookies"}]},{name:"pinterest-business",vendorUrl:"https://business.pinterest.com/",runContext:{urlPattern:"^https://.*\\.pinterest\\.com/"},prehideSelectors:[".BusinessCookieConsent"],detectCmp:[{exists:".BusinessCookieConsent"}],detectPopup:[{visible:".BusinessCookieConsent [data-id=cookie-consent-banner-buttons]"}],optIn:[{waitForThenClick:"[data-id=cookie-consent-banner-buttons] > div:nth-child(1) button"}],optOut:[{waitForThenClick:"[data-id=cookie-consent-banner-buttons] > div:nth-child(2) button"}]},{name:"pmc",cosmetic:!0,prehideSelectors:["#pmc-pp-tou--notice"],detectCmp:[{exists:"#pmc-pp-tou--notice"}],detectPopup:[{visible:"#pmc-pp-tou--notice"}],optIn:[{click:"span.pmc-pp-tou--notice-close-btn"}],optOut:[{hide:"#pmc-pp-tou--notice"}]},{name:"pornhub.com",runContext:{urlPattern:"^https://(www\\.)?pornhub\\.com/"},cosmetic:!1,prehideSelectors:["#cookieBanner #cookieBannerContent"],detectCmp:[{exists:"#cookieBanner #cookieBannerContent"}],detectPopup:[{visible:"#cookieBanner #cookieBannerContent"}],optIn:[{waitForThenClick:"#cookieBanner [data-label=accept_all]"}],optOut:[{waitForThenClick:"#cookieBanner [data-label=accept_essential]"}]},{name:"pornpics.com",cosmetic:!0,prehideSelectors:["#cookie-contract"],detectCmp:[{exists:"#cookie-contract"}],detectPopup:[{visible:"#cookie-contract"}],optIn:[{click:"#cookie-contract .icon-cross"}],optOut:[{hide:"#cookie-contract"}]},{name:"PrimeBox CookieBar",prehideSelectors:["#cookie-bar"],detectCmp:[{exists:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy"}],detectPopup:[{visible:"#cookie-bar .cb-enable,#cookie-bar .cb-disable,#cookie-bar .cb-policy",check:"any"}],optIn:[{waitForThenClick:"#cookie-bar .cb-enable"}],optOut:[{click:"#cookie-bar .cb-disable",optional:!0},{hide:"#cookie-bar"}],test:[{eval:"EVAL_PRIMEBOX_0"}]},{name:"privacymanager.io",prehideSelectors:["#gdpr-consent-tool-wrapper",'iframe[src^="https://cmp-consent-tool.privacymanager.io"]'],runContext:{urlPattern:"^https://cmp-consent-tool\\.privacymanager\\.io/",main:!1,frame:!0},detectCmp:[{exists:"button#save"}],detectPopup:[{visible:"button#save"}],optIn:[{click:"button#save"}],optOut:[{if:{exists:"#denyAll"},then:[{click:"#denyAll"},{waitForThenClick:".okButton"}],else:[{waitForThenClick:"#manageSettings"},{waitFor:".purposes-overview-list"},{waitFor:"button#saveAndExit"},{click:"span[role=checkbox][aria-checked=true]",all:!0,optional:!0},{click:"button#saveAndExit"}]}]},{name:"productz.com",vendorUrl:"https://productz.com/",runContext:{urlPattern:"^https://productz\\.com/"},prehideSelectors:[],detectCmp:[{exists:".c-modal.is-active"}],detectPopup:[{visible:".c-modal.is-active"}],optIn:[{waitForThenClick:".c-modal.is-active .is-accept"}],optOut:[{waitForThenClick:".c-modal.is-active .is-dismiss"}]},{name:"pubtech",prehideSelectors:["#pubtech-cmp"],detectCmp:[{exists:"#pubtech-cmp"}],detectPopup:[{visible:"#pubtech-cmp #pt-actions"}],optIn:[{if:{exists:"#pt-accept-all"},then:[{click:"#pubtech-cmp #pt-actions #pt-accept-all"}],else:[{click:"#pubtech-cmp #pt-actions button:nth-of-type(2)"}]}],optOut:[{click:"#pubtech-cmp #pt-close"}],test:[{eval:"EVAL_PUBTECH_0"}]},{name:"quantcast",prehideSelectors:["#qc-cmp2-main,#qc-cmp2-container"],detectCmp:[{exists:"#qc-cmp2-container"}],detectPopup:[{visible:"#qc-cmp2-ui"}],optOut:[{waitFor:'.qc-cmp2-summary-buttons > button[mode="secondary"]',timeout:2e3},{if:{exists:'.qc-cmp2-summary-buttons > button[mode="secondary"]:nth-of-type(2)'},then:[{click:'.qc-cmp2-summary-buttons > button[mode="secondary"]:nth-of-type(2)'}],else:[{click:'.qc-cmp2-summary-buttons > button[mode="secondary"]:nth-of-type(1)'},{waitFor:"#qc-cmp2-ui"},{click:'.qc-cmp2-toggle-switch > button[aria-checked="true"]',all:!0,optional:!0},{click:'.qc-cmp2-main button[aria-label="REJECT ALL"]',optional:!0},{waitForThenClick:'.qc-cmp2-main button[aria-label="SAVE & EXIT"],.qc-cmp2-buttons-desktop > button[mode="primary"]',timeout:5e3}]}],optIn:[{click:'.qc-cmp2-summary-buttons > button[mode="primary"]'}]},{name:"reddit.com",runContext:{urlPattern:"^https://www\\.reddit\\.com/"},prehideSelectors:["[bundlename=reddit_cookie_banner]"],detectCmp:[{exists:"reddit-cookie-banner"}],detectPopup:[{visible:"reddit-cookie-banner"}],optIn:[{waitForThenClick:["reddit-cookie-banner","#accept-all-cookies-button > button"]}],optOut:[{waitForThenClick:["reddit-cookie-banner","#reject-nonessential-cookies-button > button"]}],test:[{eval:"EVAL_REDDIT_0"}]},{name:"roblox",vendorUrl:"https://roblox.com",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?roblox\\.com/"},prehideSelectors:[],detectCmp:[{exists:".cookie-banner-wrapper"}],detectPopup:[{visible:".cookie-banner-wrapper .cookie-banner"}],optIn:[{waitForThenClick:".cookie-banner-wrapper button.btn-cta-lg"}],optOut:[{waitForThenClick:".cookie-banner-wrapper button.btn-secondary-lg"}],test:[{eval:"EVAL_ROBLOX_TEST"}]},{name:"rog-forum.asus.com",runContext:{urlPattern:"^https://rog-forum\\.asus\\.com/"},prehideSelectors:["#cookie-policy-info"],detectCmp:[{exists:"#cookie-policy-info"}],detectPopup:[{visible:"#cookie-policy-info"}],optIn:[{click:'div.cookie-btn-box > div[aria-label="Accept"]'}],optOut:[{click:'div.cookie-btn-box > div[aria-label="Reject"]'},{waitForThenClick:'.cookie-policy-lightbox-bottom > div[aria-label="Save Settings"]'}]},{name:"roofingmegastore.co.uk",runContext:{urlPattern:"^https://(www\\.)?roofingmegastore\\.co\\.uk"},prehideSelectors:["#m-cookienotice"],detectCmp:[{exists:"#m-cookienotice"}],detectPopup:[{visible:"#m-cookienotice"}],optIn:[{click:"#accept-cookies"}],optOut:[{click:"#manage-cookies"},{waitForThenClick:"#accept-selected"}]},{name:"samsung.com",runContext:{urlPattern:"^https://www\\.samsung\\.com/"},cosmetic:!0,prehideSelectors:["div.cookie-bar"],detectCmp:[{exists:"div.cookie-bar"}],detectPopup:[{visible:"div.cookie-bar"}],optIn:[{click:"div.cookie-bar__manage > a"}],optOut:[{hide:"div.cookie-bar"}]},{name:"setapp.com",vendorUrl:"https://setapp.com/",cosmetic:!0,runContext:{urlPattern:"^https://setapp\\.com/"},prehideSelectors:[],detectCmp:[{exists:".cookie-banner.js-cookie-banner"}],detectPopup:[{visible:".cookie-banner.js-cookie-banner"}],optIn:[{waitForThenClick:".cookie-banner.js-cookie-banner button"}],optOut:[{hide:".cookie-banner.js-cookie-banner"}]},{name:"sibbo",prehideSelectors:["sibbo-cmp-layout"],detectCmp:[{exists:"sibbo-cmp-layout"}],detectPopup:[{visible:"#rejectAllMain"}],optIn:[{click:"#acceptAllMain"}],optOut:[{click:"#rejectAllMain"}]},{name:"similarweb.com",cosmetic:!0,prehideSelectors:[".app-cookies-notification"],detectCmp:[{exists:".app-cookies-notification"}],detectPopup:[{exists:".app-layout .app-cookies-notification"}],optIn:[{click:"button.app-cookies-notification__dismiss"}],optOut:[{hide:".app-layout .app-cookies-notification"}]},{name:"Sirdata",cosmetic:!1,prehideSelectors:["#sd-cmp"],detectCmp:[{exists:"#sd-cmp"}],detectPopup:[{visible:"#sd-cmp"}],optIn:[{waitForThenClick:"#sd-cmp .sd-cmp-3cRQ2"}],optOut:[{waitForThenClick:["#sd-cmp","xpath///span[contains(., 'Do not accept') or contains(., 'Acceptera inte') or contains(., 'No aceptar') or contains(., 'Ikke acceptere') or contains(., 'Nicht akzeptieren') or contains(., 'Не приемам') or contains(., 'Να μην γίνει αποδοχή') or contains(., 'Niet accepteren') or contains(., 'Nepřijímat') or contains(., 'Nie akceptuj') or contains(., 'Nu acceptați') or contains(., 'Não aceitar') or contains(., 'Continuer sans accepter') or contains(., 'Non accettare') or contains(., 'Nem fogad el')]"]}]},{name:"skyscanner",vendorUrl:"https://skyscanner.com",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?skyscanner[\\.a-z]+/"},prehideSelectors:[".cookie-banner-wrapper"],detectCmp:[{exists:"#cookieBannerContent"}],detectPopup:[{visible:"#cookieBannerContent"}],optIn:[{waitForThenClick:"[data-tracking-element-id=cookie_banner_accept_all]"}],optOut:[{waitForThenClick:"[data-tracking-element-id=cookie_banner_essential_only]"},{waitForVisible:"#cookieBannerContent",check:"none"}],test:[{eval:"EVAL_SKYSCANNER_TEST"}]},{name:"snigel",detectCmp:[{exists:".snigel-cmp-framework"}],detectPopup:[{visible:".snigel-cmp-framework"}],optOut:[{click:"#sn-b-custom"},{click:"#sn-b-save"}],test:[{eval:"EVAL_SNIGEL_0"}],optIn:[{click:".snigel-cmp-framework #accept-choices"}]},{name:"steampowered.com",detectCmp:[{exists:".cookiepreferences_popup"},{visible:".cookiepreferences_popup"}],detectPopup:[{visible:".cookiepreferences_popup"}],optOut:[{click:"#rejectAllButton"}],optIn:[{click:"#acceptAllButton"}],test:[{wait:1e3},{eval:"EVAL_STEAMPOWERED_0"}]},{name:"strato.de",prehideSelectors:[".consent__wrapper"],runContext:{urlPattern:"^https://www\\.strato\\.de/"},detectCmp:[{exists:".consent"}],detectPopup:[{visible:".consent"}],optIn:[{click:"button.consentAgree"}],optOut:[{click:"button.consentSettings"},{waitForThenClick:"button#consentSubmit"}]},{name:"svt.se",vendorUrl:"https://www.svt.se/",runContext:{urlPattern:"^https://www\\.svt\\.se/"},prehideSelectors:["[class*=CookieConsent__root___]"],detectCmp:[{exists:"[class*=CookieConsent__root___]"}],detectPopup:[{visible:"[class*=CookieConsent__modal___]"}],optIn:[{waitForThenClick:"[class*=CookieConsent__modal___] > div > button[class*=primary]"}],optOut:[{waitForThenClick:"[class*=CookieConsent__modal___] > div > button[class*=secondary]:nth-child(2)"}],test:[{eval:"EVAL_SVT_TEST"}]},{name:"takealot.com",cosmetic:!0,prehideSelectors:['div[class^="cookies-banner-module_"]'],detectCmp:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],detectPopup:[{exists:'div[class^="cookies-banner-module_cookie-banner_"]'}],optIn:[{click:'button[class*="cookies-banner-module_dismiss-button_"]'}],optOut:[{hide:'div[class^="cookies-banner-module_"]'},{if:{exists:'div[class^="cookies-banner-module_small-cookie-banner_"]'},then:[{eval:"EVAL_TAKEALOT_0"}],else:[]}]},{name:"tarteaucitron.js",prehideSelectors:["#tarteaucitronRoot"],detectCmp:[{exists:"#tarteaucitronRoot"}],detectPopup:[{visible:"#tarteaucitronRoot #tarteaucitronAlertBig",check:"any"}],optIn:[{eval:"EVAL_TARTEAUCITRON_1"}],optOut:[{eval:"EVAL_TARTEAUCITRON_0"}],test:[{eval:"EVAL_TARTEAUCITRON_2",comment:"sometimes there are required categories, so we check that at least something is false"}]},{name:"taunton",vendorUrl:"https://www.taunton.com/",prehideSelectors:["#taunton-user-consent__overlay"],detectCmp:[{exists:"#taunton-user-consent__overlay"}],detectPopup:[{exists:"#taunton-user-consent__overlay:not([aria-hidden=true])"}],optIn:[{click:"#taunton-user-consent__toolbar input[type=checkbox]:not(:checked)"},{click:"#taunton-user-consent__toolbar button[type=submit]"}],optOut:[{click:"#taunton-user-consent__toolbar input[type=checkbox]:checked",optional:!0,all:!0},{click:"#taunton-user-consent__toolbar button[type=submit]"}],test:[{eval:"EVAL_TAUNTON_TEST"}]},{name:"Tealium",prehideSelectors:["#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs,#__tealiumImplicitmodal,#consent-layer"],detectCmp:[{exists:"#__tealiumGDPRecModal *,#__tealiumGDPRcpPrefs *,#__tealiumImplicitmodal *"},{eval:"EVAL_TEALIUM_0"}],detectPopup:[{visible:"#__tealiumGDPRecModal *,#__tealiumGDPRcpPrefs *,#__tealiumImplicitmodal *",check:"any"}],optOut:[{eval:"EVAL_TEALIUM_1"},{eval:"EVAL_TEALIUM_DONOTSELL"},{hide:"#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs,#__tealiumImplicitmodal"},{waitForThenClick:"#cm-acceptNone,.js-accept-essential-cookies,#continueWithoutAccepting",timeout:1e3,optional:!0}],optIn:[{hide:"#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs"},{eval:"EVAL_TEALIUM_2"}],test:[{eval:"EVAL_TEALIUM_3"},{eval:"EVAL_TEALIUM_DONOTSELL_CHECK"},{visible:"#__tealiumGDPRecModal,#__tealiumGDPRcpPrefs",check:"none"}]},{name:"temu",vendorUrl:"https://temu.com",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?temu\\.com/"},prehideSelectors:[],detectCmp:[{exists:'div > div > div > div > span[href*="/cookie-and-similar-technologies-policy.html"]'}],detectPopup:[{visible:'div > div > div > div > span[href*="/cookie-and-similar-technologies-policy.html"]'}],optIn:[{waitForThenClick:'div > div > div:has(> div > span[href*="/cookie-and-similar-technologies-policy.html"]) > [role=button]:nth-child(3)'}],optOut:[{if:{exists:"xpath///span[contains(., 'Alle afwijzen') or contains(., 'Reject all') or contains(., 'Tümünü reddet') or contains(., 'Odrzuć wszystko')]"},then:[{waitForThenClick:"xpath///span[contains(., 'Alle afwijzen') or contains(., 'Reject all') or contains(., 'Tümünü reddet') or contains(., 'Odrzuć wszystko')]"}],else:[{waitForThenClick:'div > div > div:has(> div > span[href*="/cookie-and-similar-technologies-policy.html"]) > [role=button]:nth-child(2)'}]}]},{name:"Termly",prehideSelectors:["#termly-code-snippet-support"],detectCmp:[{exists:"#termly-code-snippet-support"}],detectPopup:[{visible:"#termly-code-snippet-support div"}],optIn:[{waitForThenClick:'[data-tid="banner-accept"]'}],optOut:[{if:{exists:'[data-tid="banner-decline"]'},then:[{click:'[data-tid="banner-decline"]'}],else:[{click:".t-preference-button"},{wait:500},{if:{exists:".t-declineAllButton"},then:[{click:".t-declineAllButton"}],else:[{waitForThenClick:".t-preference-modal input[type=checkbox][checked]:not([disabled])",all:!0},{waitForThenClick:".t-saveButton"}]}]}]},{name:"termsfeed",vendorUrl:"https://termsfeed.com",comment:"v4.x.x",prehideSelectors:[".termsfeed-com---nb"],detectCmp:[{exists:".termsfeed-com---nb"}],detectPopup:[{visible:".termsfeed-com---nb"}],optIn:[{waitForThenClick:".cc-nb-okagree"}],optOut:[{waitForThenClick:".cc-nb-reject"}]},{name:"termsfeed3",vendorUrl:"https://termsfeed.com",comment:"v3.x.x",prehideSelectors:[".cc_dialog.cc_css_reboot,.cc_overlay_lock"],detectCmp:[{exists:".cc_dialog.cc_css_reboot"}],detectPopup:[{visible:".cc_dialog.cc_css_reboot"}],optIn:[{waitForThenClick:".cc_dialog.cc_css_reboot .cc_b_ok"}],optOut:[{if:{exists:".cc_dialog.cc_css_reboot .cc_b_cp"},then:[{click:".cc_dialog.cc_css_reboot .cc_b_cp"},{waitForVisible:".cookie-consent-preferences-dialog .cc_cp_f_save button"},{waitForThenClick:".cookie-consent-preferences-dialog .cc_cp_f_save button"}],else:[{hide:".cc_dialog.cc_css_reboot,.cc_overlay_lock"}]}]},{name:"tesco",vendorUrl:"https://www.tesco.com",cosmetic:!1,runContext:{urlPattern:"^https://(www\\.)?tesco\\.com/"},prehideSelectors:["[class*=CookieBanner__Sizer]"],detectCmp:[{exists:"[aria-label=consent-banner]"}],detectPopup:[{visible:"[aria-label=consent-banner]"}],optIn:[{wait:1e3},{waitForThenClick:"xpath///button[contains(., 'Accept all')]"}],optOut:[{wait:1e3},{waitForThenClick:"xpath///button[contains(., 'Reject all')]"}]},{name:"tesla",vendorUrl:"https://tesla.com/",runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?tesla\\.com/"},prehideSelectors:[],detectCmp:[{exists:"#cookie_banner"}],detectPopup:[{visible:"#cookie_banner"}],optIn:[{waitForThenClick:"#tsla-accept-cookie"}],optOut:[{waitForThenClick:"#tsla-reject-cookie"}],test:[{eval:"EVAL_TESLA_TEST"}]},{name:"Test page cosmetic CMP",cosmetic:!0,prehideSelectors:["#privacy-test-page-cmp-test-prehide"],detectCmp:[{exists:"#privacy-test-page-cmp-test-banner"}],detectPopup:[{visible:"#privacy-test-page-cmp-test-banner"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{hide:"#privacy-test-page-cmp-test-banner"}],test:[{wait:500},{eval:"EVAL_TESTCMP_COSMETIC_0"}]},{name:"Test page CMP",prehideSelectors:["#reject-all"],detectCmp:[{exists:"#privacy-test-page-cmp-test"}],detectPopup:[{visible:"#privacy-test-page-cmp-test"}],optIn:[{waitFor:"#accept-all"},{click:"#accept-all"}],optOut:[{waitFor:"#reject-all"},{eval:"EVAL_TESTCMP_STEP"},{click:"#reject-all"}],test:[{eval:"EVAL_TESTCMP_0"}]},{name:"thalia.de",prehideSelectors:[".consent-banner-box"],detectCmp:[{exists:"consent-banner[component=consent-banner]"}],detectPopup:[{visible:".consent-banner-box"}],optIn:[{click:".button-zustimmen"}],optOut:[{click:"button[data-consent=disagree]"}]},{name:"thefreedictionary.com",prehideSelectors:["#cmpBanner"],detectCmp:[{exists:"#cmpBanner"}],detectPopup:[{visible:"#cmpBanner"}],optIn:[{eval:"EVAL_THEFREEDICTIONARY_1"}],optOut:[{eval:"EVAL_THEFREEDICTIONARY_0"}]},{name:"theverge",runContext:{frame:!1,main:!0,urlPattern:"^https://(www)?\\.theverge\\.com"},intermediate:!1,prehideSelectors:[".duet--cta--cookie-banner"],detectCmp:[{exists:".duet--cta--cookie-banner"}],detectPopup:[{visible:".duet--cta--cookie-banner"}],optIn:[{click:".duet--cta--cookie-banner button.tracking-12",all:!1}],optOut:[{click:".duet--cta--cookie-banner button.tracking-12 > span"}],test:[{eval:"EVAL_THEVERGE_0"}]},{name:"tidbits-com",cosmetic:!0,prehideSelectors:["#eu_cookie_law_widget-2"],detectCmp:[{exists:"#eu_cookie_law_widget-2"}],detectPopup:[{visible:"#eu_cookie_law_widget-2"}],optIn:[{click:"#eu-cookie-law form > input.accept"}],optOut:[{hide:"#eu_cookie_law_widget-2"}]},{name:"tractor-supply",runContext:{urlPattern:"^https://www\\.tractorsupply\\.com/"},cosmetic:!0,prehideSelectors:[".tsc-cookie-banner"],detectCmp:[{exists:".tsc-cookie-banner"}],detectPopup:[{visible:".tsc-cookie-banner"}],optIn:[{click:"#cookie-banner-cancel"}],optOut:[{hide:".tsc-cookie-banner"}]},{name:"trader-joes-com",cosmetic:!0,prehideSelectors:['div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'],detectCmp:[{exists:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],detectPopup:[{visible:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}],optIn:[{click:'div[class^="CookiesAlert_cookiesAlert__container__"] button'}],optOut:[{hide:'div.aem-page > div[class^="CookiesAlert_cookiesAlert__"]'}]},{name:"transcend",vendorUrl:"https://unknown",cosmetic:!0,prehideSelectors:["#transcend-consent-manager"],detectCmp:[{exists:"#transcend-consent-manager"}],detectPopup:[{visible:"#transcend-consent-manager"}],optIn:[{waitForThenClick:["#transcend-consent-manager","#consentManagerMainDialog .inner-container button"]}],optOut:[{hide:"#transcend-consent-manager"}]},{name:"transip-nl",runContext:{urlPattern:"^https://www\\.transip\\.nl/"},prehideSelectors:["#consent-modal"],detectCmp:[{any:[{exists:"#consent-modal"},{exists:"#privacy-settings-content"}]}],detectPopup:[{any:[{visible:"#consent-modal"},{visible:"#privacy-settings-content"}]}],optIn:[{click:'button[type="submit"]'}],optOut:[{if:{exists:"#privacy-settings-content"},then:[{click:'button[type="submit"]'}],else:[{click:"div.one-modal__action-footer-column--secondary > a"}]}]},{name:"tropicfeel-com",prehideSelectors:["#shopify-section-cookies-controller"],detectCmp:[{exists:"#shopify-section-cookies-controller"}],detectPopup:[{visible:"#shopify-section-cookies-controller #cookies-controller-main-pane",check:"any"}],optIn:[{waitForThenClick:"#cookies-controller-main-pane form[data-form-allow-all] button"}],optOut:[{click:"#cookies-controller-main-pane a[data-tab-target=manage-cookies]"},{waitFor:"#manage-cookies-pane.active"},{click:"#manage-cookies-pane.active input[type=checkbox][checked]:not([disabled])",all:!0},{click:"#manage-cookies-pane.active button[type=submit]"}],test:[]},{name:"true-car",runContext:{urlPattern:"^https://www\\.truecar\\.com/"},cosmetic:!0,prehideSelectors:[['div[aria-labelledby="cookie-banner-heading"]']],detectCmp:[{exists:'div[aria-labelledby="cookie-banner-heading"]'}],detectPopup:[{visible:'div[aria-labelledby="cookie-banner-heading"]'}],optIn:[{click:'div[aria-labelledby="cookie-banner-heading"] > button[aria-label="Close"]'}],optOut:[{hide:'div[aria-labelledby="cookie-banner-heading"]'}]},{name:"truyo",prehideSelectors:["#truyo-consent-module"],detectCmp:[{exists:"#truyo-cookieBarContent"}],detectPopup:[{visible:"#truyo-consent-module"}],optIn:[{click:"button#acceptAllCookieButton"}],optOut:[{click:"button#declineAllCookieButton"}]},{name:"twcc",vendorUrl:"https://unknown",cosmetic:!1,runContext:{main:!0,frame:!1,urlPattern:""},prehideSelectors:["#twcc__mechanism"],detectCmp:[{exists:"#twcc__mechanism .twcc__notice"}],detectPopup:[{visible:"#twcc__mechanism .twcc__notice"}],optIn:[{waitForThenClick:"#twcc__accept-button"}],optOut:[{waitForThenClick:"#twcc__decline-button"}],test:[{eval:"EVAL_TWCC_TEST"}]},{name:"twitch-mobile",vendorUrl:"https://m.twitch.tv/",cosmetic:!0,runContext:{urlPattern:"^https?://m\\.twitch\\.tv"},prehideSelectors:[],detectCmp:[{exists:'.ReactModal__Overlay [href="https://www.twitch.tv/p/cookie-policy"]'}],detectPopup:[{visible:'.ReactModal__Overlay [href="https://www.twitch.tv/p/cookie-policy"]'}],optIn:[{waitForThenClick:'.ReactModal__Overlay:has([href="https://www.twitch.tv/p/cookie-policy"]) button'}],optOut:[{hide:'.ReactModal__Overlay:has([href="https://www.twitch.tv/p/cookie-policy"])'}]},{name:"twitch.tv",runContext:{urlPattern:"^https?://(www\\.)?twitch\\.tv"},prehideSelectors:["div:has(> .consent-banner .consent-banner__content--gdpr-v2),.ReactModalPortal:has([data-a-target=consent-modal-save])"],detectCmp:[{exists:".consent-banner .consent-banner__content--gdpr-v2"}],detectPopup:[{visible:".consent-banner .consent-banner__content--gdpr-v2"}],optIn:[{click:'button[data-a-target="consent-banner-accept"]'}],optOut:[{hide:"div:has(> .consent-banner .consent-banner__content--gdpr-v2)"},{click:'button[data-a-target="consent-banner-manage-preferences"]'},{waitFor:"input[type=checkbox][data-a-target=tw-checkbox]"},{click:"input[type=checkbox][data-a-target=tw-checkbox][checked]:not([disabled])",all:!0,optional:!0},{waitForThenClick:"[data-a-target=consent-modal-save]"},{waitForVisible:".ReactModalPortal:has([data-a-target=consent-modal-save])",check:"none"}]},{name:"twitter",runContext:{urlPattern:"^https://([a-z0-9-]+\\.)?(twitter|x)\\.com/"},prehideSelectors:['[data-testid="BottomBar"]'],detectCmp:[{exists:'[data-testid="BottomBar"] div'}],detectPopup:[{visible:'[data-testid="BottomBar"] div'}],optIn:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>button[role=button]>span) > div:last-child > button[role=button]:first-child'}],optOut:[{waitForThenClick:'[data-testid="BottomBar"] > div:has(>div:first-child>div:last-child>button[role=button]>span) > div:last-child > button[role=button]:last-child'}],TODOtest:[{eval:"EVAL_document.cookie.includes('d_prefs=MjoxLGNvbnNlbnRfdmVyc2lvbjoy')"}]},{name:"ubuntu.com",prehideSelectors:["dialog.cookie-policy"],detectCmp:[{any:[{exists:"dialog.cookie-policy header"},{exists:'xpath///*[@id="modal"]/div/header'}]}],detectPopup:[{any:[{visible:"dialog header"},{visible:'xpath///*[@id="modal"]/div/header'}]}],optIn:[{any:[{waitForThenClick:"#cookie-policy-button-accept"},{waitForThenClick:'xpath///*[@id="cookie-policy-button-accept"]'}]}],optOut:[{any:[{waitForThenClick:"button.js-manage"},{waitForThenClick:'xpath///*[@id="cookie-policy-content"]/p[4]/button[2]'}]},{waitForThenClick:"dialog.cookie-policy .p-switch__input:checked",optional:!0,all:!0,timeout:500},{any:[{waitForThenClick:"dialog.cookie-policy .js-save-preferences"},{waitForThenClick:'xpath///*[@id="modal"]/div/button'}]}],test:[{eval:"EVAL_UBUNTU_COM_0"}]},{name:"UK Cookie Consent",prehideSelectors:["#catapult-cookie-bar"],cosmetic:!0,detectCmp:[{exists:"#catapult-cookie-bar"}],detectPopup:[{exists:".has-cookie-bar #catapult-cookie-bar"}],optIn:[{click:"#catapultCookie"}],optOut:[{hide:"#catapult-cookie-bar"}],test:[{eval:"EVAL_UK_COOKIE_CONSENT_0"}]},{name:"urbanarmorgear-com",cosmetic:!0,prehideSelectors:['div[class^="Layout__CookieBannerContainer-"]'],detectCmp:[{exists:'div[class^="Layout__CookieBannerContainer-"]'}],detectPopup:[{visible:'div[class^="Layout__CookieBannerContainer-"]'}],optIn:[{click:'button[class^="CookieBanner__AcceptButton"]'}],optOut:[{hide:'div[class^="Layout__CookieBannerContainer-"]'}]},{name:"usercentrics-api",detectCmp:[{exists:"#usercentrics-root,#usercentrics-cmp-ui"}],detectPopup:[{eval:"EVAL_USERCENTRICS_API_0"},{if:{exists:"#usercentrics-cmp-ui"},then:[{waitForVisible:"#usercentrics-cmp-ui",timeout:2e3}],else:[{exists:["#usercentrics-root","[data-testid=uc-container]"]},{waitForVisible:"#usercentrics-root",timeout:2e3}]}],optIn:[{eval:"EVAL_USERCENTRICS_API_3"},{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_5"}],optOut:[{eval:"EVAL_USERCENTRICS_API_1"},{eval:"EVAL_USERCENTRICS_API_2"}],test:[{eval:"EVAL_USERCENTRICS_API_6"}]},{name:"usercentrics-button",detectCmp:[{exists:"#usercentrics-button"}],detectPopup:[{visible:"#usercentrics-button #uc-btn-accept-banner"}],optIn:[{click:"#usercentrics-button #uc-btn-accept-banner"}],optOut:[{click:"#usercentrics-button #uc-btn-deny-banner"}],test:[{eval:"EVAL_USERCENTRICS_BUTTON_0"}]},{name:"uswitch.com",runContext:{main:!0,frame:!1,urlPattern:"^https://(www\\.)?uswitch\\.com/"},prehideSelectors:[".ucb"],detectCmp:[{exists:".ucb-banner"}],detectPopup:[{visible:".ucb-banner"}],optIn:[{waitForThenClick:".ucb-banner .ucb-btn-accept"}],optOut:[{waitForThenClick:".ucb-banner .ucb-btn-save"}]},{name:"vodafone.de",runContext:{urlPattern:"^https://www\\.vodafone\\.de/"},prehideSelectors:[".dip-consent,.dip-consent-container"],detectCmp:[{exists:".dip-consent-container"}],detectPopup:[{visible:".dip-consent-content"}],optOut:[{click:'.dip-consent-btn[tabindex="2"]'}],optIn:[{click:'.dip-consent-btn[tabindex="1"]'}]},{name:"waitrose.com",prehideSelectors:["div[aria-labelledby=CookieAlertModalHeading]","section[data-test=initial-waitrose-cookie-consent-banner]","section[data-test=cookie-consent-modal]"],detectCmp:[{exists:"section[data-test=initial-waitrose-cookie-consent-banner]"}],detectPopup:[{visible:"section[data-test=initial-waitrose-cookie-consent-banner]"}],optIn:[{click:"button[data-test=accept-all]"}],optOut:[{click:"button[data-test=manage-cookies]"},{wait:200},{eval:"EVAL_WAITROSE_0"},{click:"button[data-test=submit]"}],test:[{eval:"EVAL_WAITROSE_1"}]},{name:"webflow",vendorUrl:"https://webflow.com/",prehideSelectors:[".fs-cc-components"],detectCmp:[{exists:".fs-cc-components"}],detectPopup:[{visible:".fs-cc-components"},{visible:"[fs-cc=banner]"}],optIn:[{wait:500},{waitForThenClick:"[fs-cc=banner] [fs-cc=allow]"}],optOut:[{wait:500},{waitForThenClick:"[fs-cc=banner] [fs-cc=deny]"}]},{name:"wetransfer.com",detectCmp:[{exists:".welcome__cookie-notice"}],detectPopup:[{visible:".welcome__cookie-notice"}],optIn:[{click:".welcome__button--accept"}],optOut:[{click:".welcome__button--decline"}]},{name:"whitepages.com",runContext:{urlPattern:"^https://www\\.whitepages\\.com/"},cosmetic:!0,prehideSelectors:[".cookie-wrapper, .cookie-overlay"],detectCmp:[{exists:".cookie-wrapper"}],detectPopup:[{visible:".cookie-overlay"}],optIn:[{click:'button[aria-label="Got it"]'}],optOut:[{hide:".cookie-wrapper"}]},{name:"wolframalpha",vendorUrl:"https://www.wolframalpha.com",prehideSelectors:[],cosmetic:!0,runContext:{urlPattern:"^https://www\\.wolframalpha\\.com/"},detectCmp:[{exists:"section._a_yb"}],detectPopup:[{visible:"section._a_yb"}],optIn:[{waitForThenClick:"section._a_yb button"}],optOut:[{hide:"section._a_yb"}]},{name:"woo-commerce-com",prehideSelectors:[".wccom-comp-privacy-banner .wccom-privacy-banner"],detectCmp:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],detectPopup:[{exists:".wccom-comp-privacy-banner .wccom-privacy-banner"}],optIn:[{click:".wccom-privacy-banner__content-buttons button.is-primary"}],optOut:[{click:".wccom-privacy-banner__content-buttons button.is-secondary"},{waitForThenClick:"input[type=checkbox][checked]:not([disabled])",all:!0},{click:"div.wccom-modal__footer > button"}]},{name:"WP Cookie Notice for GDPR",vendorUrl:"https://wordpress.org/plugins/gdpr-cookie-consent/",prehideSelectors:["#gdpr-cookie-consent-bar"],detectCmp:[{exists:"#gdpr-cookie-consent-bar"}],detectPopup:[{visible:"#gdpr-cookie-consent-bar"}],optIn:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_accept"}],optOut:[{waitForThenClick:"#gdpr-cookie-consent-bar #cookie_action_reject"}],test:[{eval:"EVAL_WP_COOKIE_NOTICE_0"}]},{name:"wpcc",cosmetic:!0,prehideSelectors:[".wpcc-container"],detectCmp:[{exists:".wpcc-container"}],detectPopup:[{exists:".wpcc-container .wpcc-message"}],optIn:[{click:".wpcc-compliance .wpcc-btn"}],optOut:[{hide:".wpcc-container"}]},{name:"xe.com",vendorUrl:"https://www.xe.com/",runContext:{urlPattern:"^https://www\\.xe\\.com/"},prehideSelectors:["[class*=ConsentBanner]"],detectCmp:[{exists:"[class*=ConsentBanner]"}],detectPopup:[{visible:"[class*=ConsentBanner]"}],optIn:[{waitForThenClick:"[class*=ConsentBanner] .egnScw"}],optOut:[{wait:1e3},{waitForThenClick:"[class*=ConsentBanner] .frDWEu"},{waitForThenClick:"[class*=ConsentBanner] .hXIpFU"}],test:[{eval:"EVAL_XE_TEST"}]},{name:"xhamster-eu",prehideSelectors:[".cookies-modal"],detectCmp:[{exists:".cookies-modal"}],detectPopup:[{exists:".cookies-modal"}],optIn:[{click:"button.cmd-button-accept-all"}],optOut:[{click:"button.cmd-button-reject-all"}]},{name:"xhamster-us",runContext:{urlPattern:"^https://(www\\.)?xhamster\\d?\\.com"},cosmetic:!0,prehideSelectors:[".cookie-announce"],detectCmp:[{exists:".cookie-announce"}],detectPopup:[{visible:".cookie-announce .announce-text"}],optIn:[{click:".cookie-announce button.xh-button"}],optOut:[{hide:".cookie-announce"}]},{name:"xing.com",detectCmp:[{exists:"div[class^=cookie-consent-CookieConsent]"}],detectPopup:[{exists:"div[class^=cookie-consent-CookieConsent]"}],optIn:[{click:"#consent-accept-button"}],optOut:[{click:"#consent-settings-button"},{click:".consent-banner-button-accept-overlay"}],test:[{eval:"EVAL_XING_0"}]},{name:"xnxx-com",cosmetic:!0,prehideSelectors:["#cookies-use-alert"],detectCmp:[{exists:"#cookies-use-alert"}],detectPopup:[{visible:"#cookies-use-alert"}],optIn:[{click:"#cookies-use-alert .close"}],optOut:[{hide:"#cookies-use-alert"}]},{name:"xvideos",vendorUrl:"https://xvideos.com",runContext:{urlPattern:"^https://[^/]*xvideos\\.com/"},prehideSelectors:[],detectCmp:[{exists:".disclaimer-opened #disclaimer-cookies"}],detectPopup:[{visible:".disclaimer-opened #disclaimer-cookies"}],optIn:[{waitForThenClick:"#disclaimer-accept_cookies"}],optOut:[{waitForThenClick:"#disclaimer-reject_cookies"}]},{name:"Yahoo",runContext:{urlPattern:"^https://consent\\.yahoo\\.com/v2/"},prehideSelectors:["#reject-all"],detectCmp:[{exists:"#consent-page"}],detectPopup:[{visible:"#consent-page"}],optIn:[{waitForThenClick:"#consent-page button[value=agree]"}],optOut:[{waitForThenClick:"#consent-page button[value=reject]"}]},{name:"youporn.com",cosmetic:!0,prehideSelectors:[".euCookieModal, #js_euCookieModal"],detectCmp:[{exists:".euCookieModal"}],detectPopup:[{exists:".euCookieModal, #js_euCookieModal"}],optIn:[{click:'button[name="user_acceptCookie"]'}],optOut:[{hide:".euCookieModal"}]},{name:"youtube-desktop",prehideSelectors:["tp-yt-iron-overlay-backdrop.opened","ytd-consent-bump-v2-lightbox"],detectCmp:[{exists:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"},{exists:'ytd-consent-bump-v2-lightbox tp-yt-paper-dialog a[href^="https://consent.youtube.com/"]'}],detectPopup:[{visible:"ytd-consent-bump-v2-lightbox tp-yt-paper-dialog"}],optIn:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:last-child button"},{wait:500}],optOut:[{waitForThenClick:"ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child #button,ytd-consent-bump-v2-lightbox .eom-buttons .eom-button-row:first-child ytd-button-renderer:first-child button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_DESKTOP_0"}]},{name:"youtube-mobile",prehideSelectors:[".consent-bump-v2-lightbox"],detectCmp:[{exists:"ytm-consent-bump-v2-renderer"}],detectPopup:[{visible:"ytm-consent-bump-v2-renderer"}],optIn:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:first-child button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:first-child button"},{wait:500}],optOut:[{waitForThenClick:"ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons c3-material-button:nth-child(2) button, ytm-consent-bump-v2-renderer .privacy-terms + .one-col-dialog-buttons ytm-button-renderer:nth-child(2) button"},{wait:500}],test:[{wait:500},{eval:"EVAL_YOUTUBE_MOBILE_0"}]},{name:"zdf",prehideSelectors:["#zdf-cmp-banner-sdk"],detectCmp:[{exists:"#zdf-cmp-banner-sdk"}],detectPopup:[{visible:"#zdf-cmp-main.zdf-cmp-show"}],optIn:[{waitForThenClick:"#zdf-cmp-main #zdf-cmp-accept-btn"}],optOut:[{waitForThenClick:"#zdf-cmp-main #zdf-cmp-deny-btn"}],test:[]},{name:"zentralruf-de",runContext:{urlPattern:"^https://(www\\.)?zentralruf\\.de"},prehideSelectors:["#cookie_modal_wrapper"],detectCmp:[{exists:"#cookie_modal_wrapper"}],detectPopup:[{visible:"#cookie_modal_wrapper"}],optIn:[{waitForThenClick:"#cookie_modal_wrapper #cookie_modal_button_consent_all"}],optOut:[{waitForThenClick:"#cookie_modal_wrapper #cookie_modal_button_choose"}]}],ye={"didomi.io":{detectors:[{presentMatcher:{target:{selector:"#didomi-host, #didomi-notice"},type:"css"},showingMatcher:{target:{selector:"body.didomi-popup-open, .didomi-notice-banner"},type:"css"}}],methods:[{action:{target:{selector:".didomi-popup-notice-buttons .didomi-button:not(.didomi-button-highlight), .didomi-notice-banner .didomi-learn-more-button"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{retries:50,target:{selector:"#didomi-purpose-cookies"},type:"waitcss",waitTime:50},{consents:[{description:"Share (everything) with others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-share_whith_others]:last-child"},type:"click"},type:"X"},{description:"Information storage and access",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-cookies]:last-child"},type:"click"},type:"D"},{description:"Content selection, offers and marketing",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-CL-T1Rgm7]:last-child"},type:"click"},type:"E"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-analytics]:last-child"},type:"click"},type:"B"},{description:"Analytics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-M9NRHJe3G]:last-child"},type:"click"},type:"B"},{description:"Ad and content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-advertising_personalization]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection",falseAction:{parent:{childFilter:{target:{selector:"#didomi-purpose-pub-ciblee"}},selector:".didomi-consent-popup-data-processing, .didomi-components-accordion-label-container"},target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-pub-ciblee]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - basics",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-q4zlJqdcD]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - partners and subsidiaries",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-partenaire-cAsDe8jC]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-p4em9a8m]:last-child"},type:"click"},type:"F"},{description:"Ad and content selection - others",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-autres-pub]:last-child"},type:"click"},type:"F"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-reseauxsociaux]:last-child"},type:"click"},type:"A"},{description:"Social networks",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-social_media]:last-child"},type:"click"},type:"A"},{description:"Content selection",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-content_personalization]:last-child"},type:"click"},type:"E"},{description:"Ad delivery",falseAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:first-child"},type:"click"},trueAction:{target:{selector:".didomi-components-radio__option[aria-describedby=didomi-purpose-ad_delivery]:last-child"},type:"click"},type:"F"}],type:"consent"},{action:{consents:[{matcher:{childFilter:{target:{selector:":not(.didomi-components-radio__option--selected)"}},type:"css"},trueAction:{target:{selector:":nth-child(2)"},type:"click"},falseAction:{target:{selector:":first-child"},type:"click"},type:"X"}],type:"consent"},target:{selector:".didomi-components-radio"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".didomi-consent-popup-footer .didomi-consent-popup-actions"},target:{selector:".didomi-components-button:first-child"},type:"click"},name:"SAVE_CONSENT"}]},oil:{detectors:[{presentMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"},showingMatcher:{target:{selector:".as-oil-content-overlay"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".as-js-advanced-settings"},type:"click"},{retries:"10",target:{selector:".as-oil-cpc__purpose-container"},type:"waitcss",waitTime:"250"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{consents:[{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Information storage and access","Opbevaring af og adgang til oplysninger på din enhed"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"D"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personlige annoncer","Personalisation"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Annoncevalg, levering og rapportering","Ad selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:["Personalisering af indhold","Content selection, delivery, reporting"]},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"E"},{matcher:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{childFilter:{target:{selector:".as-oil-cpc__purpose-header",textFilter:["Måling","Measurement"]}},selector:".as-oil-cpc__purpose-container"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"B"},{matcher:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".as-oil-cpc__purpose-container",textFilter:"Google"},target:{selector:".as-oil-cpc__switch"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:".as-oil__btn-optin"},type:"click"},name:"SAVE_CONSENT"},{action:{target:{selector:"div.as-oil"},type:"hide"},name:"HIDE_CMP"}]},optanon:{detectors:[{presentMatcher:{target:{selector:"#optanon-menu, .optanon-alert-box-wrapper"},type:"css"},showingMatcher:{target:{displayFilter:!0,selector:".optanon-alert-box-wrapper"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".optanon-alert-box-wrapper .optanon-toggle-display, a[onclick*='OneTrust.ToggleInfoDisplay()'], a[onclick*='Optanon.ToggleInfoDisplay()']"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".preference-menu-item #Your-privacy"},type:"click"},{target:{selector:"#optanon-vendor-consent-text"},type:"click"},{action:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},target:{selector:"#optanon-vendor-consent-list .vendor-item"},type:"foreach"},{target:{selector:".vendor-consent-back-link"},type:"click"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-performance"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-functional"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-advertising"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-social"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Social Media Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalisation"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Site monitoring cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Third party privacy-enhanced content"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Performance & Advertising Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Information storage and access"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"D"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content selection, delivery, reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Measurement"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Recommended Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Unclassified Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"X"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Analytical Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"B"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Marketing Cookies"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Personalization"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Ad Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},type:"ifcss"},{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},trueAction:{actions:[{parent:{selector:"#optanon-menu, .optanon-menu"},target:{selector:".menu-item-necessary",textFilter:"Content Selection, Delivery & Reporting"},type:"click"},{consents:[{matcher:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status input"},type:"checkbox"},toggleAction:{parent:{selector:"#optanon-popup-body-right"},target:{selector:".optanon-status label"},type:"click"},type:"E"}],type:"consent"}],type:"list"},type:"ifcss"}],type:"list"},name:"DO_CONSENT"},{action:{parent:{selector:".optanon-save-settings-button"},target:{selector:".optanon-white-button-middle"},type:"click"},name:"SAVE_CONSENT"},{action:{actions:[{target:{selector:"#optanon-popup-wrapper"},type:"hide"},{target:{selector:"#optanon-popup-bg"},type:"hide"},{target:{selector:".optanon-alert-box-wrapper"},type:"hide"}],type:"list"},name:"HIDE_CMP"}]},quantcast2:{detectors:[{presentMatcher:{target:{selector:"[data-tracking-opt-in-overlay]"},type:"css"},showingMatcher:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"css"}}],methods:[{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-learn-more]"},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{type:"wait",waitTime:500},{action:{actions:[{target:{selector:"div",textFilter:["Information storage and access"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"D"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Personalization"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Ad selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"F"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Content selection, delivery, reporting"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"E"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Measurement"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"B"}],type:"consent"},type:"ifcss"},{target:{selector:"div",textFilter:["Other Partners"]},trueAction:{consents:[{matcher:{target:{selector:"input"},type:"checkbox"},toggleAction:{target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},type:"ifcss"}],type:"list"},parent:{childFilter:{target:{selector:"input"}},selector:"[data-tracking-opt-in-overlay] > div > div"},target:{childFilter:{target:{selector:"input"}},selector:":scope > div"},type:"foreach"}],type:"list"},name:"DO_CONSENT"},{action:{target:{selector:"[data-tracking-opt-in-overlay] [data-tracking-opt-in-save]"},type:"click"},name:"SAVE_CONSENT"}]},springer:{detectors:[{presentMatcher:{parent:null,target:{selector:".cmp-app_gdpr"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".cmp-popup_popup"},type:"css"}}],methods:[{action:{actions:[{target:{selector:".cmp-intro_rejectAll"},type:"click"},{type:"wait",waitTime:250},{target:{selector:".cmp-purposes_purposeItem:not(.cmp-purposes_selectedPurpose)"},type:"click"}],type:"list"},name:"OPEN_OPTIONS"},{action:{consents:[{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Przechowywanie informacji na urządzeniu lub dostęp do nich",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"D"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór podstawowych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"F"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Tworzenie profilu spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"E"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Wybór spersonalizowanych treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności reklam",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Pomiar wydajności treści",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"B"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Stosowanie badań rynkowych w celu generowania opinii odbiorców",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"},{matcher:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch .cmp-switch_isSelected"},type:"css"},toggleAction:{parent:{selector:".cmp-purposes_detailHeader",textFilter:"Opracowywanie i ulepszanie produktów",childFilter:{target:{selector:".cmp-switch_switch"}}},target:{selector:".cmp-switch_switch:not(.cmp-switch_isSelected)"},type:"click"},type:"X"}],type:"consent"},name:"DO_CONSENT"},{action:{target:{selector:".cmp-details_save"},type:"click"},name:"SAVE_CONSENT"}]},wordpressgdpr:{detectors:[{presentMatcher:{parent:null,target:{selector:".wpgdprc-consent-bar"},type:"css"},showingMatcher:{parent:null,target:{displayFilter:!0,selector:".wpgdprc-consent-bar"},type:"css"}}],methods:[{action:{parent:null,target:{selector:".wpgdprc-consent-bar .wpgdprc-consent-bar__settings",textFilter:null},type:"click"},name:"OPEN_OPTIONS"},{action:{actions:[{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Eyeota"},type:"click"},{consents:[{description:"Eyeota Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Eyeota"},target:{selector:"label"},type:"click"},type:"X"}],type:"consent"},{target:{selector:".wpgdprc-consent-modal .wpgdprc-button",textFilter:"Advertising"},type:"click"},{consents:[{description:"Advertising Cookies",matcher:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"input"},type:"checkbox"},toggleAction:{parent:{selector:".wpgdprc-consent-modal__description",textFilter:"Advertising"},target:{selector:"label"},type:"click"},type:"F"}],type:"consent"}],type:"list"},name:"DO_CONSENT"},{action:{parent:null,target:{selector:".wpgdprc-button",textFilter:"Save my settings"},type:"click"},name:"SAVE_CONSENT"}]}},we={autoconsent:_e,consentomatic:ye},Ce=Object.freeze({__proto__:null,autoconsent:_e,consentomatic:ye,default:we}); /*! Bundled license information: @ghostery/adblocker/dist/esm/codebooks/cosmetic-selector.js: @@ -442,4 +442,4 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. *) - */const wn=new class{constructor(e,t=null,o=null){if(this.id=c(),this.rules=[],this.foundCmp=null,this.state={cosmeticFiltersOn:!1,filterListReported:!1,lifecycle:"loading",prehideOn:!1,findCmpAttempts:0,detectedCmps:[],detectedPopups:[],selfTest:null},a.sendContentMessage=e,this.sendContentMessage=e,this.rules=[],this.updateState({lifecycle:"loading"}),this.addDynamicRules(),t)this.initialize(t,o);else{o&&this.parseDeclarativeRules(o);e({type:"init",url:window.location.href}),this.updateState({lifecycle:"waitingForInitResponse"})}this.domActions=new _(this)}initialize(e,t){const o=b(e);if(o.logs.lifecycle&&console.log("autoconsent init",window.location.href),this.config=o,o.enabled){if(t&&this.parseDeclarativeRules(t),e.enableFilterList){try{gn&&gn.length>0&&(this.filtersEngine=un.deserialize(gn))}catch(e){console.error("Error parsing filter list",e)}"loading"===document.readyState?window.addEventListener("DOMContentLoaded",(()=>{this.applyCosmeticFilters()})):this.applyCosmeticFilters()}if(this.rules=function(e,t){return e.filter((e=>(!t.disabledCmps||!t.disabledCmps.includes(e.name))&&(t.enableCosmeticRules||!e.isCosmetic)))}(this.rules,o),e.enablePrehide)if(document.documentElement)this.prehideElements();else{const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.prehideElements()};window.addEventListener("DOMContentLoaded",e)}if("loading"===document.readyState){const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.start()};window.addEventListener("DOMContentLoaded",e)}else this.start();this.updateState({lifecycle:"initialized"})}else o.logs.lifecycle&&console.log("autoconsent is disabled")}addDynamicRules(){v.forEach((e=>{this.rules.push(new e(this))}))}parseDeclarativeRules(e){e.consentomatic&&Object.keys(e.consentomatic).forEach((t=>{this.addConsentomaticCMP(t,e.consentomatic[t])})),e.autoconsent&&e.autoconsent.forEach((e=>{this.addDeclarativeCMP(e)}))}addDeclarativeCMP(e){this.rules.push(new u(e,this))}addConsentomaticCMP(e,t){this.rules.push(new h(`com_${e}`,t))}start(){!function(e,t=500){globalThis.requestIdleCallback?requestIdleCallback(e,{timeout:t}):setTimeout(e,0)}((()=>this._start()))}async _start(){const e=this.config.logs;e.lifecycle&&console.log(`Detecting CMPs on ${window.location.href}`),this.updateState({lifecycle:"started"});const t=await this.findCmp(this.config.detectRetries);if(this.updateState({detectedCmps:t.map((e=>e.name))}),0===t.length)return e.lifecycle&&console.log("no CMP found",location.href),this.config.enablePrehide&&this.undoPrehide(),this.filterListFallback();this.updateState({lifecycle:"cmpDetected"});const o=[],i=[];for(const e of t)e.isCosmetic?i.push(e):o.push(e);let n=!1,s=await this.detectPopups(o,(async e=>{n=await this.handlePopup(e)}));if(0===s.length&&(s=await this.detectPopups(i,(async e=>{n=await this.handlePopup(e)}))),0===s.length)return e.lifecycle&&console.log("no popup found"),this.config.enablePrehide&&this.undoPrehide(),!1;if(s.length>1){const t={msg:"Found multiple CMPs, check the detection rules.",cmps:s.map((e=>e.name))};e.errors&&console.warn(t.msg,t.cmps),this.sendContentMessage({type:"autoconsentError",details:t})}return n}async findCmp(e){const t=this.config.logs;this.updateState({findCmpAttempts:this.state.findCmpAttempts+1});const o=[];for(const e of this.rules)try{if(!e.checkRunContext())continue;await e.detectCmp()&&(t.lifecycle&&console.log(`Found CMP: ${e.name} ${window.location.href}`),this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:e.name}),o.push(e))}catch(o){t.errors&&console.warn(`error detecting ${e.name}`,o)}return 0===o.length&&e>0?(await this.domActions.wait(500),this.findCmp(e-1)):o}async detectPopup(e){if(await this.waitForPopup(e).catch((t=>(this.config.logs.errors&&console.warn(`error waiting for a popup for ${e.name}`,t),!1))))return this.updateState({detectedPopups:this.state.detectedPopups.concat([e.name])}),this.sendContentMessage({type:"popupFound",cmp:e.name,url:location.href}),e;throw new Error("Popup is not shown")}async detectPopups(e,t){const o=e.map((e=>this.detectPopup(e)));await Promise.any(o).then((e=>{t(e)})).catch((()=>null));const i=await Promise.allSettled(o),n=[];for(const e of i)"fulfilled"===e.status&&n.push(e.value);return n}async handlePopup(e){return this.updateState({lifecycle:"openPopupDetected"}),this.config.enablePrehide&&!this.state.prehideOn&&this.prehideElements(),this.state.cosmeticFiltersOn&&this.undoCosmetics(),this.foundCmp=e,"optOut"===this.config.autoAction?await this.doOptOut():"optIn"===this.config.autoAction?await this.doOptIn():(this.config.logs.lifecycle&&console.log("waiting for opt-out signal...",location.href),!0)}async doOptOut(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptOut"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt out on ${window.location.href}`),t=await this.foundCmp.optOut(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt out result ${t}`)):(e.errors&&console.log("no CMP to opt out"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optOutResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:this.foundCmp&&this.foundCmp.hasSelfTest,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optOutSucceeded":"optOutFailed"}),t}async doOptIn(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptIn"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt in on ${window.location.href}`),t=await this.foundCmp.optIn(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt in result ${t}`)):(e.errors&&console.log("no CMP to opt in"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optInResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:!1,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optInSucceeded":"optInFailed"}),t}async doSelfTest(){const e=this.config.logs;let t;return this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: self-test on ${window.location.href}`),t=await this.foundCmp.test()):(e.errors&&console.log("no CMP to self test"),t=!1),this.sendContentMessage({type:"selfTestResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,url:location.href}),this.updateState({selfTest:t}),t}async waitForPopup(e,t=5,o=500){const i=this.config.logs;i.lifecycle&&console.log("checking if popup is open...",e.name);const n=await e.detectPopup().catch((t=>(i.errors&&console.warn(`error detecting popup for ${e.name}`,t),!1)));return!n&&t>0?(await this.domActions.wait(o),this.waitForPopup(e,t-1,o)):(i.lifecycle&&console.log(e.name,"popup is "+(n?"open":"not open")),n)}prehideElements(){const e=this.config.logs,t=this.rules.filter((e=>e.prehideSelectors&&e.checkRunContext())).reduce(((e,t)=>[...e,...t.prehideSelectors]),["#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"]);return this.updateState({prehideOn:!0}),setTimeout((()=>{this.config.enablePrehide&&this.state.prehideOn&&!["runningOptOut","runningOptIn"].includes(this.state.lifecycle)&&(e.lifecycle&&console.log("Process is taking too long, unhiding elements"),this.undoPrehide())}),this.config.prehideTimeout||2e3),this.domActions.prehide(t.join(","))}undoPrehide(){return this.updateState({prehideOn:!1}),this.domActions.undoPrehide()}async applyCosmeticFilters(e){if(!this.filtersEngine)return!1;const t=this.config?.logs;e||(e=mn(this.filtersEngine)),setTimeout((()=>{if(this.state.cosmeticFiltersOn&&!this.state.filterListReported){this.domActions.elementVisible(An(e),"any")?(t?.lifecycle&&console.log("Prehide cosmetic filters matched",location.href),this.reportFilterlist()):t?.lifecycle&&console.log("Prehide cosmetic filters didn't match",location.href)}}),1e3),this.updateState({cosmeticFiltersOn:!0});try{this.cosmeticStyleSheet=await this.domActions.createOrUpdateStyleSheet(e,this.cosmeticStyleSheet),t?.lifecycle&&console.log("[cosmetics]",this.cosmeticStyleSheet,location.href),document.adoptedStyleSheets.push(this.cosmeticStyleSheet)}catch(e){return this.config.logs&&console.error("Error applying cosmetic filters",e),!1}return!0}undoCosmetics(){this.updateState({cosmeticFiltersOn:!1}),this.config.logs.lifecycle&&console.log("[undocosmetics]",this.cosmeticStyleSheet,location.href),this.domActions.removeStyleSheet(this.cosmeticStyleSheet)}reportFilterlist(){this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:"filterList"}),this.sendContentMessage({type:"popupFound",cmp:"filterList",url:location.href}),this.updateState({filterListReported:!0})}filterListFallback(){if(!this.filtersEngine)return this.updateState({lifecycle:"nothingDetected"}),!1;const e=mn(this.filtersEngine),t=this.domActions.elementVisible(An(e),"any"),o=this.config?.logs;return t?(this.applyCosmeticFilters(e),o?.lifecycle&&console.log("Keeping cosmetic filters",location.href),this.updateState({lifecycle:"cosmeticFiltersDetected"}),this.state.filterListReported||this.reportFilterlist(),this.sendContentMessage({type:"optOutResult",cmp:"filterList",result:!0,scheduleSelfTest:!1,url:location.href}),this.updateState({lifecycle:"done"}),this.sendContentMessage({type:"autoconsentDone",cmp:"filterList",isCosmetic:!0,url:location.href}),!0):(o?.lifecycle&&console.log("Cosmetic filters didn't work, removing them",location.href),this.undoCosmetics(),this.updateState({lifecycle:"nothingDetected"}),!1)}updateState(e){Object.assign(this.state,e),this.sendContentMessage({type:"report",instanceId:this.id,url:window.location.href,mainFrame:window.top===window.self,state:this.state})}async receiveMessageCallback(e){const t=this.config?.logs;switch(t?.messages&&console.log("received from background",e,window.location.href),e.type){case"initResp":this.initialize(e.config,e.rules);break;case"optIn":await this.doOptIn();break;case"optOut":await this.doOptOut();break;case"selfTest":await this.doSelfTest();break;case"evalResp":!function(e,t){const o=a.pending.get(e);o?(a.pending.delete(e),o.timer&&window.clearTimeout(o.timer),o.resolve(t)):console.warn("no eval #",e)}(e.id,e.result)}}}((e=>{window.webkit.messageHandlers[e.type]&&window.webkit.messageHandlers[e.type].postMessage(e).then((e=>{wn.receiveMessageCallback(e)}))}),null,yn);window.autoconsentMessageCallback=e=>{wn.receiveMessageCallback(e)}}(); + */const ve=new class{constructor(e,t=null,o=null){if(this.id=a(),this.rules=[],this.foundCmp=null,this.state={cosmeticFiltersOn:!1,filterListReported:!1,lifecycle:"loading",prehideOn:!1,findCmpAttempts:0,detectedCmps:[],detectedPopups:[],heuristicPatterns:[],heuristicSnippets:[],selfTest:null},r.sendContentMessage=e,this.sendContentMessage=e,this.rules=[],this.updateState({lifecycle:"loading"}),this.addDynamicRules(),t)this.initialize(t,o);else{o&&this.parseDeclarativeRules(o);e({type:"init",url:window.location.href}),this.updateState({lifecycle:"waitingForInitResponse"})}this.domActions=new C(this)}initialize(e,t){const o=g(e);if(o.logs.lifecycle&&console.log("autoconsent init",window.location.href),this.config=o,o.enabled){if(t&&this.parseDeclarativeRules(t),e.enableFilterList){try{0}catch(e){console.error("Error parsing filter list",e)}"loading"===document.readyState?window.addEventListener("DOMContentLoaded",(()=>{this.applyCosmeticFilters()})):this.applyCosmeticFilters()}if(this.rules=function(e,t){return e.filter((e=>(!t.disabledCmps||!t.disabledCmps.includes(e.name))&&(t.enableCosmeticRules||!e.isCosmetic)))}(this.rules,o),e.enablePrehide)if(document.documentElement)this.prehideElements();else{const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.prehideElements()};window.addEventListener("DOMContentLoaded",e)}if("loading"===document.readyState){const e=()=>{window.removeEventListener("DOMContentLoaded",e),this.start()};window.addEventListener("DOMContentLoaded",e)}else this.start();this.updateState({lifecycle:"initialized"})}else o.logs.lifecycle&&console.log("autoconsent is disabled")}addDynamicRules(){w.forEach((e=>{this.rules.push(new e(this))}))}parseDeclarativeRules(e){e.consentomatic&&Object.keys(e.consentomatic).forEach((t=>{this.addConsentomaticCMP(t,e.consentomatic[t])})),e.autoconsent&&e.autoconsent.forEach((e=>{this.addDeclarativeCMP(e)}))}addDeclarativeCMP(e){this.rules.push(new u(e,this))}addConsentomaticCMP(e,t){this.rules.push(new m(`com_${e}`,t))}start(){!function(e,t=500){globalThis.requestIdleCallback?requestIdleCallback(e,{timeout:t}):setTimeout(e,0)}((()=>this._start()))}async _start(){const e=this.config.logs;e.lifecycle&&console.log(`Detecting CMPs on ${window.location.href}`),this.updateState({lifecycle:"started"});const t=await this.findCmp(this.config.detectRetries);if(this.updateState({detectedCmps:t.map((e=>e.name))}),0===t.length)return e.lifecycle&&console.log("no CMP found",location.href),this.config.enablePrehide&&this.undoPrehide(),this.filterListFallback();this.updateState({lifecycle:"cmpDetected"});const o=[],i=[];for(const e of t)e.isCosmetic?i.push(e):o.push(e);let c=!1,n=await this.detectPopups(o,(async e=>{c=await this.handlePopup(e)}));if(0===n.length&&(n=await this.detectPopups(i,(async e=>{c=await this.handlePopup(e)}))),0===n.length)return e.lifecycle&&console.log("no popup found"),this.config.enablePrehide&&this.undoPrehide(),!1;if(n.length>1){const t={msg:"Found multiple CMPs, check the detection rules.",cmps:n.map((e=>e.name))};e.errors&&console.warn(t.msg,t.cmps),this.sendContentMessage({type:"autoconsentError",details:t})}return c}async findCmp(e){const t=this.config.logs;this.updateState({findCmpAttempts:this.state.findCmpAttempts+1});const o=[];for(const e of this.rules)try{if(!e.checkRunContext())continue;await e.detectCmp()&&(t.lifecycle&&console.log(`Found CMP: ${e.name} ${window.location.href}`),this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:e.name}),o.push(e))}catch(o){t.errors&&console.warn(`error detecting ${e.name}`,o)}return this.detectHeuristics(),0===o.length&&e>0?(await this.domActions.wait(500),this.findCmp(e-1)):o}detectHeuristics(){if(this.config.enableHeuristicDetection){const{patterns:e,snippets:t}=function(){const e=document.documentElement.innerText,t=[],o=[];for(const i of ge){const c=e.match(i);c&&(t.push(i.toString()),o.push(...c.map((e=>e.substring(0,200)))))}return{patterns:t,snippets:o}}();e.length>0&&(e.length!==this.state.heuristicPatterns.length||this.state.heuristicPatterns.some(((t,o)=>t!==e[o])))&&(this.config.logs.lifecycle&&console.log("Heuristic patterns found",e,t),this.updateState({heuristicPatterns:e,heuristicSnippets:t}))}}async detectPopup(e){if(await this.waitForPopup(e).catch((t=>(this.config.logs.errors&&console.warn(`error waiting for a popup for ${e.name}`,t),!1))))return this.updateState({detectedPopups:this.state.detectedPopups.concat([e.name])}),this.sendContentMessage({type:"popupFound",cmp:e.name,url:location.href}),e;throw new Error("Popup is not shown")}async detectPopups(e,t){const o=e.map((e=>this.detectPopup(e)));await Promise.any(o).then((e=>{this.detectHeuristics(),t(e)})).catch((()=>null));const i=await Promise.allSettled(o),c=[];for(const e of i)"fulfilled"===e.status&&c.push(e.value);return c}async handlePopup(e){return this.updateState({lifecycle:"openPopupDetected"}),this.config.enablePrehide&&!this.state.prehideOn&&this.prehideElements(),this.state.cosmeticFiltersOn&&this.undoCosmetics(),this.foundCmp=e,"optOut"===this.config.autoAction?await this.doOptOut():"optIn"===this.config.autoAction?await this.doOptIn():(this.config.logs.lifecycle&&console.log("waiting for opt-out signal...",location.href),!0)}async doOptOut(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptOut"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt out on ${window.location.href}`),t=await this.foundCmp.optOut(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt out result ${t}`)):(e.errors&&console.log("no CMP to opt out"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optOutResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:this.foundCmp&&this.foundCmp.hasSelfTest,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optOutSucceeded":"optOutFailed"}),t}async doOptIn(){const e=this.config.logs;let t;return this.updateState({lifecycle:"runningOptIn"}),this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: opt in on ${window.location.href}`),t=await this.foundCmp.optIn(),e.lifecycle&&console.log(`${this.foundCmp.name}: opt in result ${t}`)):(e.errors&&console.log("no CMP to opt in"),t=!1),this.config.enablePrehide&&this.undoPrehide(),this.sendContentMessage({type:"optInResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,scheduleSelfTest:!1,url:location.href}),t&&!this.foundCmp.isIntermediate?(this.sendContentMessage({type:"autoconsentDone",cmp:this.foundCmp.name,isCosmetic:this.foundCmp.isCosmetic,url:location.href}),this.updateState({lifecycle:"done"})):this.updateState({lifecycle:t?"optInSucceeded":"optInFailed"}),t}async doSelfTest(){const e=this.config.logs;let t;return this.foundCmp?(e.lifecycle&&console.log(`CMP ${this.foundCmp.name}: self-test on ${window.location.href}`),t=await this.foundCmp.test()):(e.errors&&console.log("no CMP to self test"),t=!1),this.sendContentMessage({type:"selfTestResult",cmp:this.foundCmp?this.foundCmp.name:"none",result:t,url:location.href}),this.updateState({selfTest:t}),t}async waitForPopup(e,t=5,o=500){const i=this.config.logs;i.lifecycle&&console.log("checking if popup is open...",e.name);const c=await e.detectPopup().catch((t=>(i.errors&&console.warn(`error detecting popup for ${e.name}`,t),!1)));return!c&&t>0?(await this.domActions.wait(o),this.waitForPopup(e,t-1,o)):(i.lifecycle&&console.log(e.name,"popup is "+(c?"open":"not open")),c)}prehideElements(){const e=this.config.logs,t=this.rules.filter((e=>e.prehideSelectors&&e.checkRunContext())).reduce(((e,t)=>[...e,...t.prehideSelectors]),["#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"]);return this.updateState({prehideOn:!0}),setTimeout((()=>{this.config.enablePrehide&&this.state.prehideOn&&!["runningOptOut","runningOptIn"].includes(this.state.lifecycle)&&(e.lifecycle&&console.log("Process is taking too long, unhiding elements"),this.undoPrehide())}),this.config.prehideTimeout||2e3),this.domActions.prehide(t.join(","))}undoPrehide(){return this.updateState({prehideOn:!1}),this.domActions.undoPrehide()}async applyCosmeticFilters(e){if(!this.filtersEngine)return!1;const t=this.config?.logs;setTimeout((()=>{if(this.state.cosmeticFiltersOn&&!this.state.filterListReported){const o=this.domActions.elementVisible(function(e){if(e)return e.replace(/\s*{[^\\}]*}\s*/g,",").replace(/,$/,"");return""}(e),"any");o?(t?.lifecycle&&console.log("Prehide cosmetic filters matched",location.href),this.reportFilterlist()):t?.lifecycle&&console.log("Prehide cosmetic filters didn't match",location.href)}}),2e3),this.updateState({cosmeticFiltersOn:!0});try{this.cosmeticStyleSheet=await this.domActions.createOrUpdateStyleSheet(e,this.cosmeticStyleSheet),t?.lifecycle&&console.log("[cosmetics]",this.cosmeticStyleSheet,location.href),document.adoptedStyleSheets.push(this.cosmeticStyleSheet)}catch(e){return this.config.logs&&console.error("Error applying cosmetic filters",e),!1}return!0}undoCosmetics(){this.updateState({cosmeticFiltersOn:!1}),this.config.logs.lifecycle&&console.log("[undocosmetics]",this.cosmeticStyleSheet,location.href),this.domActions.removeStyleSheet(this.cosmeticStyleSheet)}reportFilterlist(){this.sendContentMessage({type:"cmpDetected",url:location.href,cmp:"filterList"}),this.sendContentMessage({type:"popupFound",cmp:"filterList",url:location.href}),this.updateState({filterListReported:!0})}filterListFallback(){return this.updateState({lifecycle:"nothingDetected"}),!1}updateState(e){Object.assign(this.state,e),this.sendContentMessage({type:"report",instanceId:this.id,url:window.location.href,mainFrame:window.top===window.self,state:this.state})}async receiveMessageCallback(e){const t=this.config?.logs;switch(t?.messages&&console.log("received from background",e,window.location.href),e.type){case"initResp":this.initialize(e.config,e.rules);break;case"optIn":await this.doOptIn();break;case"optOut":await this.doOptOut();break;case"selfTest":await this.doSelfTest();break;case"evalResp":!function(e,t){const o=r.pending.get(e);o?(r.pending.delete(e),o.timer&&window.clearTimeout(o.timer),o.resolve(t)):console.warn("no eval #",e)}(e.id,e.result)}}}((e=>{window.webkit.messageHandlers[e.type]&&window.webkit.messageHandlers[e.type].postMessage(e).then((e=>{ve.receiveMessageCallback(e)}))}),null,Ce);window.autoconsentMessageCallback=e=>{ve.receiveMessageCallback(e)}}(); diff --git a/package-lock.json b/package-lock.json index 4d504ca979..35881dad6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "ios", "version": "1.0.0", "dependencies": { - "@duckduckgo/autoconsent": "^12.2.0" + "@duckduckgo/autoconsent": "^12.3.0" }, "devDependencies": { "@rollup/plugin-json": "^4.1.0", @@ -121,9 +121,9 @@ } }, "node_modules/@duckduckgo/autoconsent": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@duckduckgo/autoconsent/-/autoconsent-12.2.0.tgz", - "integrity": "sha512-KhvkdhqTHqVxMxxmadWcW9E1WoGV06YIwVC2m8RIeJYk6AD2wIyO5MjP24moRG5OIvWohEhge8TU0OHeY0P6Tw==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@duckduckgo/autoconsent/-/autoconsent-12.3.0.tgz", + "integrity": "sha512-mOW11Ve9DRKDkjFtAjXAP3Jd5E22YqI+4+6NTPNnOud2/02QyhM8l1vK//hTR6cmXXWZiFknpuv6qckuwMKivw==", "license": "MPL-2.0", "dependencies": { "@ghostery/adblocker": "^2.0.4", diff --git a/package.json b/package.json index 82dac387ec..fa1f5cef7e 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,6 @@ "rollup-plugin-terser": "^7.0.2" }, "dependencies": { - "@duckduckgo/autoconsent": "^12.2.0" + "@duckduckgo/autoconsent": "^12.3.0" } } From c0657644d7cb49ece46f9c6944f1231830d7ab94 Mon Sep 17 00:00:00 2001 From: amddg44 Date: Mon, 16 Dec 2024 16:00:47 +0100 Subject: [PATCH 48/66] Release 7.150.0-0 (#3729) --- Configuration/Version.xcconfig | 2 +- .../AppPrivacyConfigurationDataProvider.swift | 4 +- Core/ios-config.json | 280 ++++++++---------- DuckDuckGo.xcodeproj/project.pbxproj | 64 ++-- DuckDuckGo/Settings.bundle/Root.plist | 2 +- 5 files changed, 162 insertions(+), 190 deletions(-) diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig index 9ef4c72f39..70fa812aec 100644 --- a/Configuration/Version.xcconfig +++ b/Configuration/Version.xcconfig @@ -1 +1 @@ -MARKETING_VERSION = 7.149.0 +MARKETING_VERSION = 7.150.0 diff --git a/Core/AppPrivacyConfigurationDataProvider.swift b/Core/AppPrivacyConfigurationDataProvider.swift index 538a5c786b..ce23ec7e8a 100644 --- a/Core/AppPrivacyConfigurationDataProvider.swift +++ b/Core/AppPrivacyConfigurationDataProvider.swift @@ -23,8 +23,8 @@ import BrowserServicesKit final public class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider { public struct Constants { - public static let embeddedDataETag = "\"5e5dc1c97834210a4803eb2683f21f95\"" - public static let embeddedDataSHA = "758a4d35540518b71b74ef7769a1652d124b75c12dd244fe7612b829c824d510" + public static let embeddedDataETag = "\"03c27339b8dd9a474cc2bafb84ba8012\"" + public static let embeddedDataSHA = "783c4cccf30cc0b4fe3caea212c9e1dca3b276b859d07360fa08b586f006438f" } public var embeddedDataEtag: String { diff --git a/Core/ios-config.json b/Core/ios-config.json index 2263fb2097..4e06aee6ff 100644 --- a/Core/ios-config.json +++ b/Core/ios-config.json @@ -1,15 +1,15 @@ { "readme": "https://github.com/duckduckgo/privacy-configuration", - "version": 1733826965137, + "version": 1734119755860, "features": { "adAttributionReporting": { - "state": "disabled", + "state": "enabled", "exceptions": [], - "minSupportedVersion": "7.145.0", + "minSupportedVersion": "7.146.0", "settings": { "includeToken": false }, - "hash": "1da4782852f0317459b4465d801eda1f" + "hash": "4c739e2de28deaaf9408f254041bf113" }, "adClickAttribution": { "readme": "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections/#3rd-party-tracker-loading-protection", @@ -70,9 +70,15 @@ "hash": "b813ade8472a097ffbd43a3331116fe1" }, "additionalCampaignPixelParams": { - "state": "disabled", + "state": "enabled", "exceptions": [], - "hash": "c292bb627849854515cebbded288ef5a" + "settings": { + "origins": [ + "funnel_pro_iosrmf_announcement" + ] + }, + "minSupportedVersion": "7.131.0", + "hash": "7616abe480cf4aecb67ffbaa71d17217" }, "aiChat": { "state": "disabled", @@ -116,9 +122,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -147,7 +150,7 @@ ] }, "state": "enabled", - "hash": "2e91c1024751b208d974721cd5c4a020" + "hash": "fa5f86bac5946c528cd6bc7449a2718a" }, "androidBrowserConfig": { "exceptions": [], @@ -159,6 +162,11 @@ "state": "disabled", "hash": "728493ef7a1488e4781656d3f9db84aa" }, + "apiManipulation": { + "state": "disabled", + "exceptions": [], + "hash": "c292bb627849854515cebbded288ef5a" + }, "auraExperiment": { "exceptions": [], "settings": { @@ -807,6 +815,12 @@ { "domain": "google.sk" }, + { + "domain": "serif.com" + }, + { + "domain": "wetransfer.com" + }, { "domain": "marvel.com" }, @@ -819,9 +833,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -852,7 +863,7 @@ } } }, - "hash": "32cbf1af6d2dd1ef9c61bb3cc34852dd" + "hash": "7a26ec675103d4e0dd106a46950156d0" }, "autofillBreakageReporter": { "state": "enabled", @@ -865,15 +876,10 @@ "autofillSurveys": { "state": "enabled", "settings": { - "surveys": [ - { - "id": "2024-12-04", - "url": "https://selfserve.decipherinc.com/survey/selfserve/32ab/241201" - } - ] + "surveys": [] }, "exceptions": [], - "hash": "2f7e9f55c5dbcb35ee01be966b079512" + "hash": "1d554e00b6a8adc2a7514accf9a92fdb" }, "autofill": { "exceptions": [ @@ -993,14 +999,11 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], - "hash": "2b0962b6ea0b84b7450358766ccf667d" + "hash": "37e0cf88badfc8b01b6394f0884502f6" }, "brokenSitePrompt": { "state": "enabled", @@ -1702,9 +1705,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -1724,7 +1724,7 @@ } }, "state": "disabled", - "hash": "9b33d212830c6b5b67317c0621b15006" + "hash": "cb1f114a9e0314393b2a0f789cba163f" }, "clickToPlay": { "exceptions": [ @@ -1740,9 +1740,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -1757,7 +1754,7 @@ } }, "state": "disabled", - "hash": "1533ba1f2ef66001f0e4d6faf0d48be7" + "hash": "894fb86c1f058aee9db47cfcdf3637de" }, "clientBrandHint": { "exceptions": [], @@ -1800,14 +1797,11 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], - "hash": "ee5eabf360024d267d4668e73c053a48" + "hash": "96b2f778bab196aa424e9c859ddea778" }, "contextualOnboarding": { "exceptions": [], @@ -1867,6 +1861,9 @@ { "domain": "instructure.com" }, + { + "domain": "duckduckgo.com" + }, { "domain": "marvel.com" }, @@ -1879,15 +1876,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "91ceb18e840b0b322c2fd818e6b5453a" + "hash": "d04093e35c2ea53300a62df3a8a2abea" }, "customUserAgent": { "settings": { @@ -2078,9 +2072,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -3008,6 +2999,15 @@ } ] }, + { + "domain": "chase.com", + "rules": [ + { + "selector": ".browserupdate", + "type": "hide" + } + ] + }, { "domain": "cleartax.in", "rules": [ @@ -3390,6 +3390,15 @@ } ] }, + { + "domain": "facebook.com", + "rules": [ + { + "selector": ".xnw9j1v:has(div > a[href='https://www.facebook.com/help/597429858389632/'])", + "type": "hide" + } + ] + }, { "domain": "fandom.com", "rules": [ @@ -3713,6 +3722,26 @@ "selector": "div:has(> iframe[src*='prid=19031780'])", "type": "hide" }, + { + "selector": "div:has(> iframe[src*='prid=19044580'])", + "type": "hide" + }, + { + "selector": "div:has(> iframe[src*='prid=19044578'])", + "type": "hide" + }, + { + "selector": "div:has(> iframe[src*='prid=19044538'])", + "type": "hide" + }, + { + "selector": "div:has(> iframe[src*='prid=19044687'])", + "type": "hide" + }, + { + "selector": "div:has(> iframe[src*='prid=19044636'])", + "type": "hide" + }, { "selector": "[aria-labelledby='promo-header']", "type": "hide" @@ -5462,7 +5491,7 @@ ] }, "state": "enabled", - "hash": "a3957788141533420149b5c96c8de136" + "hash": "e0632ffb8c02bf14874c33ccd66ee99a" }, "exceptionHandler": { "exceptions": [ @@ -5478,15 +5507,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "01c90bccc9b20770953ff3f786fa4dac" + "hash": "be6751fe0307a7e1b9476f4d8b8d0aaf" }, "extendedOnboarding": { "exceptions": [], @@ -5511,14 +5537,11 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], - "hash": "0cc652d37e184686c92eb64e6ab9d3fa" + "hash": "7f042650922da2636492e77ed1101bce" }, "fingerprintingBattery": { "exceptions": [ @@ -5537,15 +5560,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "enabled", - "hash": "3821c0fed8912dd05b1618e3a0594fcf" + "hash": "fcc2138fa97c35ded544b39708fda919" }, "fingerprintingCanvas": { "settings": { @@ -5648,15 +5668,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "1165c91b6e289988a60b72a97d3a5a3b" + "hash": "49a3d497835bf5715aaaa73f87dd974f" }, "fingerprintingHardware": { "settings": { @@ -5726,9 +5743,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "target.com" }, @@ -5737,7 +5751,7 @@ } ], "state": "enabled", - "hash": "b1de304ce2c53c1fc1ef395c98296f8f" + "hash": "b1f406c6ff87e27244d26289c0e383f9" }, "fingerprintingScreenSize": { "settings": { @@ -5789,15 +5803,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "enabled", - "hash": "7e7b65104a08a935f2263eb34b84d3cb" + "hash": "046340bb9287a20efed6189525ec5fed" }, "fingerprintingTemporaryStorage": { "exceptions": [ @@ -5822,15 +5833,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "enabled", - "hash": "934f0960313eb7801841ee99cd3dc802" + "hash": "14b7fe3d276b52109c59f0c71aee4f71" }, "googleRejected": { "exceptions": [ @@ -5846,15 +5854,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "01c90bccc9b20770953ff3f786fa4dac" + "hash": "be6751fe0307a7e1b9476f4d8b8d0aaf" }, "gpc": { "state": "enabled", @@ -5889,6 +5894,9 @@ { "domain": "norton.com" }, + { + "domain": "madewell.com" + }, { "domain": "marvel.com" }, @@ -5901,9 +5909,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -5917,7 +5922,7 @@ "privacy-test-pages.site" ] }, - "hash": "92dbff4d73bdec464f5767165933b0bf" + "hash": "cc0c0adfc06919bb973a7636b59b2430" }, "harmfulApis": { "settings": { @@ -6031,15 +6036,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "603b489064ac5a2379d18a946644e499" + "hash": "fb598c4167ff166d85dd49c701cc5579" }, "history": { "state": "enabled", @@ -6088,14 +6090,11 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], - "hash": "a0a328c1f5189fabc27bd1659146c3a2" + "hash": "b47d255c6f836ecb7ae0b3e61cc2c025" }, "incontextSignup": { "exceptions": [], @@ -6165,9 +6164,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -6180,7 +6176,7 @@ ] }, "state": "enabled", - "hash": "ac148f97532e086f27bedc5b7f6fc4a2" + "hash": "d14f6e3a9aa4139ee1d517016b59691e" }, "networkProtection": { "state": "enabled", @@ -6228,15 +6224,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "e3342b0dc61ba52c56a90f553b7bfc43" + "hash": "82088db85ca7f64418fbfd57db25ade1" }, "performanceMetrics": { "state": "enabled", @@ -6253,14 +6246,11 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], - "hash": "04fb7d6e0337563a26060b1a32d2332e" + "hash": "6792064606a5a72c5cd44addb4d40bda" }, "phishingDetection": { "state": "disabled", @@ -6341,7 +6331,7 @@ "minSupportedVersion": "7.136.0" }, "setAccessTokenCookieForSubscriptionDomains": { - "state": "disabled", + "state": "enabled", "rollout": { "steps": [ { @@ -6354,13 +6344,29 @@ "percent": 100 } ] - } + }, + "minSupportedVersion": "7.148.0" }, - "freeTrials": { - "state": "internal" + "privacyProFreeTrialJan25": { + "state": "internal", + "targets": [ + { + "localeCountry": "US" + } + ], + "cohorts": [ + { + "name": "control", + "weight": 1 + }, + { + "name": "treatment", + "weight": 1 + } + ] } }, - "hash": "c002a2f7b1299197657574c7328e8f88" + "hash": "c30e064d2aa8e0c9dd00c9ed051b98d3" }, "privacyProtectionsPopup": { "state": "disabled", @@ -6399,15 +6405,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "359af23cc499c17b84ef08a118fedc4a" + "hash": "138c3b2409f6b3bf967b804ab9bf2ce2" }, "remoteMessaging": { "state": "enabled", @@ -6429,9 +6432,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } @@ -6439,7 +6439,7 @@ "settings": { "windowInMs": 0 }, - "hash": "54b249ffdfd7710373849720c7bf1ed8" + "hash": "baf19d9e0f506ed09f46c95b1849adee" }, "runtimeChecks": { "state": "disabled", @@ -6456,15 +6456,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "settings": {}, - "hash": "c2c2d48b0fc1b03db53065ca5da92675" + "hash": "dfede9f06b9e322e198736703d013d15" }, "sendFullPackageInstallSource": { "state": "enabled", @@ -6486,15 +6483,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "01c90bccc9b20770953ff3f786fa4dac" + "hash": "be6751fe0307a7e1b9476f4d8b8d0aaf" }, "showOnAppLaunch": { "exceptions": [ @@ -6510,15 +6504,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "01c90bccc9b20770953ff3f786fa4dac" + "hash": "be6751fe0307a7e1b9476f4d8b8d0aaf" }, "sslCertificates": { "state": "enabled", @@ -6544,15 +6535,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "01c90bccc9b20770953ff3f786fa4dac" + "hash": "be6751fe0307a7e1b9476f4d8b8d0aaf" }, "syncPromotion": { "state": "enabled", @@ -7457,6 +7445,7 @@ "domains": [ "ah.nl", "applesfera.com", + "asuracomic.net", "goplay.be", "itsthevibe.com", "nytimes.com", @@ -9145,6 +9134,7 @@ { "rule": "a.pub.network/core/prebid-universal-creative.js", "domains": [ + "boingboing.net", "signupgenius.com", "smithsonianmag.com", "stockcharts.com", @@ -10024,14 +10014,11 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], - "hash": "cc188a741d0bbe34cd7de16f70a69df7" + "hash": "fe0934622a089920211c50aaf246954c" }, "trackingCookies1p": { "settings": { @@ -10053,15 +10040,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "2426b21363085484652b231ca66897a5" + "hash": "763f56424b0827b5731927a043219912" }, "trackingCookies3p": { "settings": { @@ -10080,15 +10064,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "e3342b0dc61ba52c56a90f553b7bfc43" + "hash": "82088db85ca7f64418fbfd57db25ade1" }, "trackingParameters": { "exceptions": [ @@ -10119,9 +10100,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "theverge.com" }, @@ -10159,7 +10137,7 @@ ] }, "state": "enabled", - "hash": "51753ddb14b1c7a22eb20f74f46c092d" + "hash": "3792a4970c07fe00da08f77e7dcf01ed" }, "userAgentRotation": { "settings": { @@ -10178,15 +10156,12 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "instructure.com" } ], "state": "disabled", - "hash": "fbc6687658b62b108ed7769a660dd8e0" + "hash": "9225b8785d6973db37abde99d81d219c" }, "voiceSearch": { "exceptions": [], @@ -10212,9 +10187,6 @@ { "domain": "flexmls.com" }, - { - "domain": "asuracomic.net" - }, { "domain": "wsj.com" }, @@ -10292,7 +10264,7 @@ } ] }, - "hash": "39bd8f30c68f608ae78ffde4e13bef93" + "hash": "2853748f3ebb813d59f4db4a7bb13c83" }, "webViewBlobDownload": { "exceptions": [], diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index d5ee60097c..4ff434240a 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9670,7 +9670,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9707,7 +9707,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9797,7 +9797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9824,7 +9824,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9972,7 +9972,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9998,7 +9998,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10065,7 +10065,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10099,7 +10099,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10132,7 +10132,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10162,7 +10162,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10493,7 +10493,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10531,7 +10531,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10568,7 +10568,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10607,7 +10607,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10705,7 +10705,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10736,7 +10736,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10764,7 +10764,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10797,7 +10797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10827,7 +10827,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10860,11 +10860,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11096,7 +11096,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11124,7 +11124,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11156,7 +11156,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11193,7 +11193,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11228,7 +11228,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11263,11 +11263,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11439,11 +11439,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11472,10 +11472,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist index 740cfbe9a5..8ded057441 100644 --- a/DuckDuckGo/Settings.bundle/Root.plist +++ b/DuckDuckGo/Settings.bundle/Root.plist @@ -6,7 +6,7 @@ DefaultValue - 7.149.0 + 7.150.0 Key version Title From 864144a33b5c9680b5479160514993caea41ea0c Mon Sep 17 00:00:00 2001 From: Fernando Bunn Date: Tue, 17 Dec 2024 10:29:25 -0300 Subject: [PATCH 49/66] Remove duck.ai 10min timer (#3731) Task/Issue URL: https://app.asana.com/0/1201011656765697/1208991512395317/f **Description**: Remove AI Chat 10min session timer --- Core/PixelEvent.swift | 4 -- DuckDuckGo.xcodeproj/project.pbxproj | 4 -- DuckDuckGo/AIChat/AIChatPixelHandler.swift | 32 ----------- DuckDuckGo/MainViewController.swift | 3 +- .../Sources/AIChat/AIChatViewModel.swift | 38 +------------ .../Public API/AIChatPixelHandling.swift | 27 --------- .../Public API/AIChatViewController.swift | 35 ++---------- .../Sources/AIChat/TimerPixelHandler.swift | 56 ------------------- 8 files changed, 7 insertions(+), 192 deletions(-) delete mode 100644 DuckDuckGo/AIChat/AIChatPixelHandler.swift delete mode 100644 LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift delete mode 100644 LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift diff --git a/Core/PixelEvent.swift b/Core/PixelEvent.swift index 8e6f1c3beb..18c6b0b761 100644 --- a/Core/PixelEvent.swift +++ b/Core/PixelEvent.swift @@ -939,8 +939,6 @@ extension Pixel { case appDidBecomeActiveTime(time: BucketAggregation) // MARK: AI Chat - case openAIChatBefore10min - case openAIChatAfter10min case aiChatNoRemoteSettingsFound(settings: String) case openAIChatFromAddressBar @@ -1882,8 +1880,6 @@ extension Pixel.Event { case .appDidBecomeActiveTime(let time): return "m_debug_app-did-become-active-time-\(time)" // MARK: AI Chat - case .openAIChatAfter10min: return "m_aichat_open_after_10_min" - case .openAIChatBefore10min: return "m_aichat_open_before_10_min" case .aiChatNoRemoteSettingsFound(let settings): return "m_aichat_no_remote_settings_found-\(settings.lowercased())" case .openAIChatFromAddressBar: return "m_aichat_addressbar_icon" diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 4ff434240a..94fd5525e5 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -128,7 +128,6 @@ 1EFDCBC127D2393C00916BC5 /* DownloadsDeleteHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EFDCBC027D2393C00916BC5 /* DownloadsDeleteHelper.swift */; }; 22CB1ED8203DDD2C00D2C724 /* AppDeepLinksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22CB1ED7203DDD2C00D2C724 /* AppDeepLinksTests.swift */; }; 2DC3FC65C6D9DA634426672D /* AutofillNoAuthAvailableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DC3FBD62FBAF21E87610FA8 /* AutofillNoAuthAvailableView.swift */; }; - 31043B162CFA5B8E0028A97F /* AIChatPixelHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */; }; 310742A62848CD780012660B /* BackForwardMenuHistoryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310742A52848CD780012660B /* BackForwardMenuHistoryItem.swift */; }; 310742AB2848E6FD0012660B /* BackForwardMenuHistoryItemURLSanitizerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310742A92848E5B70012660B /* BackForwardMenuHistoryItemURLSanitizerTests.swift */; }; 310C4B45281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310C4B44281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift */; }; @@ -1503,7 +1502,6 @@ 1EFDCBC027D2393C00916BC5 /* DownloadsDeleteHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadsDeleteHelper.swift; sourceTree = ""; }; 22CB1ED7203DDD2C00D2C724 /* AppDeepLinksTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDeepLinksTests.swift; sourceTree = ""; }; 2DC3FBD62FBAF21E87610FA8 /* AutofillNoAuthAvailableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutofillNoAuthAvailableView.swift; sourceTree = ""; }; - 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIChatPixelHandler.swift; sourceTree = ""; }; 310742A52848CD780012660B /* BackForwardMenuHistoryItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackForwardMenuHistoryItem.swift; sourceTree = ""; }; 310742A92848E5B70012660B /* BackForwardMenuHistoryItemURLSanitizerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackForwardMenuHistoryItemURLSanitizerTests.swift; sourceTree = ""; }; 310C4B44281B5A9A00BA79A9 /* AutofillLoginDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillLoginDetailsView.swift; sourceTree = ""; }; @@ -3682,7 +3680,6 @@ isa = PBXGroup; children = ( 311711902D00E53A0063AC3D /* OmnibarAccessoryHandling.swift */, - 31043B152CFA5B890028A97F /* AIChatPixelHandler.swift */, 316AA4592CF8E31F00A2ED28 /* AIChatSettings.swift */, ); path = AIChat; @@ -8108,7 +8105,6 @@ 9817C9C321EF594700884F65 /* AutoClear.swift in Sources */, 9FE05CEE2C36424E00D9046B /* OnboardingPixelReporter.swift in Sources */, 310C4B47281B60E300BA79A9 /* AutofillLoginDetailsViewModel.swift in Sources */, - 31043B162CFA5B8E0028A97F /* AIChatPixelHandler.swift in Sources */, 85EE7F572246685B000FE757 /* WebContainerViewController.swift in Sources */, CB48D3332B90CE9F00631D8B /* PageRefreshStore.swift in Sources */, 1EC458462948932500CB2B13 /* UIHostingControllerExtension.swift in Sources */, diff --git a/DuckDuckGo/AIChat/AIChatPixelHandler.swift b/DuckDuckGo/AIChat/AIChatPixelHandler.swift deleted file mode 100644 index b4e1ccd4b5..0000000000 --- a/DuckDuckGo/AIChat/AIChatPixelHandler.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// AIChatPixelHandler.swift -// DuckDuckGo -// -// Copyright © 2024 DuckDuckGo. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -import AIChat -import Core - -struct AIChatPixelHandler: AIChatPixelHandling { - func fire(pixel: AIChatPixel) { - switch pixel { - case .openAfter10min: - Pixel.fire(pixel: .openAIChatAfter10min) - case .openBefore10min: - Pixel.fire(pixel: .openAIChatBefore10min) - } - } -} diff --git a/DuckDuckGo/MainViewController.swift b/DuckDuckGo/MainViewController.swift index 42a9bc7ea8..35c07f3865 100644 --- a/DuckDuckGo/MainViewController.swift +++ b/DuckDuckGo/MainViewController.swift @@ -192,8 +192,7 @@ class MainViewController: UIViewController { let settings = AIChatSettings(privacyConfigurationManager: ContentBlocking.shared.privacyConfigurationManager, internalUserDecider: AppDependencyProvider.shared.internalUserDecider) let aiChatViewController = AIChatViewController(settings: settings, - webViewConfiguration: WKWebViewConfiguration.persistent(), - pixelHandler: AIChatPixelHandler()) + webViewConfiguration: WKWebViewConfiguration.persistent()) aiChatViewController.delegate = self return aiChatViewController }() diff --git a/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift b/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift index 36c326dd8a..8c936f45cb 100644 --- a/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift +++ b/LocalPackages/AIChat/Sources/AIChat/AIChatViewModel.swift @@ -28,53 +28,17 @@ protocol AIChatViewModeling { /// The configuration settings for the web view used in the AI Chat. /// This configuration can include preferences such as data storage var webViewConfiguration: WKWebViewConfiguration { get } - - /// A publisher that emits a signal after a 10-minute interval. - /// This is used to notify the controller that it should perform a reload or cleanup operation, - var cleanupPublisher: PassthroughSubject { get } - - /// Cancels the currently active cleanup timer. - func cancelTimer() - - /// Initiates the cleanup timer, which is set to trigger after a specified duration. - /// The purpose of this timer is to clear previous chat conversations - func startCleanupTimer() } - final class AIChatViewModel: AIChatViewModeling { private let settings: AIChatSettingsProvider - private var cleanupTimerCancellable: AnyCancellable? - let webViewConfiguration: WKWebViewConfiguration - let cleanupPublisher = PassthroughSubject() - - let cleanupTime: TimeInterval - init(webViewConfiguration: WKWebViewConfiguration, settings: AIChatSettingsProvider, cleanupTime: TimeInterval = 600) { - self.cleanupTime = cleanupTime + init(webViewConfiguration: WKWebViewConfiguration, settings: AIChatSettingsProvider) { self.webViewConfiguration = webViewConfiguration self.settings = settings } - func cancelTimer() { - Logger.aiChat.debug("Cancelling cleanup timer") - cleanupTimerCancellable?.cancel() - } - - func startCleanupTimer() { - cancelTimer() - - Logger.aiChat.debug("Starting cleanup timer") - - cleanupTimerCancellable = Just(()) - .delay(for: .seconds(cleanupTime), scheduler: RunLoop.main) - .sink { [weak self] in - Logger.aiChat.debug("Cleanup timer done") - self?.cleanupPublisher.send() - } - } - var aiChatURL: URL { settings.aiChatURL } diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift deleted file mode 100644 index f1981fd264..0000000000 --- a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatPixelHandling.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// AIChatPixelHandling.swift -// DuckDuckGo -// -// Copyright © 2024 DuckDuckGo. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -public enum AIChatPixel { - case openBefore10min - case openAfter10min -} - -public protocol AIChatPixelHandling { - func fire(pixel: AIChatPixel) -} diff --git a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift index 66d2d46fdb..31d394969c 100644 --- a/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift +++ b/LocalPackages/AIChat/Sources/AIChat/Public API/AIChatViewController.swift @@ -34,24 +34,19 @@ public final class AIChatViewController: UIViewController { public weak var delegate: AIChatViewControllerDelegate? private let chatModel: AIChatViewModeling private var webViewController: AIChatWebViewController? - private var cleanupCancellable: AnyCancellable? - private var didCleanup: Bool = false - private let timerPixelHandler: TimerPixelHandler /// Initializes a new instance of `AIChatViewController` with the specified remote settings and web view configuration. /// /// - Parameters: /// - remoteSettings: An object conforming to `AIChatSettingsProvider` that provides remote settings. /// - webViewConfiguration: A `WKWebViewConfiguration` object used to configure the web view. - /// - pixelHandler: A `AIChatPixelHandling` object used to send pixel events. - public convenience init(settings: AIChatSettingsProvider, webViewConfiguration: WKWebViewConfiguration, pixelHandler: AIChatPixelHandling) { + public convenience init(settings: AIChatSettingsProvider, webViewConfiguration: WKWebViewConfiguration) { let chatModel = AIChatViewModel(webViewConfiguration: webViewConfiguration, settings: settings) - self.init(chatModel: chatModel, pixelHandler: pixelHandler) + self.init(chatModel: chatModel) } - internal init(chatModel: AIChatViewModeling, pixelHandler: AIChatPixelHandling) { + internal init(chatModel: AIChatViewModeling) { self.chatModel = chatModel - self.timerPixelHandler = TimerPixelHandler(pixelHandler: pixelHandler) super.init(nibName: nil, bundle: nil) } @@ -67,7 +62,6 @@ extension AIChatViewController { public override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .black - subscribeToCleanupPublisher() } public override func viewWillAppear(_ animated: Bool) { @@ -75,22 +69,16 @@ extension AIChatViewController { addWebViewController() } - public override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - timerPixelHandler.sendOpenPixel() - chatModel.cancelTimer() - } - public override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) - chatModel.startCleanupTimer() + /// Clean up the previous conversation and prepare duck.ai for future presentation + webViewController?.reload() } public override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() if viewIfLoaded?.window == nil { - chatModel.cancelTimer() removeWebViewController() } } @@ -127,19 +115,6 @@ extension AIChatViewController { } } -// MARK: - Event handling -extension AIChatViewController { - - private func subscribeToCleanupPublisher() { - cleanupCancellable = chatModel.cleanupPublisher - .receive(on: DispatchQueue.main) - .sink { [weak self] in - self?.webViewController?.reload() - self?.timerPixelHandler.markCleanup() - } - } -} - extension AIChatViewController: AIChatWebViewControllerDelegate { func aiChatWebViewController(_ viewController: AIChatWebViewController, didRequestToLoad url: URL) { delegate?.aiChatViewController(self, didRequestToLoad: url) diff --git a/LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift b/LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift deleted file mode 100644 index 91f64f5cdd..0000000000 --- a/LocalPackages/AIChat/Sources/AIChat/TimerPixelHandler.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// TimerPixelHandler.swift -// DuckDuckGo -// -// Copyright © 2024 DuckDuckGo. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - - -final class TimerPixelHandler { - private let pixelHandler: AIChatPixelHandling - private var hasCleanedUp = false - private var isFirstPixelSent = true - - init(pixelHandler: any AIChatPixelHandling) { - self.pixelHandler = pixelHandler - } - - /// Marks that cleanup has been performed. - func markCleanup() { - hasCleanedUp = true - } - - /// Sends an "open" pixel based on the cleanup status. - /// - If this is the first time sending a pixel, it will not send any pixel. - /// - If cleanup has been called, it sends an `openAfter10min` pixel. - /// - Otherwise, it sends an `openBefore10min` pixel. - func sendOpenPixel() { - defer { - hasCleanedUp = false - } - - // Skip sending a pixel on the first call. - guard !isFirstPixelSent else { - isFirstPixelSent = false - return - } - - if hasCleanedUp { - pixelHandler.fire(pixel: .openAfter10min) - } else { - pixelHandler.fire(pixel: .openBefore10min) - } - } -} From c55b610e0055f05d896bc02c8f809072a1c29d92 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio <44158575+SabrinaTardio@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:25:04 +0100 Subject: [PATCH 50/66] point to BSK branch (#3732) Task/Issue URL: https://app.asana.com/0/1204186595873227/1208964427775425/f **Description**: Update BSK dependency --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 94fd5525e5..9017f26c33 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -11719,7 +11719,7 @@ repositoryURL = "https://github.com/DuckDuckGo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 221.2.0; + version = 221.3.0; }; }; 9F8FE9472BAE50E50071E372 /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 7e19b6e338..4eaad818db 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/DuckDuckGo/BrowserServicesKit", "state" : { - "revision" : "08c3dca42c5f943d45136823f264ba14bbcc0eb9", - "version" : "221.2.0" + "revision" : "b71ed70ce9b0ef3ce51d4f96da0193ab70493944", + "version" : "221.3.0" } }, { From 4baa50b67586ca4966cf1e8202e3acf326f7e2ed Mon Sep 17 00:00:00 2001 From: Daniel Bernal Date: Tue, 17 Dec 2024 18:34:35 +0100 Subject: [PATCH 51/66] Bugfix: Fix Youtube Internal links when 'Watching on Youtube' from Duck Player (#3733) Task/Issue URL: https://app.asana.com/0/1204099484721401/1208930843675395/f Tech Design URL: CC: Description: Fixes an issue causing Youtube internal links to open Duck Player --- .../DuckPlayerNavigationHandler.swift | 10 ++++++++++ ...YoutublePlayerNavigationHandlerTests.swift | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift b/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift index 05160f8381..13afd90eb0 100644 --- a/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift +++ b/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift @@ -936,6 +936,16 @@ extension DuckPlayerNavigationHandler: DuckPlayerNavigationHandling { return false } + // Allow Youtube's internal navigation when DuckPlayer is enabled and user is watching on Youtube + // This is to prevent DuckPlayer from interfering with Youtube's internal navigation for search and settings + // https://app.asana.com/0/1204099484721401/1208930843675395/f + if let (destinationVideoID, _) = url.youtubeVideoParams, + let (originVideoID, _) = webView.url?.youtubeVideoParams, + destinationVideoID == originVideoID, + duckPlayerMode == .enabled { + return false + } + // Redirect to Duck Player if enabled if url.isYoutubeWatch && duckPlayerMode == .enabled && !isDuckPlayerRedirect(url: url) { redirectToDuckPlayerVideo(url: url, webView: webView) diff --git a/DuckDuckGoTests/YoutublePlayerNavigationHandlerTests.swift b/DuckDuckGoTests/YoutublePlayerNavigationHandlerTests.swift index 4b968fcd68..3ae7bc73ea 100644 --- a/DuckDuckGoTests/YoutublePlayerNavigationHandlerTests.swift +++ b/DuckDuckGoTests/YoutublePlayerNavigationHandlerTests.swift @@ -582,4 +582,24 @@ class DuckPlayerNavigationHandlerTests: XCTestCase { XCTAssertNil(tabNavigator.openedURL, "No new tabs should open") } + @MainActor + func testHandleDelegateNavigation_YoutubeWatchURLWithDuckPlayerEnabledAndSameVideoNavigation_ReturnsFalse() async { + // Arrange + let youtubeURL = URL(string: "https://www.youtube.com/watch?v=abc123")! + let youtubeInternalURL = URL(string: "https://www.youtube.com/watch?v=abc123&settings")! + let request = URLRequest(url: youtubeURL) + let mockFrameInfo = MockFrameInfo(isMainFrame: true) + let navigationAction = MockNavigationAction(request: request, targetFrame: mockFrameInfo) + playerSettings.mode = .enabled + featureFlagger.enabledFeatures = [.duckPlayer, .duckPlayerOpenInNewTab] + + mockWebView.setCurrentURL(youtubeInternalURL) + + // Act + let shouldCancel = handler.handleDelegateNavigation(navigationAction: navigationAction, webView: mockWebView) + + // Assert + XCTAssertFalse(shouldCancel, "Expected navigation NOT to be cancelled as it's Youtube Internal navigation") + } + } From 94cb8ba6d1ee4e14204fe4f13cffe13161339b41 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 15:37:08 +0100 Subject: [PATCH 52/66] Ensure migration has occurred before accessing vault --- .../CredentialProviderViewController.swift | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift index 35f730611e..149447f243 100644 --- a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift +++ b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift @@ -22,6 +22,7 @@ import SwiftUI import BrowserServicesKit import Core import Common +import os.log class CredentialProviderViewController: ASCredentialProviderViewController { @@ -110,7 +111,9 @@ class CredentialProviderViewController: ASCredentialProviderViewController { installChildViewController(hostingController) Task { - await credentialIdentityStoreManager.populateCredentialStore() + if let self = self, self.findKeychainItemsWithV4() { + await credentialIdentityStoreManager.populateCredentialStore() + } } Pixel.fire(pixel: .autofillExtensionEnabled) @@ -203,4 +206,31 @@ class CredentialProviderViewController: ASCredentialProviderViewController { } } } + + private func findKeychainItemsWithV4() -> Bool { + var itemsWithV4: [String] = [] + + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecReturnAttributes as String: kCFBooleanTrue!, + kSecMatchLimit as String: kSecMatchLimitAll + ] + + var result: AnyObject? + + let status = SecItemCopyMatching(query as CFDictionary, &result) + + if status == errSecSuccess, let items = result as? [[String: Any]] { + for item in items { + if let service = item[kSecAttrService as String] as? String, + service.contains("v4") { + itemsWithV4.append(service) + } + } + } else { + Logger.autofill.debug("No items found or error: \(status)") + } + + return !itemsWithV4.isEmpty + } } From 7bb73173badcd7f7f84d65841f9de459f03d5ad8 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 15:37:35 +0100 Subject: [PATCH 53/66] Update to target main app --- .../xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme index 02ee5661e7..7708563eda 100644 --- a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme +++ b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme @@ -46,7 +46,7 @@ shouldAutocreateTestPlan = "YES"> Date: Wed, 18 Dec 2024 15:39:13 +0100 Subject: [PATCH 54/66] Populate credential store if user has enabled before launching app --- DuckDuckGo/AutofillUsageMonitor.swift | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/DuckDuckGo/AutofillUsageMonitor.swift b/DuckDuckGo/AutofillUsageMonitor.swift index 5c9f9bf87f..6123c43180 100644 --- a/DuckDuckGo/AutofillUsageMonitor.swift +++ b/DuckDuckGo/AutofillUsageMonitor.swift @@ -19,19 +19,34 @@ import Core import AuthenticationServices +import BrowserServicesKit final class AutofillUsageMonitor { + private lazy var credentialIdentityStoreManager: AutofillCredentialIdentityStoreManager? = { + guard let vault = try? AutofillSecureVaultFactory.makeVault(reporter: SecureVaultReporter()) else { + return nil + } + + return AutofillCredentialIdentityStoreManager(vault: vault, + tld: AppDependencyProvider.shared.storageCache.tld) + }() + init() { NotificationCenter.default.addObserver(self, selector: #selector(didReceiveSaveEvent), name: .autofillSaveEvent, object: nil) - ASCredentialIdentityStore.shared.getState({ state in + ASCredentialIdentityStore.shared.getState({ [weak self] state in if state.isEnabled { - self.autofillExtensionEnabled = true + if self?.autofillExtensionEnabled == nil { + Task { + await self?.credentialIdentityStoreManager?.populateCredentialStore() + } + } + self?.autofillExtensionEnabled = true } else { - if self.autofillExtensionEnabled != nil { + if self?.autofillExtensionEnabled != nil { Pixel.fire(pixel: .autofillExtensionDisabled) - self.autofillExtensionEnabled = false + self?.autofillExtensionEnabled = false } } }) From f391cce59bd35a12b9f5c763c8de2211946f7b4c Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 15:52:34 +0100 Subject: [PATCH 55/66] Ensure migration has occurred before accessing vault --- .../CredentialProvider/CredentialProviderViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift index 149447f243..3017132267 100644 --- a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift +++ b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift @@ -111,7 +111,7 @@ class CredentialProviderViewController: ASCredentialProviderViewController { installChildViewController(hostingController) Task { - if let self = self, self.findKeychainItemsWithV4() { + if findKeychainItemsWithV4() { await credentialIdentityStoreManager.populateCredentialStore() } } From da651c8ed27fd9f622389b8778300e2619a911d1 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 17:04:06 +0100 Subject: [PATCH 56/66] An additional protective in case users try to access the passwords list via the extension, before launching the app --- .../CredentialProviderViewController.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift index 3017132267..557b7292e7 100644 --- a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift +++ b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift @@ -38,7 +38,11 @@ class CredentialProviderViewController: ASCredentialProviderViewController { tld: tld) private lazy var secureVault: (any AutofillSecureVault)? = { - try? AutofillSecureVaultFactory.makeVault(reporter: SecureVaultReporter()) + if findKeychainItemsWithV4() { + return try? AutofillSecureVaultFactory.makeVault(reporter: SecureVaultReporter()) + } else { + return nil + } }() private lazy var tld: TLD = TLD() From 1e0fa7a1c667176e72edcb1553975035f284dca6 Mon Sep 17 00:00:00 2001 From: amddg44 Date: Wed, 18 Dec 2024 19:35:27 +0100 Subject: [PATCH 57/66] Release 7.149.1-0 (#3740) --- Configuration/Version.xcconfig | 2 +- DuckDuckGo.xcodeproj/project.pbxproj | 64 ++++++++++----------- DuckDuckGo/Settings.bundle/Root.plist | 2 +- fastlane/metadata/default/release_notes.txt | 2 +- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig index 9ef4c72f39..fde561fa40 100644 --- a/Configuration/Version.xcconfig +++ b/Configuration/Version.xcconfig @@ -1 +1 @@ -MARKETING_VERSION = 7.149.0 +MARKETING_VERSION = 7.149.1 diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index fbe80bb961..2d0f1997f1 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9670,7 +9670,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9707,7 +9707,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9797,7 +9797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9824,7 +9824,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9972,7 +9972,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9998,7 +9998,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10065,7 +10065,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10099,7 +10099,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10132,7 +10132,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10162,7 +10162,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10493,7 +10493,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10531,7 +10531,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10568,7 +10568,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10607,7 +10607,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10705,7 +10705,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10736,7 +10736,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10764,7 +10764,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10797,7 +10797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10827,7 +10827,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10860,11 +10860,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11096,7 +11096,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11124,7 +11124,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11156,7 +11156,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11193,7 +11193,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11228,7 +11228,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11263,11 +11263,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11439,11 +11439,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11472,10 +11472,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 0; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 3; + DYLIB_CURRENT_VERSION = 0; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; diff --git a/DuckDuckGo/Settings.bundle/Root.plist b/DuckDuckGo/Settings.bundle/Root.plist index 740cfbe9a5..5b6f693ce0 100644 --- a/DuckDuckGo/Settings.bundle/Root.plist +++ b/DuckDuckGo/Settings.bundle/Root.plist @@ -6,7 +6,7 @@ DefaultValue - 7.149.0 + 7.149.1 Key version Title diff --git a/fastlane/metadata/default/release_notes.txt b/fastlane/metadata/default/release_notes.txt index 66b16c0810..58bb2b4a63 100644 --- a/fastlane/metadata/default/release_notes.txt +++ b/fastlane/metadata/default/release_notes.txt @@ -1 +1 @@ -- Bug fixes and other improvements \ No newline at end of file + - If you use dark mode, you'll notice the app icon has an improved look, whether you've stuck with the classic orange or picked a custom icon color. \ No newline at end of file From 079e995dc8674920758dbd3c7a919ef6ce9006b4 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 15:37:08 +0100 Subject: [PATCH 58/66] Ensure migration has occurred before accessing vault --- .../CredentialProviderViewController.swift | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift index 35f730611e..149447f243 100644 --- a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift +++ b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift @@ -22,6 +22,7 @@ import SwiftUI import BrowserServicesKit import Core import Common +import os.log class CredentialProviderViewController: ASCredentialProviderViewController { @@ -110,7 +111,9 @@ class CredentialProviderViewController: ASCredentialProviderViewController { installChildViewController(hostingController) Task { - await credentialIdentityStoreManager.populateCredentialStore() + if let self = self, self.findKeychainItemsWithV4() { + await credentialIdentityStoreManager.populateCredentialStore() + } } Pixel.fire(pixel: .autofillExtensionEnabled) @@ -203,4 +206,31 @@ class CredentialProviderViewController: ASCredentialProviderViewController { } } } + + private func findKeychainItemsWithV4() -> Bool { + var itemsWithV4: [String] = [] + + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecReturnAttributes as String: kCFBooleanTrue!, + kSecMatchLimit as String: kSecMatchLimitAll + ] + + var result: AnyObject? + + let status = SecItemCopyMatching(query as CFDictionary, &result) + + if status == errSecSuccess, let items = result as? [[String: Any]] { + for item in items { + if let service = item[kSecAttrService as String] as? String, + service.contains("v4") { + itemsWithV4.append(service) + } + } + } else { + Logger.autofill.debug("No items found or error: \(status)") + } + + return !itemsWithV4.isEmpty + } } From 1e4ecf0bcce25d5a4063be71c5cb22eceb023dc4 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 15:37:35 +0100 Subject: [PATCH 59/66] Update to target main app --- .../xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme index 02ee5661e7..7708563eda 100644 --- a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme +++ b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/AutofillCredentialProvider.xcscheme @@ -46,7 +46,7 @@ shouldAutocreateTestPlan = "YES"> Date: Wed, 18 Dec 2024 15:39:13 +0100 Subject: [PATCH 60/66] Populate credential store if user has enabled before launching app --- DuckDuckGo/AutofillUsageMonitor.swift | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/DuckDuckGo/AutofillUsageMonitor.swift b/DuckDuckGo/AutofillUsageMonitor.swift index 5c9f9bf87f..6123c43180 100644 --- a/DuckDuckGo/AutofillUsageMonitor.swift +++ b/DuckDuckGo/AutofillUsageMonitor.swift @@ -19,19 +19,34 @@ import Core import AuthenticationServices +import BrowserServicesKit final class AutofillUsageMonitor { + private lazy var credentialIdentityStoreManager: AutofillCredentialIdentityStoreManager? = { + guard let vault = try? AutofillSecureVaultFactory.makeVault(reporter: SecureVaultReporter()) else { + return nil + } + + return AutofillCredentialIdentityStoreManager(vault: vault, + tld: AppDependencyProvider.shared.storageCache.tld) + }() + init() { NotificationCenter.default.addObserver(self, selector: #selector(didReceiveSaveEvent), name: .autofillSaveEvent, object: nil) - ASCredentialIdentityStore.shared.getState({ state in + ASCredentialIdentityStore.shared.getState({ [weak self] state in if state.isEnabled { - self.autofillExtensionEnabled = true + if self?.autofillExtensionEnabled == nil { + Task { + await self?.credentialIdentityStoreManager?.populateCredentialStore() + } + } + self?.autofillExtensionEnabled = true } else { - if self.autofillExtensionEnabled != nil { + if self?.autofillExtensionEnabled != nil { Pixel.fire(pixel: .autofillExtensionDisabled) - self.autofillExtensionEnabled = false + self?.autofillExtensionEnabled = false } } }) From 3c2509bb8ef525ad1b026207dc874aa97f056974 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 15:52:34 +0100 Subject: [PATCH 61/66] Ensure migration has occurred before accessing vault --- .../CredentialProvider/CredentialProviderViewController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift index 149447f243..3017132267 100644 --- a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift +++ b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift @@ -111,7 +111,7 @@ class CredentialProviderViewController: ASCredentialProviderViewController { installChildViewController(hostingController) Task { - if let self = self, self.findKeychainItemsWithV4() { + if findKeychainItemsWithV4() { await credentialIdentityStoreManager.populateCredentialStore() } } From 3372bc8329ef8c72d9ee8418e4b32d7dd69a43a8 Mon Sep 17 00:00:00 2001 From: Anya Mallon Date: Wed, 18 Dec 2024 17:04:06 +0100 Subject: [PATCH 62/66] An additional protective in case users try to access the passwords list via the extension, before launching the app --- .../CredentialProviderViewController.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift index 3017132267..557b7292e7 100644 --- a/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift +++ b/AutofillCredentialProvider/CredentialProvider/CredentialProviderViewController.swift @@ -38,7 +38,11 @@ class CredentialProviderViewController: ASCredentialProviderViewController { tld: tld) private lazy var secureVault: (any AutofillSecureVault)? = { - try? AutofillSecureVaultFactory.makeVault(reporter: SecureVaultReporter()) + if findKeychainItemsWithV4() { + return try? AutofillSecureVaultFactory.makeVault(reporter: SecureVaultReporter()) + } else { + return nil + } }() private lazy var tld: TLD = TLD() From 577e08caf8fc90fdeea344909d45660949ded8e4 Mon Sep 17 00:00:00 2001 From: amddg44 Date: Wed, 18 Dec 2024 22:02:01 +0100 Subject: [PATCH 63/66] Release 7.150.0-1 (#3742) --- DuckDuckGo.xcodeproj/project.pbxproj | 64 ++++++++++++++-------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 4ff434240a..c655af07ad 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -9670,7 +9670,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -9707,7 +9707,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9797,7 +9797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -9824,7 +9824,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -9972,7 +9972,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -9998,7 +9998,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGo.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; INFOPLIST_FILE = DuckDuckGo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10065,7 +10065,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10099,7 +10099,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10132,7 +10132,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10162,7 +10162,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -10493,7 +10493,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProvider.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10531,7 +10531,7 @@ CODE_SIGN_ENTITLEMENTS = AutofillCredentialProvider/AutofillCredentialProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -10568,7 +10568,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10607,7 +10607,7 @@ CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -10705,7 +10705,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -10736,7 +10736,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = ShareExtension/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10764,7 +10764,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = OpenAction/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( @@ -10797,7 +10797,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; INFOPLIST_FILE = Widgets/Info.plist; @@ -10827,7 +10827,7 @@ CODE_SIGN_ENTITLEMENTS = PacketTunnelProvider/PacketTunnelProviderAlpha.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -10860,11 +10860,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11096,7 +11096,7 @@ CODE_SIGN_ENTITLEMENTS = DuckDuckGo/DuckDuckGoAlpha.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11124,7 +11124,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11156,7 +11156,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11193,7 +11193,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; @@ -11228,7 +11228,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = HKE973VLUW; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -11263,11 +11263,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11439,11 +11439,11 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -11472,10 +11472,10 @@ CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 0; + CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 0; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = Core/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; From 6d1fefb7a98e404f45db6579cfa5655ee3863d4a Mon Sep 17 00:00:00 2001 From: Sam Symons Date: Wed, 18 Dec 2024 13:02:10 -0800 Subject: [PATCH 64/66] Remove ESLint config files (#3739) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/0/1208971717942902/f Tech Design URL: CC: **Description**: This PR cleans up unused ESLint configuration files. **Steps to test this PR**: 1. Check that I haven't missed removing any other ESLint files **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? **Device Testing**: * [ ] iPhone SE (1st Gen) * [ ] iPhone 8 * [ ] iPhone X * [ ] iPhone 14 Pro * [ ] iPad **OS Testing**: * [ ] iOS 15 * [ ] iOS 16 * [ ] iOS 17 **Theme Testing**: * [ ] Light theme * [ ] Dark theme --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- .eslintignore | 1 - .eslintrc | 25 ------------------------- 2 files changed, 26 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 539b4cdd5c..0000000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -submodules/ diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 3b909f8fd4..0000000000 --- a/.eslintrc +++ /dev/null @@ -1,25 +0,0 @@ -{ - "env": { - "browser": true, - "es2017": true - }, - "extends": [ - "standard" - ], - "globals": { - "__firefox__": "readonly", - "SECURITY_TOKEN": "readonly", - "$FEATURE_SETTINGS$": "readonly", - "$GPC_ENABLED$": "readonly", - "$BLOCKING_ENABLED$": "readonly", - "$TRACKER_DATA$": "readonly", - "$IS_DEBUG$": "readonly", - "webkit": "readonly" - }, - "parserOptions": { - "ecmaVersion": 7 - }, - "rules": { - "indent": ["error", 4] - } -} From cdeddbadab176bbd3d9ed63c091d0ff942017070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20=C5=9Apiewak?= Date: Thu, 19 Dec 2024 10:15:05 +0100 Subject: [PATCH 65/66] Fix BrowsingMenu layout (#3712) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/414709148257752/1208946169184139/f Tech Design URL: CC: **Description**: Adjusts layout for `BrowsingMenuButton` so that it expands along with the label inside. Additionally `BrowsingMenuViewController` got a new constraint preventing the menu view from going outside view bounds. **Steps to test this PR**: 1. Enable link conditioner with a bad/slow connection profile. 2. Try to load any site, stop before it finishes loading. 3. Open menu, check if button titles are visible. 4. Load site again (without link conditioner). 5. Check browsing menu sizing and layout is as expected. 6. Go to System Settings -> Developer -> View (simulator) or Display & Brightness -> Display Zoom (physical device) and set display zoom to "Larger text". 7. Repeat testing steps. **Definition of Done (Internal Only)**: * [ ] Does this PR satisfy our [Definition of Done](https://app.asana.com/0/1202500774821704/1207634633537039/f)? **Orientation Testing**: * [ ] Portrait * [ ] Landscape **Device Testing**: * [x] iPhone SE (1st Gen) * [x] iPhone 8 * [ ] iPhone X * [x] iPhone 14 Pro * [x] iPad **OS Testing**: * [ ] iOS 15 * [ ] iOS 16 * [ ] iOS 17 --- ###### Internal references: [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) --- .../BrowsingMenu/BrowsingMenuButton.xib | 39 ++++++------ .../BrowsingMenuViewController.storyboard | 60 +++++++++---------- ...bViewControllerBrowsingMenuExtension.swift | 5 +- 3 files changed, 55 insertions(+), 49 deletions(-) diff --git a/DuckDuckGo/BrowsingMenu/BrowsingMenuButton.xib b/DuckDuckGo/BrowsingMenu/BrowsingMenuButton.xib index 6936ad96a9..358b28ef66 100644 --- a/DuckDuckGo/BrowsingMenu/BrowsingMenuButton.xib +++ b/DuckDuckGo/BrowsingMenu/BrowsingMenuButton.xib @@ -1,39 +1,36 @@ - + - + - - + + - + - + - diff --git a/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.storyboard b/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.storyboard index c15ecff942..9b439b5901 100644 --- a/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.storyboard +++ b/DuckDuckGo/BrowsingMenu/BrowsingMenuViewController.storyboard @@ -1,9 +1,10 @@ - + - + + @@ -12,10 +13,6 @@ - - - - @@ -28,10 +25,10 @@ - + - + @@ -39,43 +36,44 @@ - + - + - - + + - - + + + - + - + - + - + - + @@ -87,7 +85,7 @@ - + @@ -133,20 +131,20 @@ - + - + - + - + @@ -196,18 +194,20 @@ + - + - + + - + - - + + diff --git a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift index fe6b117e86..4dc0613771 100644 --- a/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift +++ b/DuckDuckGo/TabViewControllerBrowsingMenuExtension.swift @@ -128,7 +128,10 @@ extension TabViewController { })) } - entries.append(.separator) + // Do not add separator if there are no entries so far + if entries.count > 0 { + entries.append(.separator) + } let shortcutsEntries = buildShortcutsEntries(includeBookmarks: false) entries.append(contentsOf: shortcutsEntries) From 8a8f641298aff53fccfd06d3e3d939260a2a2055 Mon Sep 17 00:00:00 2001 From: Daniel Bernal Date: Thu, 19 Dec 2024 18:22:49 +0100 Subject: [PATCH 66/66] =?UTF-8?q?DuckPlayer:=20Don=E2=80=99t=20open=20new?= =?UTF-8?q?=20tabs=20or=20DuckPlayer=20at=20launch=20when=20in=20alwaysAsk?= =?UTF-8?q?=20mode=20(#3738)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/1204099484721401/1208896356321073/f Tech Design URL: CC: **Description**: Bugfix: When launching the app after a crash or force close with DuckPlayer in 'Ask' mode, the app automatically opened `youtube.com/watch` pages (videos) in DuckPlayer when it shouldn't. This was caused by DuckPlayer's 'open in new tab' feature. When the app was first launched, a new tab opened for every `youtube.com/watch` page, which triggered DuckPlayer by default. --- DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift b/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift index 13afd90eb0..8ea855cfca 100644 --- a/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift +++ b/DuckDuckGo/DuckPlayer/DuckPlayerNavigationHandler.swift @@ -954,7 +954,7 @@ extension DuckPlayerNavigationHandler: DuckPlayerNavigationHandling { // Redirect to Youtube + DuckPlayer Overlay if Ask Mode if url.isYoutubeWatch && duckPlayerMode == .alwaysAsk && !isDuckPlayerRedirect(url: url) { - redirectToYouTubeVideo(url: url, webView: webView, allowFirstVideo: false) + redirectToYouTubeVideo(url: url, webView: webView, allowFirstVideo: false, disableNewTab: true) return true }