From af231c8bc3d4f2c1ce41973b2afae9a7654c9f0d Mon Sep 17 00:00:00 2001 From: dayanch96 <38832025+dayanch96@users.noreply.github.com> Date: Thu, 22 Jun 2023 22:19:11 +0300 Subject: [PATCH] Advanced mode --- Makefile | 4 +- Settings.x | 219 +++++++++- Sideloading.x | 138 ++++++ YTLite.h | 99 +++++ YTLite.x | 408 +++++++++++++++++- .../en.lproj/Localizable.strings | 108 ++++- .../ru.lproj/Localizable.strings | 106 +++++ .../zh-Hans.lproj/Localizable.strings | 136 ++++++ .../com.dvntm.ytlite_2.0_iphoneos-arm.deb | Bin 0 -> 33136 bytes .../com.dvntm.ytlite_2.0_iphoneos-arm64.deb | Bin 0 -> 33260 bytes 10 files changed, 1208 insertions(+), 10 deletions(-) create mode 100644 Sideloading.x create mode 100644 layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings create mode 100644 packages/com.dvntm.ytlite_2.0_iphoneos-arm.deb create mode 100644 packages/com.dvntm.ytlite_2.0_iphoneos-arm64.deb diff --git a/Makefile b/Makefile index 03cdcce..38ae426 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ endif DEBUG=0 FINALPACKAGE=1 ARCHS = arm64 -PACKAGE_VERSION = 1.0 +PACKAGE_VERSION = 2.0 TARGET := iphone:clang:latest:11.0 include $(THEOS)/makefiles/common.mk @@ -13,6 +13,6 @@ include $(THEOS)/makefiles/common.mk TWEAK_NAME = YTLite $(TWEAK_NAME)_FRAMEWORKS = UIKit Foundation $(TWEAK_NAME)_CFLAGS = -fobjc-arc -DTWEAK_VERSION=$(PACKAGE_VERSION) -$(TWEAK_NAME)_FILES = YTLite.x Settings.x +$(TWEAK_NAME)_FILES = YTLite.x Settings.x Sideloading.x include $(THEOS_MAKE_PATH)/tweak.mk diff --git a/Settings.x b/Settings.x index 45064cf..11d508c 100644 --- a/Settings.x +++ b/Settings.x @@ -6,6 +6,12 @@ static const NSInteger YTLiteSection = 789; +static void resetYTLiteSettings() { + NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"]; + NSFileManager *fileManager = [NSFileManager defaultManager]; + [fileManager removeItemAtPath:prefsPath error:nil]; +} + NSBundle *YTLiteBundle() { static NSBundle *bundle = nil; static dispatch_once_t onceToken; @@ -51,6 +57,19 @@ NSBundle *YTLiteBundle() { CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); } +%new +- (void)updateIntegerPrefsForKey:(NSString *)key intValue:(NSInteger)intValue { + NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"]; + NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:prefsPath]; + + if (!prefs) prefs = [NSMutableDictionary dictionary]; + + [prefs setObject:@(intValue) forKey:key]; + [prefs writeToFile:prefsPath atomically:NO]; + + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); +} + static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleDescription, NSString *key, BOOL *value, id selfObject) { Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem); YTSettingsSectionItem *item = [YTSettingsSectionItemClass switchItemWithTitle:title @@ -72,6 +91,8 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"]; id selfObject = self; + YTSettingsSectionItem *space = [%c(YTSettingsSectionItem) itemWithTitle:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { return YES; }]; + YTSettingsSectionItem *general = [YTSettingsSectionItemClass itemWithTitle:LOC(@"General") accessibilityIdentifier:nil detailTextBlock:^NSString *() { @@ -101,12 +122,108 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD createSwitchItem(LOC(@"RemoveSearch"), LOC(@"RemoveSearchDesc"), @"removeSearchButton", &kNoSearchButton, selfObject) ]; + if (kAdvancedMode) { + YTSettingsSectionItem *addStickyNavbar = createSwitchItem(LOC(@"StickyNavbar"), LOC(@"StickyNavbarDesc"), @"stickyNavbar", &kStickyNavbar, selfObject); + rows = [rows arrayByAddingObject:addStickyNavbar]; + + YTSettingsSectionItem *addNoSubbar = createSwitchItem(LOC(@"NoSubbar"), LOC(@"NoSubbarDesc"), @"noSubbar", &kNoSubbar, selfObject); + rows = [rows arrayByAddingObject:addNoSubbar]; + + YTSettingsSectionItem *addNoYTLogo = createSwitchItem(LOC(@"NoYTLogo"), LOC(@"NoYTLogoDesc"), @"noYTLogo", &kNoYTLogo, selfObject); + rows = [rows arrayByAddingObject:addNoYTLogo]; + } + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Navbar") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; return YES; }]; [sectionItems addObject:navbar]; + if (kAdvancedMode) { + YTSettingsSectionItem *overlay = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Overlay") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + createSwitchItem(LOC(@"HideAutoplay"), LOC(@"HideAutoplayDesc"), @"hideAutoplay", &kHideAutoplay, selfObject), + createSwitchItem(LOC(@"HideSubs"), LOC(@"HideSubsDesc"), @"hideSubs", &kHideSubs, selfObject), + createSwitchItem(LOC(@"NoHUDMsgs"), LOC(@"NoHUDMsgsDesc"), @"noHUDMsgs", &kNoHUDMsgs, selfObject), + createSwitchItem(LOC(@"HidePrevNext"), LOC(@"HidePrevNextDesc"), @"hidePrevNext", &kHidePrevNext, selfObject), + createSwitchItem(LOC(@"ReplacePrevNext"), LOC(@"ReplacePrevNextDesc"), @"replacePrevNext", &kReplacePrevNext, selfObject), + createSwitchItem(LOC(@"NoDarkBg"), LOC(@"NoDarkBgDesc"), @"noDarkBg", &kNoDarkBg, selfObject), + createSwitchItem(LOC(@"NoEndScreenCards"), LOC(@"NoEndScreenCardsDesc"), @"noEndScreenCards", &kEndScreenCards, selfObject), + createSwitchItem(LOC(@"NoFullscreenActions"), LOC(@"NoFullscreenActionsDesc"), @"noFullscreenActions", &kNoFullscreenActions, selfObject), + createSwitchItem(LOC(@"NoRelatedVids"), LOC(@"NoRelatedVidsDesc"), @"noRelatedVids", &kNoRelatedVids, selfObject), + createSwitchItem(LOC(@"NoPromotionCards"), LOC(@"NoPromotionCardsDesc"), @"noPromotionCards", &kNoPromotionCards, selfObject), + createSwitchItem(LOC(@"NoWatermarks"), LOC(@"NoWatermarksDesc"), @"noWatermarks", &kNoWatermarks, selfObject) + ]; + + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Overlay") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:overlay]; + + YTSettingsSectionItem *player = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Player") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + createSwitchItem(LOC(@"Miniplayer"), LOC(@"MiniplayerDesc"), @"miniplayer", &kMiniplayer, selfObject), + createSwitchItem(LOC(@"DisableAutoplay"), LOC(@"DisableAutoplayDesc"), @"disableAutoplay", &kDisableAutoplay, selfObject), + createSwitchItem(LOC(@"NoContentWarning"), LOC(@"NoContentWarningDesc"), @"noContentWarning", &kNoContentWarning, selfObject), + createSwitchItem(LOC(@"ClassicQuality"), LOC(@"ClassicQualityDesc"), @"classicQuality", &kClassicQuality, selfObject), + createSwitchItem(LOC(@"DontSnap2Chapter"), LOC(@"DontSnap2ChapterDesc"), @"dontSnapToChapter", &kDontSnapToChapter, selfObject), + createSwitchItem(LOC(@"RedProgressBar"), LOC(@"RedProgressBarDesc"), @"redProgressBar", &kRedProgressBar, selfObject), + createSwitchItem(LOC(@"NoHints"), LOC(@"NoHintsDesc"), @"noHints", &kNoHints, selfObject), + createSwitchItem(LOC(@"NoFreeZoom"), LOC(@"NoFreeZoomDesc"), @"noFreeZoom", &kNoFreeZoom, selfObject), + createSwitchItem(LOC(@"ExitFullscreen"), LOC(@"ExitFullscreenDesc"), @"exitFullscreen", &kExitFullscreen, selfObject), + createSwitchItem(LOC(@"NoDoubleTap2Seek"), LOC(@"NoDoubleTap2SeekDesc"), @"noDoubleTapToSeek", &kNoDoubleTapToSeek, selfObject) + ]; + + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Player") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:player]; + + YTSettingsSectionItem *shorts = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Shorts") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + createSwitchItem(LOC(@"HideShorts"), LOC(@"HideShortsDesc"), @"hideShorts", &kHideShorts, selfObject), + createSwitchItem(LOC(@"ShortsProgress"), LOC(@"ShortsProgressDesc"), @"shortsProgress", &kShortsProgress, selfObject), + createSwitchItem(LOC(@"ResumeShorts"), LOC(@"ResumeShortsDesc"), @"resumeShorts", &kResumeShorts, selfObject), + createSwitchItem(LOC(@"HideShortsLogo"), LOC(@"HideShortsLogoDesc"), @"hideShortsLogo", &kHideShortsLogo, selfObject), + createSwitchItem(LOC(@"HideShortsSearch"), LOC(@"HideShortsSearchDesc"), @"hideShortsSearch", &kHideShortsSearch, selfObject), + createSwitchItem(LOC(@"HideShortsCamera"), LOC(@"HideShortsCameraDesc"), @"hideShortsCamera", &kHideShortsCamera, selfObject), + createSwitchItem(LOC(@"HideShortsMore"), LOC(@"HideShortsMoreDesc"), @"hideShortsMore", &kHideShortsMore, selfObject), + createSwitchItem(LOC(@"HideShortsSubscriptions"), LOC(@"HideShortsSubscriptionsDesc"), @"hideShortsSubscriptions", &kHideShortsSubscriptions, selfObject), + createSwitchItem(LOC(@"HideShortsLike"), LOC(@"HideShortsLikeDesc"), @"hideShortsLike", &kHideShortsLike, selfObject), + createSwitchItem(LOC(@"HideShortsDislike"), LOC(@"HideShortsDislikeDesc"), @"hideShortsDislike", &kHideShortsDislike, selfObject), + createSwitchItem(LOC(@"HideShortsComments"), LOC(@"HideShortsCommentsDesc"), @"hideShortsComments", &kHideShortsComments, selfObject), + createSwitchItem(LOC(@"HideShortsRemix"), LOC(@"HideShortsRemixDesc"), @"hideShortsRemix", &kHideShortsRemix, selfObject), + createSwitchItem(LOC(@"HideShortsShare"), LOC(@"HideShortsShareDesc"), @"hideShortsShare", &kHideShortsShare, selfObject), + createSwitchItem(LOC(@"HideShortsAvatars"), LOC(@"HideShortsAvatarsDesc"), @"hideShortsAvatars", &kHideShortsAvatars, selfObject), + createSwitchItem(LOC(@"HideShortsThanks"), LOC(@"HideShortsThanksDesc"), @"hideShortsThanks", &kHideShortsThanks, selfObject), + createSwitchItem(LOC(@"HideShortsChannelName"), LOC(@"HideShortsChannelNameDesc"), @"hideShortsChannelName", &kHideShortsChannelName, selfObject), + createSwitchItem(LOC(@"HideShortsDescription"), LOC(@"HideShortsDescriptionDesc"), @"hideShortsDescription", &kHideShortsDescription, selfObject), + createSwitchItem(LOC(@"HideShortsAudioTrack"), LOC(@"HideShortsAudioTrackDesc"), @"hideShortsAudioTrack", &kHideShortsAudioTrack, selfObject) + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Shorts") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:shorts]; + } + YTSettingsSectionItem *tabbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Tabbar") accessibilityIdentifier:nil detailTextBlock:^NSString *() { @@ -115,6 +232,7 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { NSArray *rows = @[ createSwitchItem(LOC(@"RemoveLabels"), LOC(@"RemoveLabelsDesc"), @"removeLabels", &kRemoveLabels, selfObject), + createSwitchItem(LOC(@"ReExplore"), LOC(@"ReExploreDesc"), @"reExplore", &kReExplore, selfObject), createSwitchItem(LOC(@"HideShortsTab"), LOC(@"HideShortsTabDesc"), @"removeShorts", &kRemoveShorts, selfObject), createSwitchItem(LOC(@"HideSubscriptionsTab"), LOC(@"HideSubscriptionsTabDesc"), @"removeSubscriptions", &kRemoveSubscriptions, selfObject), createSwitchItem(LOC(@"HideUploadButton"), LOC(@"HideUploadButtonDesc"), @"removeUploads", &kRemoveUploads, selfObject), @@ -127,21 +245,116 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD }]; [sectionItems addObject:tabbar]; - YTSettingsSectionItem *ps = [%c(YTSettingsSectionItem) itemWithTitle:@"PoomSmart" titleDescription:@"YouTube-X, YTNoPremium, YouTubeHeaders" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + if (kAdvancedMode) { + [sectionItems addObject:space]; + + YTSettingsSectionItem *startup = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Startup") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + switch (kPivotIndex) { + case 1: + return LOC(@"ShortsTab"); + case 2: + return LOC(@"Subscriptions"); + case 3: + return LOC(@"Library"); + case 0: + default: + return LOC(@"Home"); + } + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Home") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *home, NSUInteger arg1) { + kPivotIndex = 0; + [settingsViewController reloadData]; + [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; + return YES; + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"ShortsTab") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *shorts, NSUInteger arg1) { + if (kRemoveShorts) { + YTAlertView *alertView = [%c(YTAlertView) infoDialog]; + alertView.title = LOC(@"Warning"); + alertView.subtitle = LOC(@"TabIsHidden"); + [alertView show]; + return NO; + } else { + kPivotIndex = 1; + [settingsViewController reloadData]; + [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; + return YES; + } + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Subscriptions") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *subscriptions, NSUInteger arg1) { + if (kRemoveSubscriptions) { + YTAlertView *alertView = [%c(YTAlertView) infoDialog]; + alertView.title = LOC(@"Warning"); + alertView.subtitle = LOC(@"TabIsHidden"); + [alertView show]; + return NO; + } else { + kPivotIndex = 2; + [settingsViewController reloadData]; + [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; + return YES; + } + }], + [YTSettingsSectionItemClass checkmarkItemWithTitle:LOC(@"Library") titleDescription:nil selectBlock:^BOOL (YTSettingsCell *library, NSUInteger arg1) { + if (kRemoveLibrary) { + YTAlertView *alertView = [%c(YTAlertView) infoDialog]; + alertView.title = LOC(@"Warning"); + alertView.subtitle = LOC(@"TabIsHidden"); + [alertView show]; + return NO; + } else { + kPivotIndex = 3; + [settingsViewController reloadData]; + [self updateIntegerPrefsForKey:@"pivotIndex" intValue:kPivotIndex]; + return YES; + } + }] + ]; + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Startup") pickerSectionTitle:nil rows:rows selectedItemIndex:kPivotIndex parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:startup]; + } + + [sectionItems addObject:space]; + + YTSettingsSectionItem *ps = [%c(YTSettingsSectionItem) itemWithTitle:@"PoomSmart" titleDescription:@"YouTube-X, YTNoPremium, YTClassicVideoQuality, YTShortsProgress, YTReExplore, SkipContentWarning, YouTubeHeaders" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/PoomSmart/"]]; }]; + YTSettingsSectionItem *miro = [%c(YTSettingsSectionItem) itemWithTitle:@"MiRO92" titleDescription:@"YTNoShorts" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/MiRO92/"]]; + }]; + YTSettingsSectionItem *dayanch96 = [%c(YTSettingsSectionItem) itemWithTitle:@"Dayanch96" titleDescription:LOC(@"Developer") accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/Dayanch96/"]]; }]; + YTSettingsSectionItem *reset = [%c(YTSettingsSectionItem) itemWithTitle:LOC(@"ResetSettings") titleDescription:nil accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + YTAlertView *alertView = [%c(YTAlertView) confirmationDialogWithAction:^{ + resetYTLiteSettings(); + exit(0); + } + actionTitle:LOC(@"Yes") + cancelTitle:LOC(@"No")]; + alertView.title = LOC(@"Warning"); + alertView.subtitle = LOC(@"ResetMessage"); + [alertView show]; + return YES; + }]; + YTSettingsSectionItem *version = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Version") accessibilityIdentifier:nil detailTextBlock:^NSString *() { return @(OS_STRINGIFY(TWEAK_VERSION)); } selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { - NSArray *rows = @[ps, dayanch96]; + NSArray *rows = @[ps, miro, dayanch96, space, createSwitchItem(LOC(@"Advanced"), nil, @"advancedMode", &kAdvancedMode, selfObject), reset]; YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; [settingsViewController pushViewController:picker]; @@ -158,4 +371,4 @@ static YTSettingsSectionItem *createSwitchItem(NSString *title, NSString *titleD return; } %orig; } -%end +%end \ No newline at end of file diff --git a/Sideloading.x b/Sideloading.x new file mode 100644 index 0000000..561457b --- /dev/null +++ b/Sideloading.x @@ -0,0 +1,138 @@ +#import +#import +#import + +#define YT_BUNDLE_ID @"com.google.ios.youtube" +#define YT_NAME @"YouTube" + +@interface SSOConfiguration : NSObject +@end + +%group gSideloading +// Keychain patching +static NSString *accessGroupID() { + NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: + (__bridge NSString *)kSecClassGenericPassword, (__bridge NSString *)kSecClass, + @"bundleSeedID", kSecAttrAccount, + @"", kSecAttrService, + (id)kCFBooleanTrue, kSecReturnAttributes, + nil]; + CFDictionaryRef result = nil; + OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&result); + if (status == errSecItemNotFound) + status = SecItemAdd((__bridge CFDictionaryRef)query, (CFTypeRef *)&result); + if (status != errSecSuccess) + return nil; + NSString *accessGroup = [(__bridge NSDictionary *)result objectForKey:(__bridge NSString *)kSecAttrAccessGroup]; + + return accessGroup; +} + +// IAmYouTube (https://github.com/PoomSmart/IAmYouTube/) +%hook YTVersionUtils ++ (NSString *)appName { return YT_NAME; } ++ (NSString *)appID { return YT_BUNDLE_ID; } +%end + +%hook GCKBUtils ++ (NSString *)appIdentifier { return YT_BUNDLE_ID; } +%end + +%hook GPCDeviceInfo ++ (NSString *)bundleId { return YT_BUNDLE_ID; } +%end + +%hook OGLBundle ++ (NSString *)shortAppName { return YT_NAME; } +%end + +%hook GVROverlayView ++ (NSString *)appName { return YT_NAME; } +%end + +%hook OGLPhenotypeFlagServiceImpl +- (NSString *)bundleId { return YT_BUNDLE_ID; } +%end + +%hook APMAEU ++ (BOOL)isFAS { return YES; } +%end + +%hook GULAppEnvironmentUtil ++ (BOOL)isFromAppStore { return YES; } +%end + +%hook SSOConfiguration +- (id)initWithClientID:(id)clientID supportedAccountServices:(id)supportedAccountServices { + self = %orig; + [self setValue:YT_NAME forKey:@"_shortAppName"]; + [self setValue:YT_BUNDLE_ID forKey:@"_applicationIdentifier"]; + return self; +} +%end + +%hook NSBundle +- (NSString *)bundleIdentifier { + NSArray *address = [NSThread callStackReturnAddresses]; + Dl_info info = {0}; + if (dladdr((void *)[address[2] longLongValue], &info) == 0) + return %orig; + NSString *path = [NSString stringWithUTF8String:info.dli_fname]; + if ([path hasPrefix:NSBundle.mainBundle.bundlePath]) + return YT_BUNDLE_ID; + return %orig; +} +- (id)objectForInfoDictionaryKey:(NSString *)key { + if ([key isEqualToString:@"CFBundleIdentifier"]) + return YT_BUNDLE_ID; + if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"]) + return YT_NAME; + return %orig; +} +// Fix Google Sign in by @PoomSmart and @level3tjg (qnblackcat/uYouPlus#684) +- (NSDictionary *)infoDictionary { + NSMutableDictionary *info = %orig.mutableCopy; + NSString *altBundleIdentifier = info[@"ALTBundleIdentifier"]; + if (altBundleIdentifier) info[@"CFBundleIdentifier"] = altBundleIdentifier; + return info; +} +%end + +// Fix login for YouTube 18.13.2 and higher +%hook SSOKeychainHelper ++ (NSString *)accessGroup { + return accessGroupID(); +} ++ (NSString *)sharedAccessGroup { + return accessGroupID(); +} +%end + +// Fix login for YouTube 17.33.2 and higher +%hook SSOKeychainCore ++ (NSString *)accessGroup { + return accessGroupID(); +} + ++ (NSString *)sharedAccessGroup { + return accessGroupID(); +} +%end + +// Fix App Group Directory by moving it to documents directory +%hook NSFileManager +- (NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier { + if (groupIdentifier != nil) { + NSArray *paths = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]; + NSURL *documentsURL = [paths lastObject]; + return [documentsURL URLByAppendingPathComponent:@"AppGroup"]; + } + return %orig(groupIdentifier); +} +%end +%end + +%ctor { + NSString *embeddedMobileProvisionPath = [[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]; + if ([[NSFileManager defaultManager] fileExistsAtPath:embeddedMobileProvisionPath]) %init(gSideloading); +} diff --git a/YTLite.h b/YTLite.h index 93fbb59..c17cb4c 100644 --- a/YTLite.h +++ b/YTLite.h @@ -1,10 +1,17 @@ #import #import #import +#import "../YouTubeHeader/YTIGuideResponse.h" +#import "../YouTubeHeader/YTIGuideResponseSupportedRenderers.h" #import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h" #import "../YouTubeHeader/YTIPivotBarRenderer.h" +#import "../YouTubeHeader/YTIBrowseRequest.h" #import "../YouTubeHeader/YTISectionListRenderer.h" #import "../YouTubeHeader/YTQTMButton.h" +#import "../YouTubeHeader/YTVideoQualitySwitchOriginalController.h" +#import "../YouTubeHeader/YTPlayerViewController.h" +#import "../YouTubeHeader/YTPlayerOverlay.h" +#import "../YouTubeHeader/YTPlayerOverlayProvider.h" #import "../YouTubeHeader/YTSettingsViewController.h" #import "../YouTubeHeader/YTSettingsSectionItem.h" #import "../YouTubeHeader/YTSettingsSectionItemManager.h" @@ -23,16 +30,62 @@ BOOL kBackgroundPlayback; BOOL kNoCast; BOOL kNoNotifsButton; BOOL kNoSearchButton; +BOOL kStickyNavbar; +BOOL kNoSubbar; +BOOL kNoYTLogo; +BOOL kHideAutoplay; +BOOL kHideSubs; +BOOL kNoHUDMsgs; +BOOL kHidePrevNext; +BOOL kReplacePrevNext; +BOOL kNoDarkBg; +BOOL kEndScreenCards; +BOOL kNoFullscreenActions; +BOOL kNoRelatedVids; +BOOL kNoPromotionCards; +BOOL kNoWatermarks; +BOOL kMiniplayer; +BOOL kDisableAutoplay; +BOOL kNoContentWarning; +BOOL kClassicQuality; +BOOL kDontSnapToChapter; +BOOL kRedProgressBar; +BOOL kNoHints; +BOOL kNoFreeZoom; +BOOL kExitFullscreen; +BOOL kNoDoubleTapToSeek; +BOOL kHideShorts; +BOOL kShortsProgress; +BOOL kResumeShorts; +BOOL kHideShortsLogo; +BOOL kHideShortsSearch; +BOOL kHideShortsCamera; +BOOL kHideShortsMore; +BOOL kHideShortsSubscriptions; +BOOL kHideShortsLike; +BOOL kHideShortsDislike; +BOOL kHideShortsComments; +BOOL kHideShortsRemix; +BOOL kHideShortsShare; +BOOL kHideShortsAvatars; +BOOL kHideShortsThanks; +BOOL kHideShortsChannelName; +BOOL kHideShortsDescription; +BOOL kHideShortsAudioTrack; BOOL kRemoveLabels; +BOOL kReExplore; BOOL kRemoveShorts; BOOL kRemoveSubscriptions; BOOL kRemoveUploads; BOOL kRemoveLibrary; +BOOL kAdvancedMode; +int kPivotIndex; @interface YTSettingsSectionItemManager (Custom) @property (nonatomic, strong) NSMutableDictionary *prefs; @property (nonatomic, strong) NSString *prefsPath; - (void)updatePrefsForKey:(NSString *)key enabled:(BOOL)enabled; +- (void)updateIntegerPrefsForKey:(NSString *)key intValue:(NSInteger)intValue; @end @interface YTPivotBarView : UIView @@ -41,7 +94,53 @@ BOOL kRemoveLibrary; @interface YTPivotBarItemView : UIView @end +@interface YTPivotBarViewController : UIViewController +- (void)selectItemWithPivotIdentifier:(id)pivotIndentifier; +@end + @interface YTRightNavigationButtons : UIView @property (nonatomic, strong) YTQTMButton *notificationButton; @property (nonatomic, strong) YTQTMButton *searchButton; @end + +@interface YTNavigationBarTitleView : UIView +@end + +@interface YTSegmentableInlinePlayerBarView +@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter; +@end + +@interface YTPlayabilityResolutionUserActionUIController : NSObject +- (void)confirmAlertDidPressConfirm; +@end + +@interface YTReelPlayerButton : UIButton +@end + +@interface ELMCellNode +@end + +@interface _ASCollectionViewCell : UICollectionViewCell +- (id)node; +@end + +@interface YTAsyncCollectionView : UICollectionView +- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath; +@end + +@interface YTReelWatchPlaybackOverlayView : UIView +@end + +@interface YTReelTransparentStackView : UIView +@end + +@interface YTReelWatchHeaderView : UIView +@end + +@interface YTAlertView : UIView +@property (nonatomic, copy, readwrite) NSString *title; +@property (nonatomic, copy, readwrite) NSString *subtitle; ++ (instancetype)infoDialog; ++ (instancetype)confirmationDialogWithAction:(void (^)(void))action actionTitle:(NSString *)actionTitle cancelTitle:(NSString *)cancelTitle; +- (void)show; +@end \ No newline at end of file diff --git a/YTLite.x b/YTLite.x index a4bb1b2..51fe467 100644 --- a/YTLite.x +++ b/YTLite.x @@ -120,6 +120,254 @@ BOOL isAd(YTIElementRenderer *self) { } %end +// Hide YouTube Logo +%hook YTNavigationBarTitleView +- (void)layoutSubviews { %orig; if (kNoYTLogo && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.yoodle.logo"]) self.subviews[1].hidden = YES; } +%end + +// Stick Navigation bar +%hook YTHeaderView +- (BOOL)stickyNavHeaderEnabled { return kStickyNavbar ? YES : NO; } +%end + +// Remove Subbar +%hook YTMySubsFilterHeaderView +- (void)setChipFilterView:(id)arg1 { if (!kNoSubbar) %orig; } +%end + +%hook YTHeaderContentComboView +- (void)enableSubheaderBarWithView:(id)arg1 { if (!kNoSubbar) %orig; } +%end + +%hook YTHeaderContentComboView +- (void)setFeedHeaderScrollMode:(int)arg1 { kNoSubbar ? %orig(0) : %orig; } +%end + +// Hide Autoplay Switch and Subs Button +%hook YTMainAppControlsOverlayView +- (void)setAutoplaySwitchButtonRenderer:(id)arg1 { if (!kHideAutoplay) %orig; } +- (void)setClosedCaptionsOrSubtitlesButtonAvailable:(BOOL)arg1 { kHideSubs ? %orig(NO) : %orig; } +%end + +// Remove HUD Messages +%hook YTHUDMessageView +- (id)initWithMessage:(id)arg1 dismissHandler:(id)arg2 { return kNoHUDMsgs ? nil : %orig; } +%end + + +%hook YTColdConfig +// Hide Next & Previous buttons +- (BOOL)removeNextPaddleForSingletonVideos { return kHidePrevNext ? YES : NO; } +- (BOOL)removePreviousPaddleForSingletonVideos { return kHidePrevNext ? YES : NO; } +// Replace Next & Previous with Fast Forward & Rewind buttons +- (BOOL)replaceNextPaddleWithFastForwardButtonForSingletonVods { return kReplacePrevNext ? YES : NO; } +- (BOOL)replacePreviousPaddleWithRewindButtonForSingletonVods { return kReplacePrevNext ? YES : NO; } +// Disable Free Zoom +- (BOOL)videoZoomFreeZoomEnabledGlobalConfig { return kNoFreeZoom ? NO : YES; } +// Use System Theme +- (BOOL)shouldUseAppThemeSetting { return YES; } +// Dismiss Panel By Swiping in Fullscreen Mode +- (BOOL)isLandscapeEngagementPanelSwipeRightToDismissEnabled { return YES; } +// Remove Video in Playlist By Swiping To The Right +- (BOOL)enableSwipeToRemoveInPlaylistWatchEp { return YES; } +%end + +// Remove Dark Background in Overlay +%hook YTMainAppVideoPlayerOverlayView +- (void)setBackgroundVisible:(BOOL)arg1 { kNoDarkBg ? %orig(NO) : %orig; } +%end + +// No Endscreen Cards +%hook YTCreatorEndscreenView +- (void)setHidden:(BOOL)arg1 { kEndScreenCards ? %orig(YES) : %orig; } +%end + +// Disable Fullscreen Actions +%hook YTFullscreenActionsView +- (BOOL)enabled { return kNoFullscreenActions ? NO : YES; } +- (void)setEnabled:(BOOL)arg1 { kNoFullscreenActions ? %orig(NO) : %orig; } +%end + +// Dont Show Related Videos on Finish +%hook YTFullscreenEngagementOverlayController +- (void)setRelatedVideosVisible:(BOOL)arg1 { kNoRelatedVids ? %orig(NO) : %orig; } +%end + +// Hide Paid Promotion Cards +%hook YTMainAppVideoPlayerOverlayViewController +- (void)setPaidContentWithPlayerData:(id)data { if (!kNoPromotionCards) %orig; } +- (void)playerOverlayProvider:(YTPlayerOverlayProvider *)provider didInsertPlayerOverlay:(YTPlayerOverlay *)overlay { + if ([[overlay overlayIdentifier] isEqualToString:@"player_overlay_paid_content"] && kNoPromotionCards) return; + %orig; +} +%end + +%hook YTInlineMutedPlaybackPlayerOverlayViewController +- (void)setPaidContentWithPlayerData:(id)data { if (!kNoPromotionCards) %orig; } +%end + +// Remove Watermarks +%hook YTAnnotationsViewController +- (void)loadFeaturedChannelWatermark { if (!kNoWatermarks) %orig; } +%end + +// Forcibly Enable Miniplayer +%hook YTWatchMiniBarViewController +- (void)updateMiniBarPlayerStateFromRenderer { if (!kMiniplayer) %orig; } +%end + +// Disable Autoplay +%hook YTPlaybackConfig +- (void)setStartPlayback:(BOOL)arg1 { kDisableAutoplay ? %orig(NO) : %orig; } +%end + +// Skip Content Warning (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L452-L454) +%hook YTPlayabilityResolutionUserActionUIController +- (void)showConfirmAlert { if (kNoContentWarning) [self confirmAlertDidPressConfirm]; } +%end + +// Classic Video Quality (https://github.com/PoomSmart/YTClassicVideoQuality) +%hook YTVideoQualitySwitchControllerFactory +- (id)videoQualitySwitchControllerWithParentResponder:(id)responder { + Class originalClass = %c(YTVideoQualitySwitchOriginalController); + if (kClassicQuality) { + return originalClass ? [[originalClass alloc] initWithParentResponder:responder] : %orig; + } return %orig; +} +%end + +// Disable Snap To Chapter (https://github.com/qnblackcat/uYouPlus/blob/main/uYouPlus.xm#L457-464) +%hook YTSegmentableInlinePlayerBarView +- (void)didMoveToWindow { %orig; if (kDontSnapToChapter) self.enableSnapToChapter = NO; } +%end + +// Red Progress Bar and Gray Buffer Progress +%hook YTInlinePlayerBarContainerView +- (id)quietProgressBarColor { return kRedProgressBar ? [UIColor redColor] : %orig; } +%end + +%hook YTSegmentableInlinePlayerBarView +- (void)setBufferedProgressBarColor:(id)arg1 { if (kNoRelatedVids) %orig([UIColor colorWithRed:0.65 green:0.65 blue:0.65 alpha:0.60]); } +%end + +// Disable Hints +%hook YTSettings +- (BOOL)areHintsDisabled { return kNoHints ? YES : NO; } +- (void)setHintsDisabled:(BOOL)arg1 { kNoHints ? %orig(YES) : %orig; } +%end + +%hook YTUserDefaults +- (BOOL)areHintsDisabled { return kNoHints ? YES : NO; } +- (void)setHintsDisabled:(BOOL)arg1 { kNoHints ? %orig(YES) : %orig; } +%end + +// Exit Fullscreen on Finish +%hook YTWatchFlowController +- (BOOL)shouldExitFullScreenOnFinish { return kExitFullscreen ? YES : NO; } +%end + +// Disable Double Tap To Seek +%hook YTDoubleTapToSeekController +- (void)enableDoubleTapToSeek:(BOOL)arg1 { kNoDoubleTapToSeek ? %orig(NO) : %orig; } +%end + +// Remove Shorts (https://github.com/MiRO92/YTNoShorts) +%hook YTAsyncCollectionView +- (id)cellForItemAtIndexPath:(NSIndexPath *)indexPath { + if (kHideShorts) { + UICollectionViewCell *cell = %orig; + if ([cell isKindOfClass:NSClassFromString(@"_ASCollectionViewCell")]) { + _ASCollectionViewCell *cell = %orig; + if ([cell respondsToSelector:@selector(node)]) { + if ([[[cell node] accessibilityIdentifier] isEqualToString:@"eml.shorts-shelf"]) { + [self removeShortsCellAtIndexPath:indexPath]; + } + } + } else if ([cell isKindOfClass:NSClassFromString(@"YTReelShelfCell")]) { + [self removeShortsCellAtIndexPath:indexPath]; + } return %orig; + } return %orig; +} + +%new +- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath { + [self deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]]; +} +%end + +// Shorts Progress Bar (https://github.com/PoomSmart/YTShortsProgress) +%hook YTReelPlayerViewController +- (BOOL)shouldEnablePlayerBar { return kShortsProgress ? YES : NO; } +- (BOOL)shouldAlwaysEnablePlayerBar { return kShortsProgress ? YES : NO; } +- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; } +%end + +%hook YTReelPlayerViewControllerSub +- (BOOL)shouldEnablePlayerBar { return kShortsProgress ? YES : NO; } +- (BOOL)shouldAlwaysEnablePlayerBar { return kShortsProgress ? YES : NO; } +- (BOOL)shouldEnablePlayerBarOnlyOnPause { return kShortsProgress ? NO : YES; } +%end + +%hook YTColdConfig +- (BOOL)iosEnableVideoPlayerScrubber { return kShortsProgress ? YES : NO; } +- (BOOL)mobileShortsTabInlined { return kShortsProgress ? YES : NO; } +%end + +%hook YTHotConfig +- (BOOL)enablePlayerBarForVerticalVideoWhenControlsHiddenInFullscreen { return kShortsProgress ? YES : NO; } +%end + +// Dont Startup Shorts +%hook YTShortsStartupCoordinator +- (id)evaluateResumeToShorts { return kResumeShorts ? nil : %orig; } +%end + +// Hide Shorts Elements +%hook YTReelPausedStateCarouselView +- (void)setPausedStateCarouselVisible:(BOOL)arg1 animated:(BOOL)arg2 { kHideShortsSubscriptions ? %orig(arg1 = NO, arg2) : %orig; } +%end + +%hook YTReelWatchPlaybackOverlayView +- (void)setReelLikeButton:(id)arg1 { if (!kHideShortsLike) %orig; } +- (void)setReelDislikeButton:(id)arg1 { if (!kHideShortsDislike) %orig; } +- (void)setViewCommentButton:(id)arg1 { if (!kHideShortsComments) %orig; } +- (void)setRemixButton:(id)arg1 { if (!kHideShortsRemix) %orig; } +- (void)setShareButton:(id)arg1 { if (!kHideShortsShare) %orig; } +- (void)layoutSubviews { + %orig; + + for (UIView *subview in self.subviews) { + if (kHideShortsAvatars && [NSStringFromClass([subview class]) isEqualToString:@"YTELMView"]) { + subview.hidden = YES; + break; + } + } +} +%end + +%hook YTReelHeaderView +- (void)setTitleLabelVisible:(BOOL)arg1 animated:(BOOL)arg2 { kHideShortsLogo ? %orig(arg1 = NO, arg2) : %orig; } +%end + +%hook YTReelTransparentStackView +- (void)layoutSubviews { + %orig; + if (kHideShortsSearch && self.subviews.count >= 3 && [self.subviews[0].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[0].hidden = YES; + if (kHideShortsCamera && self.subviews.count >= 3 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[1].hidden = YES; + if (kHideShortsMore && self.subviews.count >= 3 && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.ui.generic.button"]) self.subviews[2].hidden = YES; +} +%end + +%hook YTReelWatchHeaderView +- (void)layoutSubviews { + %orig; + if (kHideShortsDescription && [self.subviews[2].accessibilityIdentifier isEqualToString:@"id.reels_smv_player_title_label"]) self.subviews[2].hidden = YES; + if (kHideShortsThanks && [self.subviews[self.subviews.count - 3].accessibilityIdentifier isEqualToString:@"id.elements.components.suggested_action"]) self.subviews[self.subviews.count - 3].hidden = YES; + if (kHideShortsChannelName) self.subviews[self.subviews.count - 2].hidden = YES; + if (kHideShortsAudioTrack) self.subviews.lastObject.hidden = YES; +} +%end + // Remove Tabs %hook YTPivotBarView - (void)setRenderer:(YTIPivotBarRenderer *)renderer { @@ -149,6 +397,39 @@ BOOL isAd(YTIElementRenderer *self) { } %end +// Replace Shorts with Explore tab (https://github.com/PoomSmart/YTReExplore) +static void replaceTab(YTIGuideResponse *response) { + NSMutableArray *renderers = [response itemsArray]; + for (YTIGuideResponseSupportedRenderers *guideRenderers in renderers) { + YTIPivotBarRenderer *pivotBarRenderer = [guideRenderers pivotBarRenderer]; + NSMutableArray *items = [pivotBarRenderer itemsArray]; + NSUInteger shortIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:@"FEshorts"]; + }]; + if (shortIndex != NSNotFound) { + [items removeObjectAtIndex:shortIndex]; + NSUInteger exploreIndex = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + return [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:[%c(YTIBrowseRequest) browseIDForExploreTab]]; + }]; + if (exploreIndex == NSNotFound) { + YTIPivotBarSupportedRenderers *exploreTab = [%c(YTIPivotBarRenderer) pivotSupportedRenderersWithBrowseId:[%c(YTIBrowseRequest) browseIDForExploreTab] title:LOC(@"Explore") iconType:292]; + [items insertObject:exploreTab atIndex:1]; + } + } + } +} + +%hook YTGuideServiceCoordinator +- (void)handleResponse:(YTIGuideResponse *)response withCompletion:(id)completion { + if (kReExplore) replaceTab(response); + %orig(response, completion); +} +- (void)handleResponse:(YTIGuideResponse *)response error:(id)error completion:(id)completion { + if (kReExplore) replaceTab(response); + %orig(response, error, completion); +} +%end + // Hide Tab Labels BOOL hasHomeBar = NO; CGFloat pivotBarViewHeight; @@ -168,14 +449,14 @@ CGFloat pivotBarViewHeight; if (kRemoveLabels) { for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:NSClassFromString(@"YTPivotBarItemViewAccessibilityControl")]) { + if ([subview isKindOfClass:objc_lookUpClass("YTPivotBarItemViewAccessibilityControl")]) { pivotBarAccessibilityControlWidth = CGRectGetWidth(subview.frame); break; } } for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:NSClassFromString(@"YTQTMButton")]) { + if ([subview isKindOfClass:objc_lookUpClass("YTQTMButton")]) { for (UIView *buttonSubview in subview.subviews) { if ([buttonSubview isKindOfClass:[UILabel class]]) { [buttonSubview removeFromSuperview]; @@ -224,6 +505,36 @@ CGFloat pivotBarViewHeight; } %end +// Startup Tab +BOOL isTabSelected = NO; +%hook YTPivotBarViewController +- (void)viewDidAppear:(BOOL)animated { + %orig(); + + if (!isTabSelected) { + NSString *pivotIdentifier; + switch (kPivotIndex) { + case 0: + pivotIdentifier = @"FEwhat_to_watch"; + break; + case 1: + pivotIdentifier = @"FEshorts"; + break; + case 2: + pivotIdentifier = @"FEsubscriptions"; + break; + case 3: + pivotIdentifier = @"FElibrary"; + break; + default: + return; + } + [self selectItemWithPivotIdentifier:pivotIdentifier]; + isTabSelected = YES; + } +} +%end + static void reloadPrefs() { NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"]; NSDictionary *prefs = [NSDictionary dictionaryWithContentsOfFile:path]; @@ -233,11 +544,56 @@ static void reloadPrefs() { kNoCast = [prefs[@"noCast"] boolValue] ?: NO; kNoNotifsButton = [prefs[@"removeNotifsButton"] boolValue] ?: NO; kNoSearchButton = [prefs[@"removeSearchButton"] boolValue] ?: NO; + kStickyNavbar = [prefs[@"stickyNavbar"] boolValue] ?: NO; + kNoSubbar = [prefs[@"noSubbar"] boolValue] ?: NO; + kNoYTLogo = [prefs[@"noYTLogo"] boolValue] ?: NO; + kHideAutoplay = [prefs[@"hideAutoplay"] boolValue] ?: NO; + kHideSubs = [prefs[@"hideSubs"] boolValue] ?: NO; + kNoHUDMsgs = [prefs[@"noHUDMsgs"] boolValue] ?: NO; + kHidePrevNext = [prefs[@"hidePrevNext"] boolValue] ?: NO; + kReplacePrevNext = [prefs[@"replacePrevNext"] boolValue] ?: NO; + kNoDarkBg = [prefs[@"noDarkBg"] boolValue] ?: NO; + kEndScreenCards = [prefs[@"endScreenCards"] boolValue] ?: NO; + kNoFullscreenActions = [prefs[@"noFullscreenActions"] boolValue] ?: NO; + kNoRelatedVids = [prefs[@"noRelatedVids"] boolValue] ?: NO; + kNoPromotionCards = [prefs[@"noPromotionCards"] boolValue] ?: NO; + kNoWatermarks = [prefs[@"noWatermarks"] boolValue] ?: NO; + kMiniplayer = [prefs[@"miniplayer"] boolValue] ?: NO; + kDisableAutoplay = [prefs[@"disableAutoplay"] boolValue] ?: NO; + kNoContentWarning = [prefs[@"noContentWarning"] boolValue] ?: NO; + kClassicQuality = [prefs[@"classicQuality"] boolValue] ?: NO; + kDontSnapToChapter = [prefs[@"dontSnapToChapter"] boolValue] ?: NO; + kRedProgressBar = [prefs[@"redProgressBar"] boolValue] ?: NO; + kNoHints = [prefs[@"noHints"] boolValue] ?: NO; + kNoFreeZoom = [prefs[@"noFreeZoom"] boolValue] ?: NO; + kExitFullscreen = [prefs[@"exitFullscreen"] boolValue] ?: NO; + kNoDoubleTapToSeek = [prefs[@"noDoubleTapToSeek"] boolValue] ?: NO; + kHideShorts = [prefs[@"hideShorts"] boolValue] ?: NO; + kShortsProgress = [prefs[@"shortsProgress"] boolValue] ?: NO; + kResumeShorts = [prefs[@"resumeShorts"] boolValue] ?: NO; + kHideShortsLogo = [prefs[@"hideShortsLogo"] boolValue] ?: NO; + kHideShortsSearch = [prefs[@"hideShortsSearch"] boolValue] ?: NO; + kHideShortsCamera = [prefs[@"hideShortsCamera"] boolValue] ?: NO; + kHideShortsMore = [prefs[@"hideShortsMore"] boolValue] ?: NO; + kHideShortsSubscriptions = [prefs[@"hideShortsSubscriptions"] boolValue] ?: NO; + kHideShortsLike = [prefs[@"hideShortsLike"] boolValue] ?: NO; + kHideShortsDislike = [prefs[@"hideShortsDislike"] boolValue] ?: NO; + kHideShortsComments = [prefs[@"hideShortsComments"] boolValue] ?: NO; + kHideShortsRemix = [prefs[@"hideShortsRemix"] boolValue] ?: NO; + kHideShortsShare = [prefs[@"hideShortsShare"] boolValue] ?: NO; + kHideShortsAvatars = [prefs[@"hideShortsAvatars"] boolValue] ?: NO; + kHideShortsThanks = [prefs[@"hideShortsThanks"] boolValue] ?: NO; + kHideShortsChannelName = [prefs[@"hideShortsChannelName"] boolValue] ?: NO; + kHideShortsDescription = [prefs[@"hideShortsDescription"] boolValue] ?: NO; + kHideShortsAudioTrack = [prefs[@"hideShortsAudioTrack"] boolValue] ?: NO; kRemoveLabels = [prefs[@"removeLabels"] boolValue] ?: NO; + kReExplore = [prefs[@"reExplore"] boolValue] ?: NO; kRemoveShorts = [prefs[@"removeShorts"] boolValue] ?: NO; kRemoveSubscriptions = [prefs[@"removeSubscriptions"] boolValue] ?: NO; kRemoveUploads = (prefs[@"removeUploads"] != nil) ? [prefs[@"removeUploads"] boolValue] : YES; kRemoveLibrary = [prefs[@"removeLibrary"] boolValue] ?: NO; + kPivotIndex = (prefs[@"pivotIndex"] != nil) ? [prefs[@"pivotIndex"] intValue] : 0; + kAdvancedMode = [prefs[@"advancedMode"] boolValue] ?: NO; NSDictionary *newSettings = @{ @"noAds" : @(kNoAds), @@ -245,11 +601,56 @@ static void reloadPrefs() { @"noCast" : @(kNoCast), @"removeNotifsButton" : @(kNoNotifsButton), @"removeSearchButton" : @(kNoSearchButton), + @"stickyNavbar" : @(kStickyNavbar), + @"noSubbar" : @(kNoSubbar), + @"noYTLogo" : @(kNoYTLogo), + @"hideAutoplay" : @(kHideAutoplay), + @"hideSubs" : @(kHideSubs), + @"noHUDMsgs" : @(kNoHUDMsgs), + @"hidePrevNext" : @(kHidePrevNext), + @"replacePrevNext" : @(kReplacePrevNext), + @"noDarkBg" : @(kNoDarkBg), + @"endScreenCards" : @(kEndScreenCards), + @"noFullscreenActions" : @(kNoFullscreenActions), + @"noRelatedVids" : @(kNoRelatedVids), + @"noPromotionCards" : @(kNoPromotionCards), + @"noWatermarks" : @(kNoWatermarks), + @"miniplayer" : @(kMiniplayer), + @"disableAutoplay" : @(kDisableAutoplay), + @"noContentWarning" : @(kNoContentWarning), + @"classicQuality" : @(kClassicQuality), + @"dontSnapToChapter" : @(kDontSnapToChapter), + @"redProgressBar" : @(kRedProgressBar), + @"noHints" : @(kNoHints), + @"noFreeZoom" : @(kNoFreeZoom), + @"exitFullscreen" : @(kExitFullscreen), + @"noDoubleTapToSeek" : @(kNoDoubleTapToSeek), + @"hideShorts" : @(kHideShorts), + @"shortsProgress" : @(kShortsProgress), + @"resumeShorts" : @(kResumeShorts), + @"hideShortsLogo" : @(kHideShortsLogo), + @"hideShortsSearch" : @(kHideShortsSearch), + @"hideShortsCamera" : @(kHideShortsCamera), + @"hideShortsMore" : @(kHideShortsMore), + @"hideShortsSubscriptions" : @(kHideShortsSubscriptions), + @"hideShortsLike" : @(kHideShortsLike), + @"hideShortsDislike" : @(kHideShortsDislike), + @"hideShortsComments" : @(kHideShortsComments), + @"hideShortsRemix" : @(kHideShortsRemix), + @"hideShortsShare" : @(kHideShortsShare), + @"hideShortsAvatars" : @(kHideShortsAvatars), + @"hideShortsThanks" : @(kHideShortsThanks), + @"hideShortsChannelName" : @(kHideShortsChannelName), + @"hideShortsDescription" : @(kHideShortsDescription), + @"hideShortsAudioTrack" : @(kHideShortsAudioTrack), @"removeLabels" : @(kRemoveLabels), + @"reExplore" : @(kReExplore), @"removeShorts" : @(kRemoveShorts), @"removeSubscriptions" : @(kRemoveSubscriptions), @"removeUploads" : @(kRemoveUploads), - @"removeLibrary" : @(kRemoveLibrary) + @"removeLibrary" : @(kRemoveLibrary), + @"pivotIndex" : @(kPivotIndex), + @"advancedMode" : @(kAdvancedMode) }; if (![newSettings isEqualToDictionary:prefs]) [newSettings writeToFile:path atomically:NO]; @@ -262,5 +663,4 @@ static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStrin %ctor { CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.dvntm.ytlite.prefschanged"), NULL, CFNotificationSuspensionBehaviorCoalesce); reloadPrefs(); - %init; } diff --git a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings index 56893ac..196df2f 100644 --- a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings @@ -11,10 +11,64 @@ "RemoveNotificationsDesc" = "Hides Notifications button from the Navigation bar."; "RemoveSearch" = "Hide Search button"; "RemoveSearchDesc" = "Hides Search button from the Navigation bar."; +"StickyNavbar" = "Sticky Navigation bar"; +"StickyNavbarDesc" = "Pins the Navigation bar so that it remains visible when scrolling down."; +"NoSubbar" = "Hide Subbar"; +"NoSubbarDesc" = "Hides Subbar (All, New to you, Live etc.) under the Navigation bar."; +"NoYTLogo" = "Remove YouTube logo"; +"NoYTLogoDesc" = "Removes YouTube logo in the Navigation bar."; + +"Overlay" = "Overlay"; +"HideAutoplay" = "Hide Autoplay switch"; +"HideAutoplayDesc" = "Hides Autoplay switch from the overlay."; +"HideSubs" = "Hide Subtitles button"; +"HideSubsDesc" = "Hides Subtitles button from the overlay."; +"NoHUDMsgs" = "Hide HUD Messages"; +"NoHUDMsgsDesc" = "Hides all feature messages from the player. Example: CC is turned on/off, Video loop is on, etc."; +"HidePrevNext" = "Hide Previous and Next buttons"; +"HidePrevNextDesc" = "Hides Previous and Next video buttons from overlay."; +"ReplacePrevNext" = "Fast forward and Rewind buttons"; +"ReplacePrevNextDesc" = "Replaces Previous and Next video buttons to Fast forward and Rewind buttons in overlay."; +"NoDarkBg" = "Remove dark background"; +"NoDarkBgDesc" = "Removes overlay dark background."; +"NoEndScreenCards" = "Hide End screens hover cards"; +"NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos."; +"NoFullscreenActions" = "Disable fullscreen actions"; +"NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode."; +"NoRelatedVids" = "No related videos in overlay"; +"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up."; +"NoPromotionCards" = "Hide Paid Promotion cards"; +"NoPromotionCardsDesc" = "Hides \"Includes Paid Promotions\" card in promotions included videos."; +"NoWatermarks" = "Hide Watermarks"; +"NoWatermarksDesc" = "Hides channel watermarks from the player."; + +"Player" = "Player"; +"Miniplayer" = "Enable mini player"; +"MiniplayerDesc" = "Enables the mini player for videos that were not originally designed for it, such as videos targeted for children."; +"DisableAutoplay" = "Disable Autoplay videos"; +"DisableAutoplayDesc" = "Prevents video playback after opening."; +"NoContentWarning" = "Skip content warning"; +"NoContentWarningDesc" = "Skips sensitive content warning message."; +"ClassicQuality" = "Classic video quality"; +"ClassicQualityDesc" = "Brings back classic video quality selection menu."; +"DontSnap2Chapter" = "Disable snap to chapter"; +"DontSnap2ChapterDesc" = "Disables skipping to the next episode by double-tap gesture."; +"RedProgressBar" = "Red progress bar"; +"RedProgressBarDesc" = "Brings back red progress bar."; +"NoHints" = "Disable hints"; +"NoHintsDesc" = "Disables hints by author which appears at the top-right corner during playback."; +"NoFreeZoom" = "Disable free zoom gesture"; +"NoFreeZoomDesc" = "Disables new free zoom gestures."; +"ExitFullscreen" = "Exit fullscreen mode on finish"; +"ExitFullscreenDesc" = "Exits fullscreen mode at the end of video playback."; +"NoDoubleTap2Seek" = "Disable double tap to seek"; +"NoDoubleTap2SeekDesc" = "Disables double tap to seek gesture."; "Tabbar" = "Tab bar"; "RemoveLabels" = "Remove labels"; "RemoveLabelsDesc" = "Removes tab labels."; +"ReExplore" = "Replace Shorts tab with Explore tab"; +"ReExploreDesc" = "Shows Explore tab instead of Shorts tab as on old YouTube versions."; "HideShortsTab" = "Hide Shorts tab"; "HideShortsTabDesc" = "Hides Shorts tab from the Tab bar"; "HideSubscriptionsTab" = "Hide Subscriptions tab"; @@ -24,7 +78,59 @@ "HideLibraryTab" = "Hide Library tab"; "HideLibraryTabDesc" = "Hides Library tab from the Tab bar"; +"Shorts" = "Shorts"; +"HideShorts" = "Hide Shorts videos"; +"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)"; +"ShortsProgress" = "Enable progress bar"; +"ShortsProgressDesc" = "Displays progress bar in the Shorts overlay."; +"ResumeShorts" = "Don't start from Shorts tab"; +"ResumeShortsDesc" = "Prevents starting from Shorts videos at the opening app, which happens if YouTube was closed while watching Shorts."; +"HideShortsLogo" = "Hide Shorts logo"; +"HideShortsLogoDesc" = "Hides Shorts logo in the top left corner."; +"HideShortsSearch" = "Hide Search button"; +"HideShortsSearchDesc" = "Hides Search button from the Shorts overlay."; +"HideShortsCamera" = "Hide Camera button"; +"HideShortsCameraDesc" = "Hides Camera button from the Shorts overlay."; +"HideShortsMore" = "Hide More (⋮) button"; +"HideShortsMoreDesc" = "Hides More (⋮) button from the Shorts overlay. It's also accessible by long-pressing the screen."; +"HideShortsSubscriptions" = "Hide Subscriptions button"; +"HideShortsSubscriptionsDesc" = "Hides Subscriptions button which appears when Shorts paused."; +"HideShortsLike" = "Hide Like button"; +"HideShortsLikeDesc" = "Hides Like button from the Shorts overlay."; +"HideShortsDislike" = "Hide Dislike button"; +"HideShortsDislikeDesc" = "Hides Dislike button from the Shorts overlay."; +"HideShortsComments" = "Hide Comments button"; +"HideShortsCommentsDesc" = "Hides Comments button from the Shorts overlay."; +"HideShortsRemix" = "Hide Remix button"; +"HideShortsRemixDesc" = "Hides Remix button from the Shorts overlay."; +"HideShortsShare" = "Hide Share button"; +"HideShortsShareDesc" = "Hides Share button from the Shorts overlay."; +"HideShortsAvatars" = "Hide channels avatar"; +"HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner."; +"HideShortsThanks" = "Hide Superthanks button"; +"HideShortsThanksDesc" = "Hides Superthanks (Donate) button from the Shorts overlay."; +"HideShortsChannelName" = "Hide Channel name"; +"HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay."; +"HideShortsDescription" = "Hide Description"; +"HideShortsDescriptionDesc" = "Hides Shorts description under channel name."; +"HideShortsAudioTrack" = "Hide AudioTrack"; +"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description."; + +"Startup" = "Startup page"; +"Home" = "Home"; +"Explore" = "Explore"; +"ShortsTab" = "Shorts"; +"Subscriptions" = "Subscriptions"; +"Library" = "Library"; +"Warning" = "Warning"; +"TabIsHidden" = "Hidden tab cannot be selected as startup page"; + "Version" = "Version"; "About" = "About"; "Credits" = "Credits"; -"Developer" = "YTLite developer"; \ No newline at end of file +"Developer" = "YTLite developer"; +"Advanced" = "Advanced mode"; +"ResetSettings" = "Reset YTLite settings"; +"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?"; +"Yes" = "Yes"; +"No" = "No"; \ No newline at end of file diff --git a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings index c05defb..aa4b8f4 100644 --- a/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings +++ b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings @@ -11,10 +11,64 @@ "RemoveNotificationsDesc" = "Скрывает кнопку уведомлений с панели навигации."; "RemoveSearch" = "Скрыть «Поиск»"; "RemoveSearchDesc" = "Скрвыает кнопку поиска с панели навигации."; +"StickyNavbar" = "Закрепить панель навигации"; +"StickyNavbarDesc" = "Закрепляет панель навигации в верхней части экрана, запрещая ему скрываться во время скролла страницы вниз."; +"NoSubbar" = "Скрыть наклейки"; +"NoSubbarDesc" = "Скрывает панель с наклейками (Все, Новое для вас, Сейчас в эфире и т.д.) под панелью навигации."; +"NoYTLogo" = "Скрыть логотип YouTube"; +"NoYTLogoDesc" = "Убирает логотип YouTube с панели навигации."; + +"Overlay" = "Настройки оверлея"; +"HideAutoplay" = "Скрыть «Автовоспроизведение»"; +"HideAutoplayDesc" = "Скрывает тумблер «Автовоспроизведение» с оверлея плеера."; +"HideSubs" = "Скрыть «Субтитры»"; +"HideSubsDesc" = "Скрывает кнопку субтитров с оверлея плеера."; +"NoHUDMsgs" = "Скрыть сообщения плеера"; +"NoHUDMsgsDesc" = "Скрывает надписи YouTube, появляющиеся поверх видео."; +"HidePrevNext" = "Скрыть «След.» и «Пред.»"; +"HidePrevNextDesc" = "Убирает переключатели «Следующий» и «Предыдущий» с плеера"; +"ReplacePrevNext" = "Перемотка вместо «След.» и «Пред.»"; +"ReplacePrevNextDesc" = "Заменяет переключатели «Следующий» и «Предыдущий» на перемотку на 10 сек. в окне плеера."; +"NoDarkBg" = "Не затемнять фон плеера"; +"NoDarkBgDesc" = "Убирает затемнение экрана под кнопками управления плеером."; +"NoEndScreenCards" = "Скрыть рекомендации"; +"NoEndScreenCardsDesc" = "Скрывает эскизы, отображаемые по окончанию видеоролика."; +"NoFullscreenActions" = "Отключить панель действий"; +"NoFullscreenActionsDesc" = "Отключает панель действий, отображающуюся под прогресс-баром плеера."; +"NoRelatedVids" = "Скрыть рекомендации в оверлее"; +"NoRelatedVidsDesc" = "Скрывает рекомендации, отображаемые по свайпу вверх в плеере."; +"NoPromotionCards" = "Скрыть сообщение «Есть реклама»"; +"NoPromotionCardsDesc" = "Скрывает всплывающее сообщение «Есть реклама» в роликах со спонсорской рекламой."; +"NoWatermarks" = "Скрыть водяные знаки"; +"NoWatermarksDesc" = "Скрывает значки каналов в плеере."; + +"Player" = "Настройки плеера"; +"Miniplayer" = "Разрешить миниплеер"; +"MiniplayerDesc" = "Принудительно активирует миниплеер для видео, в которых изначально не был предназначен (например, видеоролики для детей)."; +"DisableAutoplay" = "Запретить автовоспроизведение"; +"DisableAutoplayDesc" = "Принудительно запрещает автовоспроизведение видео при его открытии."; +"NoContentWarning" = "Пропускать предупреждения"; +"NoContentWarningDesc" = "Пропускает предупреждения, всплывающие перед воспроизведением некоторого контента."; +"ClassicQuality" = "Классический выбор качества"; +"ClassicQualityDesc" = "Возвращает классическое меню выбора качества в меню плеера."; +"DontSnap2Chapter" = "Не перематывать эпизоды"; +"DontSnap2ChapterDesc" = "Отключает жест перемотки к следующему эпизоду двойным нажатием."; +"RedProgressBar" = "Красный прогресс-бар"; +"RedProgressBarDesc" = "Возвращает красный прогресс-бар вместо нового, серого цвета."; +"NoHints" = "Отключить подсказки"; +"NoHintsDesc" = "Скрывает подсказки от авторов видео, появляющиеся в правом верхнем углу."; +"NoFreeZoom" = "Отключить жесты для зума"; +"NoFreeZoomDesc" = "Отключает жесты приближения для нового зума."; +"ExitFullscreen" = "Автовыход из полноэкранного режима"; +"ExitFullscreenDesc" = "Выходит из полноэкранного режима по окончанию воспроизведения."; +"NoDoubleTap2Seek" = "Отключить перемотку двойным тапом"; +"NoDoubleTap2SeekDesc" = "Отключает перемотку двойным тапом в плеере."; "Tabbar" = "Панель вкладок"; "RemoveLabels" = "Скрыть названия"; "RemoveLabelsDesc" = "Скрывает названия вкладок."; +"ReExplore" = "Вкладка «Навигация» вместо «Shorts»"; +"ReExploreDesc" = "Заменяет вкладку «Shorts» на привычную нам «Навигацию»."; "HideShortsTab" = "Скрыть «Shorts»"; "HideShortsTabDesc" = "Скрывает вкладку «Shorts» с панели вкладок."; "HideSubscriptionsTab" = "Скрыть «Подписки»"; @@ -24,7 +78,59 @@ "HideLibraryTab" = "Скрыть «Библиотеку»"; "HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок."; +"Shorts" = "Настройки Shorts"; +"HideShorts" = "Скрыть видеоролики Shorts"; +"HideShortsDesc" = "Скрывает видеоролики, помеченные как Shorts с Главного экрана, Рекомендаций и т.д. (Не применяется к истории просмотров)"; +"ShortsProgress" = "Показывать прогресс-бар"; +"ShortsProgressDesc" = "Отображает прогресс-бар в плеере Shorts."; +"ResumeShorts" = "Всегда запускать с Главной страницы"; +"ResumeShortsDesc" = "Предотвращает запуск видеороликов Shorts при открытии YouTube. Это происходит, если закрыть YouTube при просмотре Shorts."; +"HideShortsLogo" = "Скрыть логотип Shorts"; +"HideShortsLogoDesc" = "Скрывает логотип Shorts, расположенный в верхнем левом углу."; +"HideShortsSearch" = "Скрыть кнопку «Поиск»"; +"HideShortsSearchDesc" = "Скрывает кнопку поиска с плеера Shorts."; +"HideShortsCamera" = "Скрыть кнопку «Камера»"; +"HideShortsCameraDesc" = "Скрывает кнопку камеры с плеера Shorts."; +"HideShortsMore" = "Скрыть кнопку «⋮»"; +"HideShortsMoreDesc" = "Скрывает кнопку «Еще» (⋮) с плеера Shorts. Данное меню также доступно долгим нажатием по экрану."; +"HideShortsSubscriptions" = "Скрыть «Подписки»"; +"HideShortsSubscriptionsDesc" = "Скрывает кнопку «Подписки», появляющуюся при остановке воспроизведения."; +"HideShortsLike" = "Скрыть кнопку «Лайк»"; +"HideShortsLikeDesc" = "Скрывает кнопку лайка с плеера Shorts."; +"HideShortsDislike" = "Скрыть кнопку «Дизлайк»"; +"HideShortsDislikeDesc" = "Скрывает кнопку дизлайка с плеера Shorts."; +"HideShortsComments" = "Скрыть кнопку «Комментарии»"; +"HideShortsCommentsDesc" = "Скрывает кнопку комментариев с плеера Shorts."; +"HideShortsRemix" = "Скрыть кнопку «Ремикс»"; +"HideShortsRemixDesc" = "Скрывает кнопку для создания ремикса с плеера Shorts."; +"HideShortsShare" = "Скрыть кнопку «Поделиться»"; +"HideShortsShareDesc" = "Скрывает кнопку поделиться с плеера Shorts."; +"HideShortsAvatars" = "Скрыть аватарку"; +"HideShortsAvatarsDesc" = "Скрывает аватарку пользователя в правом нижнем углу."; +"HideShortsThanks" = "Скрыть «Суперспасибо»"; +"HideShortsThanksDesc" = "Скрывает кнопку отправки доната (суперспасибо) с плеера Shorts."; +"HideShortsChannelName" = "Скрыть название канала"; +"HideShortsChannelNameDesc" = "Скрывает название канала и кнопку «Подписаться» с плеера Shorts."; +"HideShortsDescription" = "Скрыть описание ролика"; +"HideShortsDescriptionDesc" = "Скрывает описание ролика, отображающееся под названием канала."; +"HideShortsAudioTrack" = "Скрыть аудиодорожку"; +"HideShortsAudioTrackDesc" = "Скрывает информацию об аудиодорожке в нижней части плеера."; + +"Startup" = "Начальная страница"; +"Home" = "Главная"; +"Explore" = "Навигация"; +"ShortsTab" = "Shorts"; +"Subscriptions" = "Подписки"; +"Library" = "Библиотека"; +"Warning" = "Внимание"; +"TabIsHidden" = "Скрытая вкладка не может быть выбрана в качестве начальной страницы"; + "Version" = "Версия"; "About" = "О твике"; "Credits" = "Авторы"; "Developer" = "Разработчик твика"; +"Advanced" = "Расширенный режим"; +"ResetSettings" = "Сбросить настройки твика"; +"ResetMessage" = "Данное действие сбросит настройки YTLite к значениям по умолчанию и закроет YouTube.\n\nУверены, что хотите продолжить?"; +"Yes" = "Да"; +"No" = "Нет"; diff --git a/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings new file mode 100644 index 0000000..1458566 --- /dev/null +++ b/layout/Library/Application Support/YTLite.bundle/zh-Hans.lproj/Localizable.strings @@ -0,0 +1,136 @@ +"General" = "常规"; +"RemoveAds" = "移除广告"; +"RemoveAdsDesc" = "删除程序内的广告"; +"BackgroundPlayback" = "后台播放"; +"BackgroundPlaybackDesc" = "启用后台播放"; + +"Navbar" = "导航栏"; +"RemoveCast" = "隐藏投射按钮"; +"RemoveCastDesc" = "从导航栏中隐藏投射按钮"; +"RemoveNotifications" = "隐藏通知按钮"; +"RemoveNotificationsDesc" = "从导航栏中隐藏通知按钮"; +"RemoveSearch" = "隐藏搜索按钮"; +"RemoveSearchDesc" = "从导航栏中隐藏搜索按钮"; +"StickyNavbar" = "Sticky Navigation bar"; +"StickyNavbarDesc" = "Pins the Navigation bar so that it remains visible when scrolling down."; +"NoSubbar" = "Hide Subbar"; +"NoSubbarDesc" = "Hides Subbar (All, New to you, Live etc.) under the Navigation bar."; +"NoYTLogo" = "Remove YouTube logo"; +"NoYTLogoDesc" = "Removes YouTube logo in the Navigation bar."; + +"Overlay" = "Overlay"; +"HideAutoplay" = "Hide Autoplay switch"; +"HideAutoplayDesc" = "Hides Autoplay switch from the overlay."; +"HideSubs" = "Hide Subtitles button"; +"HideSubsDesc" = "Hides Subtitles button from the overlay."; +"NoHUDMsgs" = "Hide HUD Messages"; +"NoHUDMsgsDesc" = "Hides all feature messages from the player. Example: CC is turned on/off, Video loop is on, etc."; +"HidePrevNext" = "Hide Previous and Next buttons"; +"HidePrevNextDesc" = "Hides Previous and Next video buttons from overlay."; +"ReplacePrevNext" = "Fast forward and Rewind buttons"; +"ReplacePrevNextDesc" = "Replaces Previous and Next video buttons to Fast forward and Rewind buttons in overlay."; +"NoDarkBg" = "Remove dark background"; +"NoDarkBgDesc" = "Removes overlay dark background."; +"NoEndScreenCards" = "Hide End screens hover cards"; +"NoEndScreenCardsDesc" = "Hides End screens (thumbnails) at the end of videos."; +"NoFullscreenActions" = "Disable fullscreen actions"; +"NoFullscreenActionsDesc" = "Disables actions panel in fullscreen mode."; +"NoRelatedVids" = "No related videos in overlay"; +"NoRelatedVidsDesc" = "Removes related videos displayed in the overlay by swiping up."; +"NoPromotionCards" = "Hide Paid Promotion cards"; +"NoPromotionCardsDesc" = "Hides \"Includes Paid Promotions\" card in promotions included videos."; +"NoWatermarks" = "Hide Watermarks"; +"NoWatermarksDesc" = "Hides channel watermarks from the player."; + +"Player" = "Player"; +"Miniplayer" = "Enable mini player"; +"MiniplayerDesc" = "Enables the mini player for videos that were not originally designed for it, such as videos targeted for children."; +"DisableAutoplay" = "Disable Autoplay videos"; +"DisableAutoplayDesc" = "Prevents video playback after opening."; +"NoContentWarning" = "Skip content warning"; +"NoContentWarningDesc" = "Skips sensitive content warning message."; +"ClassicQuality" = "Classic video quality"; +"ClassicQualityDesc" = "Brings back classic video quality selection menu."; +"DontSnap2Chapter" = "Disable snap to chapter"; +"DontSnap2ChapterDesc" = "Disables skipping to the next episode by double-tap gesture."; +"RedProgressBar" = "Red progress bar"; +"RedProgressBarDesc" = "Brings back red progress bar."; +"NoHints" = "Disable hints"; +"NoHintsDesc" = "Disables hints by author which appears at the top-right corner during playback."; +"NoFreeZoom" = "Disable free zoom gesture"; +"NoFreeZoomDesc" = "Disables new free zoom gestures."; +"ExitFullscreen" = "Exit fullscreen mode on finish"; +"ExitFullscreenDesc" = "Exits fullscreen mode at the end of video playback."; +"NoDoubleTap2Seek" = "Disable double tap to seek"; +"NoDoubleTap2SeekDesc" = "Disables double tap to seek gesture."; + +"Tabbar" = "选项卡栏"; +"RemoveLabels" = "移除标签"; +"RemoveLabelsDesc" = "删除选项卡标签"; +"ReExplore" = "Replace Shorts tab with Explore tab"; +"ReExploreDesc" = "Shows Explore tab instead of Shorts tab as on old YouTube versions."; +"HideShortsTab" = "隐藏短视频"; +"HideShortsTabDesc" = "从选项卡栏中隐藏短视频"; +"HideSubscriptionsTab" = "隐藏订阅内容"; +"HideSubscriptionsTabDesc" = "从选项卡栏中隐藏订阅内容"; +"HideUploadButton" = "隐藏上传按钮"; +"HideUploadButtonDesc" = "从选项卡栏中隐藏上传按钮"; +"HideLibraryTab" = "隐藏媒体库"; +"HideLibraryTabDesc" = "从选项卡栏中隐藏媒体库"; + +"Shorts" = "Shorts"; +"HideShorts" = "Hide Shorts videos"; +"HideShortsDesc" = "Hides Shorts videos from Homepage, Recommended etc. (Not applied to Watch history)"; +"ShortsProgress" = "Enable progress bar"; +"ShortsProgressDesc" = "Displays progress bar in the Shorts overlay."; +"ResumeShorts" = "Don't start from Shorts tab"; +"ResumeShortsDesc" = "Prevents starting from Shorts videos at the opening app, which happens if YouTube was closed while watching Shorts."; +"HideShortsLogo" = "Hide Shorts logo"; +"HideShortsLogoDesc" = "Hides Shorts logo in the top left corner."; +"HideShortsSearch" = "Hide Search button"; +"HideShortsSearchDesc" = "Hides Search button from the Shorts overlay."; +"HideShortsCamera" = "Hide Camera button"; +"HideShortsCameraDesc" = "Hides Camera button from the Shorts overlay."; +"HideShortsMore" = "Hide More (⋮) button"; +"HideShortsMoreDesc" = "Hides More (⋮) button from the Shorts overlay. It's also accessible by long-pressing the screen."; +"HideShortsSubscriptions" = "Hide Subscriptions button"; +"HideShortsSubscriptionsDesc" = "Hides Subscriptions button which appears when Shorts paused."; +"HideShortsLike" = "Hide Like button"; +"HideShortsLikeDesc" = "Hides Like button from the Shorts overlay."; +"HideShortsDislike" = "Hide Dislike button"; +"HideShortsDislikeDesc" = "Hides Dislike button from the Shorts overlay."; +"HideShortsComments" = "Hide Comments button"; +"HideShortsCommentsDesc" = "Hides Comments button from the Shorts overlay."; +"HideShortsRemix" = "Hide Remix button"; +"HideShortsRemixDesc" = "Hides Remix button from the Shorts overlay."; +"HideShortsShare" = "Hide Share button"; +"HideShortsShareDesc" = "Hides Share button from the Shorts overlay."; +"HideShortsAvatars" = "Hide channels avatar"; +"HideShortsAvatarsDesc" = "Hides profile picture in the bottom right corner."; +"HideShortsThanks" = "Hide Superthanks button"; +"HideShortsThanksDesc" = "Hides Superthanks (Donate) button from the Shorts overlay."; +"HideShortsChannelName" = "Hide Channel name"; +"HideShortsChannelNameDesc" = "Hides Channel name and Subscribe button from the Shorts overlay."; +"HideShortsDescription" = "Hide Description"; +"HideShortsDescriptionDesc" = "Hides Shorts description under channel name."; +"HideShortsAudioTrack" = "Hide AudioTrack"; +"HideShortsAudioTrackDesc" = "Hides AudioTrack under Shorts description."; + +"Startup" = "Startup page"; +"Home" = "Home"; +"Explore" = "Explore"; +"ShortsTab" = "Shorts"; +"Subscriptions" = "Subscriptions"; +"Library" = "Library"; +"Warning" = "Warning"; +"TabIsHidden" = "Hidden tab cannot be selected as startup page"; + +"Version" = "版本"; +"About" = "关于"; +"Credits" = "信息"; +"Developer" = "YTLite开发者"; +"Advanced" = "Advanced mode"; +"ResetSettings" = "Reset YTLite settings"; +"ResetMessage" = "This option will reset YTLite settings to default and close YouTube.\n\nAre you sure you want to continue?"; +"Yes" = "Yes"; +"No" = "No"; \ No newline at end of file diff --git a/packages/com.dvntm.ytlite_2.0_iphoneos-arm.deb b/packages/com.dvntm.ytlite_2.0_iphoneos-arm.deb new file mode 100644 index 0000000000000000000000000000000000000000..66d440d8c46ac92abcc4591ff0d082f7b1214f7e GIT binary patch literal 33136 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 nNrjKKE_lEyiS21)$eb6- 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

d)_pO2xO^`?lWGnTqPOt>r4Tma_ zGpJv&sjN)6cmC||^6M&Nk56RMWPHV2jE={87i7lmD_6iK!YN_Ld;DV8IRu}^b3h+F z?_eycv?tQi{}YAS{;#?=5+K^;i<_wlF61stql9QkEXyIKuG)T!5TC22tT&?JMku}$ za~)$xG)#OxAl*+pRtCUM%-TNfIg?`YMSwFy6H&s>Fly9f{ju}3yFJGao0_PERH`%J zrGdH`ab#>9?_uFRC$}h7{T&$s=~d{~7hHIW{%!UDYFXRbA*VVf&A*VTEXf zP17_`QP--zf+F%tPEb*oSCu)JZ1Hbe}rpn@0zbhUnMny&H zo4ha2%hi%+i2lAn3iP((%(l*NR2J^ux{b8V6XHOt{aJDJkLqfw1RkI*Bp=8X-{T19h3%!R1f(=4{mqCvhGo7sg+Inw~LyhO3_k4 zQOxx}d}79vGd(bsjUtGrvnWw-g)akpXYu|GvdN}Zrt#;pEz=@rK*X#x-uA0juA2OL ztj_x8=B%^OIAtx~164ulqj6zYKZhXjCKn*62abYFBuv2VCsHA77X36PnP;o3$xvyb z`?Iv);-ktWA(%$E>Ys?imvs4mhP^?w(fpS7j^)n;Q_`tH)##><#+C$jX;SP4qntYR zl^M2p{`Wx8C@Bf8A=)nr;~iynl$1jVo&HCUBs3M1&_zzkfha&SBV(?xsFA-qIUf`_1-$fL1Gn&$IVgUn@9ANFZ$aC*CRG zE~8#PG(?=`!=$w!ldl}Tb*H(juI;9jIF}d4W>)2{4rsju*r zmL_LBG%Y2D(5!|a3F{Opzb;S?E<5|FRu1To=_Ah|p+|y4l}S-Xw|k(u&o{2p>9jiz z>=~^yoC37Cc%$YSQ)0_7s=2C#)5C4MFHbG z2`{(VeJ`8&7G^hKY+&^X@T0juA%RD?V1*Brg@VkMTk!~+br#;)J02KBG0~4E_vH*Q z@Q~Z}XQ1Y_Dv0b3vw~Gc^i`BqHGoz`k0;-va=?)tyZY2hWhM^~3Tz^JbW=Jy5Jfc`9Do_0p|LZe@nfNF=$kqmz4AU>>L)^U`GeMOGkwQow1`Nj2@CPd*q;IhMrp61h>!TxT!A&) zCKbXZ_60%(UEY@(Uxx^MG1U&qXKew3523$M2u32N zUz}cp+b77!9D|PE%9{-TeT5h9ymGv4NNriJMMO+lVXU$bVGx$PsXL%*aQ+k-caRf% zGAFzaZU@u^j@Q$WucNiJh2tXHFR9|Z7}h+nea~DxfO5TWgO1JA z;!L3kbERU=qqV~Sbn^03l)vmyMd_H5!hC4i)w~Di(#ui6iWKJZy=yNCe*L_nxb^bE zhkZvVX@t-+D*1$&Y@(!Ee1S8J5BypW%@f9H!!u`F5=?DkoeL-asewETNpwmLoJYC1-glf;_J*M8|G$0l{$R&Z~7AiArksThYj+ zC^gfren(~eV!~d7FcA-~7iX=!p=>2zIz=`1ZSrkp60%&U@Z4 zg?q#>7vodkUSRu&$?En5F$|Xy4{jQ5^gPWQz2%{DsMfCi)QqKT>E-fPgJH?w5ig0^@mxLXj)Iy`F6gP`a#E`+I~KIE{2rF3O(ZwA zO3aWyLT#PaTJNOw&5FAPaz^ z`yO*`5)k6x=^~o=-c0qw>dZW{TIP)dn9cOX#~`W!7S@-HU%M~bEcq;!R}HmjU#!L{ zwMk}0v4Q2$K4=XAZIf`stOxA&MTm1~@tRxY$SjIvl6eXxio-D~6VzNqT1oyD{=%3- zVh0s`6E_@k5`fs2R2S@qaip3tMr#bhQ8Sd_CgzV@2@Q~V2b%Eb~#biC%+Df zoz|a%3=?H?A3P#!HjN=)KX#-~qNH4TGy8GaY_Vfhn~AtAOwIw=MpJ zz4w6(_%tgMzvtXQ5Due=K~Ek|^inb;Ei(sel0JUe!Wy8wTTt+lk#zQpM;MZkRiX5i zuT3a)n0$Rwk<3saU$E#&{z&glU>XCc$$G^WQkNSQcts);FVeL7Zvx@=H~Z>PpvP@P zger5mgFR9U^Xz|gUmcNpoi%($#Uww$u_C&hqi}+vr`SVh0K>J=r02R57z;}F-v4sk zaID)6CfsmV2pf;^=3IAf5t~%SlaJIN+ z-}2P7Wczb;=~yTdg3@l;DqhKFfGL3$9+?oWyRfl+EkNuH;^)41E2M&HW;;4Y@z0B1AXOpg4-id+lxfIZ80 zButJ&=CGc~T0d?v(B!-9;>8ED;px*wXH!WjXnJI&aYeu$yq9-M8@Vi~WE;TLi(;v9nH`t5N+$mvrTWzWe$}bkTV%h5!NLV?drh%_HRi9s7u3-RVVkcdeaV z^v&MlCCBY;04d*_b1qZ$IY?Zcp&XAoB=jVTgF;vC#%E}NCt{}*^Z*ctcB-0A`qlFJ zpcGddFwd$}-zN)4eJA|Cg~1_7DG`14Jw$&|e>)5O-$SW*7~Ruewf4wB$O@85CeP1i zqsSdDuvWq;zS@c#k)@wW-V5d=-A`ZBYY$AZe(o73iN`Iws6IA5_?r!-qTQ3??H!GZ zz!)uW*T&O8HTsTGW|VFJz!vEo#w^ChCboX(6F9<8r&*kdzW8-u z-k+#>J|C4BM?oK@OB8DnN&ykRRKmYu9IHFc0YQ-aF6{d~vBmZ$;q}QR7AlKd<7>Ry z5qDV0>;n$$wWxL4Q1;=Qcw?2l2#nd+W9AK1J3sh9*0cZ%%(1JwnfWL8TNYG z14hZbc>i}p_}14654^g+r3~(5xtCJq(4WpsK5JrDsYaLYss4uKk`0d4cI0=?dF%B+ zoAiMm7mz3{x|-(KkQ>IxdB1$ACJx@RhD3L&Z4W$wN6wALC{LLaw6iJgwy*QQ?)uFk zz5baPOPpHQaq?S>Atb7u-C1dJq1>aU>G>A?V|lng-fApy0T@iKC_2^f@P$++Df+sp zO%xk@gy5Rf*x3jf0&5&g*tI)mU+fa8ud45qzB2c& zcFZ=dl8ql`ha1%y(LNdnl%vslveNZ`%EgJKE6U48QSimjPrdLTZ2{0cH#F>)=&5Qo zG6+0(V$Hfqw&@W}y#bB72N3ML`}LuVVNk+3!IJTq>de57LY-9?p=bw{Rk5I!f#@&T zlc4@RK8h&?Yy?iAN;y1~kTDW*%_pd7b-}#%9pTD4eE`1d^!XDgvgf-bxVOewWa4GvO-ne42ZzalFftfq2a(4?I2)3*U(n)#N>pkO`GSA58mILsxJ1#<~7l4kK5z zFcdwdJh#5#uDts`+K?^1d=+`G#EmakLikLKm6Vt}0=`k0PEten4#U^r8-z92* z{>*HVG*P-el8LS$L*52(Cg?<#P=8sv@M(eoXO)<3jjvk6Dc-2C{#aH`Z5TSVa$d5& zy3UKMzW6$_tL_&C=J3Gz16JR}nG}Q0_Rc)XN*8zV^Bqbfu@rXy5kGzUAh~91cTkd8 zS8Ag15LEhcmqas({vr>e8;BRsClHQd{l_+|X((ej5@L9}qDW?7)OAg<=V%8CC5b`b$-E29`Z==2Ay<-o{GX|(!FS~KW zKnE%BB81&%D^k|o)fLb7GW+m?#RrP^=R;`lv#I5d1VmPf<0CWP4h4sUoWgK8LNZem z-hns-CyFa-ySw240?2we%1+D%R#lcAf|a@MV4eccwBE@6Nt?|Tk@mQnu&9C86qtSf z4>%?{Vo)yWz}G2E2khl;9h5_tD12e%Jns6c4cY$JY!Y=Q>Lr})>vIyYOR^c?Sn5@T zZ`fKF#nn_vvzNO{C^QdqqKE^}#GpOMR&_fc?!CFBb|&e!mJRt2zZ=DF@S1sg(dha~ zqEa0a+50g^nHwr`9jjB?r!}hc&1L4zJDTtf#b`Z=oS+=nZ1GYP8L39W(jIYj;%Ky#F?4d0U_a z{v3|j3F7lY=DYd-w>WN>002bZ(B-KW!%%7(F#xYjDcj|t?(R_;zul}>Gg|)#^pU7= zOil%0v35#D(amfxT;>qoWC9$r5eu4>LYYiKC(AS4`accNYdpjY>$D=|2`sU zJa{&OK8{;$0`5x27jua5q_vRYWXG1!CEVn(p_<*O+<`7CnH@vG;pHs$XiEc{cuYPb zbkQHo_}3%#9!`(ntj1yeUx_1H&3upV|&@6)R^htx{;q z>}@(mAdvepnu>)x3ueVmtVB{EOrFz-!(QmpdvvO#1G42P^?2=BVPDc-*Jf@?20Yok z$ek!I$o>5B%4A`frobWD&!z66*M0zmyTjv?Ym<2Pu8hH@53_8&`AUL~b{6tYPaL+Q zk*Yi%#*Du3qwJekH_M?dvA{zenpjVv#>WDKQ^jetw=dX`x>i=U?rbLX2G|qK+Hl3a z{T{9UQwaBF*DSNx7e#bSELx|w3Ht?g-Q7@|fr1}cTJf0`uv#Xu(n}+KENjkxNas}* zFor(E3md29D&@0 z;Ur`t4m$lid=O;>ccm&i$F`}TB<;pEJqUb;OHFQ-VSu|%7&BRdRIf*T2M_(t-Oz1k zWv9RRMqMO*PpxA`ti=GnJdTEW|La3`wz8Gb+`2BL3Grx0Q4}bfi8d2PAQ?~?84yMt z-?t+IspBp?{vE4?r$Qomsvqy|Fb>+Hh=Y`y%vM%RXP0cV!^n=? zR4g(E6Xt%;`Z;=^!be*N8lQK$-FmNEbArpBr5gh;BRcqv5{?O98bsRbMn1st2j6fB zZ1F&dy^R|J2%Au;R?4tGnS(D;* zHYuHkXD~mwH$DQ=^L}iLkC1fFcXv(@PGfgwnf*1;!+#9YZPWwu%HsI|o6$d8YXPgh zV+q}3+sIEMhdEI?Ma>lfc*VJJCM)T|_anKyrSnt`Soag~KT{B|?b~%aY1Usv3o2Vd zaJLtJ>WFfBL2}JjjAsIBz)~X*rxLCOvA%wDA8z7HpJ=PAR*fgtv#KozP4@iO$NilL%oM8Qh`R3URC0ZNhA5c3ph|5)=_6|mST4zrKL_>o+YTK6T+AnL4`vwK zW-wgsMLiuBm(NuAWNdpE?Z=Q`qUrYuiU))pGSCP-IUgUQTU{Ax{A<=y)R`c)#tsB) zZWa1k%BBx;jJCKIEm#mq8ht-l^r6=3a*HZuj{?#JUtpSKm$w>eI3*%GFq-4f(I~Ii zX^!RO&0({4d-u~bEL1Ry30$HMzh0B`Lq^t@)ZZdA?cOB zbUR*Kny+lGWlNf_7hvAOrKwhpeErwa+B)KjNWJhE`AUwEs^`k#*LFXwpfkR~t-+bEB{!txC=fd=J ze>dj!Lw@n|{Ch!m$i)G7<4{?S+~kM{NeDsF_Ze(`P~^k8mifDbTJ6{I-YB1*vv&f# zXBQL4t+>#+;!MGdCJbMtrO|;;-IaDeJKt2NKt-ZhDu8}f3qoJT{Z)NcpAj00tY}hM zqoENURkGApyWp=S7NLW8d;?v@+U{H#_p&sas>8Ws5j?(#T zqEK7z8s}{~V;De_0EoOqU#BLg>_5i^BybqGF*;EPvY8h7PRKvkG+9uq)kK0solbh_ z8qcV(?enRwcFCd`MXV7}%Z*ony(lU9A>L>ZvJhMQ zs{OU2eGo?sF(57Y1ATZ_Wza7NfA*x_vb|nghGf`^zGp#Nl*$dq&)Hu$C9wk`7;o59 zV0zPt)r=Ce21@~)M^x|h%?gRe;&WZ+yRIx%FDz+WUOy-Q}F0 zx+C6dmN9rlFxp)%#}?9ToYfDW2M@GwB!vv5HaOd#-AwD5hugw$#$3xMhBPw}GY#Or&QA zF>tQ}c-B%zp&0e=jTCNSD1!o3Vm`CsgxOc(b%>z%?Js;C@0n#nDOV0m%v1A{Wq2kp zYi4^?V79fZRP?q3iOTUPX!j8^#gdw!EAsWLkOKoZu>j9Dy!E5_vlro--rC!yh4|72 zFh%Pdpy@Vh%HmAhStZ!EWINaJAgGjML6q&R5rRY0D`?%nG1B!kXZgDoxs zz#&C2AfXaoOv#6Lq=fKYtuB689#im-K%EGmI2mKGG-{QfD6D}Ua8w2JH0_v7{~~-$ z0&9JK?uP{f-6spSvmz!dqba{pXCh(Bje-<`dsjiHl!k)(mz7QZ zA+u-c0qVnIueH#?fO0}Qau`@(YXfs^IYB{F!e+`ui!&#e8Q#2~Kc zA>T>&%Fut0oVG=+#2^{%;YvfBGMMNCb79Xu3^o(wXkck!XA7p6gaf}cOT9|mT&lA? zu)#1&xWS>F3WX8Ih?Ib|AX8J0=Ml28F6^(fP>E%i{0h|1f|*Ag__?!nW`)9F+H5htDjre?$F28Fuw}=~{~6 z+^J+ksvcPV+~oP4paA)=0W;rp@|)1(F%Z}tHcOqks?vauK<-qEZPa1TM1_8e>ywk@ zC1IK#?rEWtzAi@x)~L^(@pw6wOXq!I==z1u@5YCvt=Kx`koSZ~AH8-AE8X9iQXO~~ zXGy-#48z(WW|T1CN82NqI`3qCrU718^#y+;?niq8l{2(Br1T zPk40xO=pwy{YEh8$TkRKBi6rHa&qP_F~C)*0j2{vWJ8%QG9Jw)`5HpL`A@gaCATB8 z!3F*>6-ZevXo~@V<_mC=D`F<9RE{t9t=E1x8Go74m4_v)u)2My^R7N=&;#&Ofh(mq zljEu&AJCGboI0jl1JAB+;868Fa9<+I zcgH*xv}QSWV#(A@7Pi92)k-*Vqr9`qSgAhWp^{FH<(9o7gmXjJm;}7LvY#(*MTw_KYgQhff($ccs9z)FHovz@v#L`dE&Ws%Ui~?do-g^=MXy z6o-R!!U?~sz$bzhUwwD$G8=*t%aX#Qi+65-Y6upv;%ocL_|mDE!RU4g^h2=ERY%v& z+S1wrTKej{q*SU zfHmP~Xnqack2e09b2W*oO()~RRcG6UG<%1olCOidLGT&93U2@>Zy#g<00B6NVG0qd zMcfU3>y@^=snug!dZeO0D~TQi-q4%cn#?qa8%n8>P9=r|1?zJd+Qwgq08?n;M}jD- zaMRiG$@p^6ECPUWBIs5^*>Z#-hJ#NEhiH6O4XX26 zX~bB>&9o9LAF{mvs|~nt}jyTAMW@w;|95_ zlxK6QX!G{uT)LVAXh&bKl?$9hsT!L-Fam*~5NE8V>j_WMB4uq?F-Oy~LIR%q_}U`W z&iVD|<#)IFr2zA}Hsx&fsVi7Zw{dAl?}+6krn!jL77!eWg8j)8sc~=YeK#g^I9}`)yg`@tf)w42gbOm8KXuN>HIGp~}x@ zsiw2XQ*y*C50bn(sPK-Oa-Lp#zF1m4=aR8chUrc?Vx($p`{qX{O*I>^=>u7)nUe_H z5~5^^ysPqpxl;2?*o<^7Z%x}stSw>yI05yZD(rW13u-?DkWOkPOH-mZhFA+yuN7C& zUWNnXxtf>3*N@!rY{d9w1)R-&c?O7mp04i`xIas=KbU$YPSS<7#8)U(EpHWS)D}Y$ z2@8w~=CAW-S$av_tA+hVQE9qm66PiJeXbkp{JhS18S;pg^?!<^Ox3hwyqfbU7H3Lo z(gaZ}TtwRTe4+8i;fa+eVA(WPyYg>(X_S?7MCh5oDnd{&B`;r!u3b`v)zRgCICd2H zJs6)JahMmjqD*tO$wOYTUyfV#+dz+T1qbb{a;Q(?=}2tTNiLTtN7d#@GH0bk?5x!^ z0@$|rP%EP<;gtyWlyf+x*N4dNs+HPW}TnLS# zvt;r=0a1Cq5~}ei=|X%}o!d#mWJfv+(CW)zksilAjt|WaBwM8wS0rg8YhwF0Yia}#o&~n7izSZYtl%<{(2^J9JL|owOXfMt{Pq2OM_8Vz64fU z9t!mno16hJG$$b_twXb_f-zoz1V}1|K*}8yBh4jd=aQB3h@{LH#@5BbI%S*O=_D~J z0`a)f%91}#Dzgl#s*QHYUy*3ylho!8*oq3?zF7sip9Nn+i_f_6lgMK`60Hp*V;0eV z+NC{vMLN9({4RkoORw3Jhxb<+^Db$-!Uhe<+gjmfJZ~+3zWsX}WU6wgnHyD|OK!lw zA!_nr?jrsv?Q%>&P{YNFo8ZX?XeFC}P5@kGV*?I2b$e9W$skThCrO?-%4DkHyo~TJ zpDjaz+-N;Zz%@5!p?tgW6l(H8rYd*=!xPq4!IA@+PeQj8ib~b#+drW+&XL_jChq1HkYmGLPS8=HQVz&g&L58K ztR};?N$uxKJ-B(CvnalfH(TuE!EXH&;U16v1|x$!dhb z7yb4PASByHFMv5z?$^fn)JCekB|a`R@P;=NR?m>H1NK4TfonH=HQ{~HS;dE3;SVv< z&y7#ONgCulFJfwxFZ-^*f34MA4P~}H9mDU{yx>I;_%TqOguMfX`b;d71vSn*;R9m^ z&$3{m;54lc4CZ`0AQtL}tO!MdqpHe;N!O5cj;&Yoy$T#eJZ5o|*C-^$-O9q?)H+RQBU(sSk*az#3#OauVMQ9o ztcR94PwkU^LS9h-3Bt$$I6&Od7j3B=4(kAPY*Htp|HR9a{NW8OE)WZ-JWIhaX zK*TgmN2z(*k6#EkX^r*>HWYD!*U#Mrq60(nq-5vxTaOIalhFW;du~AhouVoB_Xsrv zqpAJxx}xRP`!1Mwk!$nyz@S!3Mjo?F--B7D7UH?OJT`o3@R|?7P}lHZP86=U$ddzk z9)OPTc9e>1BA1T{t^tFtKnf|J9xt^u)Ky}3sD6~F8VfXWI{cgDjKS_wnrYVuvo&>>$lFA2zd(|@C9q)m>*E{r zz1MCcU1DP&65+vx+)!e)uNt+UtvzL{FVqTE8kq2xiOGF`dw4d(d` zFdpZ}g-MHGOl+u6z;0a1@PH+=hz+#wc<6Aa(2DkV+#|KIGahX$KUJ3814&9l2!??S z^%H_$$WZmgdCz-eURY}-b1x5kaV0b_;FE(0L`tl`=n z&kWO!cPivWb|OzUuk3H`MgR@5RNPulnGq;5Rb_Q$z7a_Y)B0Smp{i}_fngs5vB%6P zGKxhZI;wsW8Arg|n1tRUK{B%upGB(uDCvGtz+<~Azn!}O#JHf4Yd*340#E+c(7per zlAGr{hj^Mskais34V{HsZEDR!T}e@M)Ao{C>$-kB@)c!huQ*RA-KeEnvA{(@A`zY^ zO)l3*78%>gXdi~??o32cHkl1i9@Q(Y-XWjK<<~{E1q zf`1?nki|hPMR$>Q6S)<(N!T2>$nt)L*jokZMQc%C4XN4pSbvHQ%~8#jw*{4>RLCTP zgPP4C^-NUvK{i~%&01yj1&vAHDj^WE-A`h_scKr1FDxUzySom+HkHy&-eIQcVvr@l zNEg@Hs?DJ$oxTezq5@Fm!89Qyl39xKn1m-M*W1RGrL|@2=DA{nf*N1d)X-g66xW>E z!IL~1FbJd2MnO{{Fq%&Dx0k0ZqyQYM6$kkj%uG%XVH}Yskm2^RQ9Gq1t$yr8f{;U?H}4rHK{8P* zsTaxBe3^@MBS0=$(>WC{cg$|g*v!>Wz@DJLl^1CSRf00*3JW23CeDlS|*G?>NCm(fETfi=c_ z&eE4QN;7ECcc`0a%~@npP>G-l8*v}L`iYWzF5QOUh;mtu(bD;YBJYUEKEq{B&$GXo z873IqMx^Sb7v&OU_eHgw)Pn+x2JYpj9J4IB%&~^dJfKWgNS%=TCzM`-P`t|u-G`6K zLC@j%1P5KQtePdz&yp?B#!<^T!Coz`XnS}JxU4N&ojol5_V_epz8vB>iSmIDTD;Sy zG0|@441j=gf|NBAi5EL-?K>Qi=@MYHszSds z1NinJJ)KDxK?-Y0D*$-!6M)prd}dfbX5=1xgC|njDc+b7KNq4PZcr;Y8TNn}XhzQc zA>}1$bWB$xl>A41PK2_z*?uFM3aB=n8y*Ghz%50<24ShMF$E-z9TC!T`RPRNLB|8r4~13{}4 zkvqN94AU%34>uL{@;=TGJ)(phX#l2y{3A>Q5-pS1A$M8gn4(!C$}2h>Ig**nb~gTq zNT9N557uL!;%@Ii5yR$F$@p(;7c{*~;bCZr!0FMmj{zNeue+}YT2ralqXT$ar>}2m z35H(|5QdfZ9|B118^yy=_V1En?&?`$C>kWQOsmnLnFzgzFXe?RmEJn+lBr+Dq-o=H zouS_JM|w4>LCM0ZL^{)6XE+9A#JhwY;}l^}jTeD83K#BhauXu?_%W8k*}d8LvW8n% z96V1aTYr00J{AMPUc;;+aouL?D!18|zt1~xNXttyeTiC+q6!|vp*MYON5UPDqk18U z+D+9J*1VO5t_RvNC>(P#aLo-{izWU2EOQ#xMglxgg={r5vfE4VssGN+7>3mvo7s;> zrD2CDXi3E*6aC*jUv=){QrZ7m!R23GxhhR0Yd=h66$% z0@%ko;^jw*95#Og$?mfW7MrQlu@Ey&2%17EtELr-oxXMRnti}#G|1*V#}CGsi8s79 zWqnW)Tb^yww8@P1pjBD-zRVizWY5xB?tQ@M(Z zy?tx=b-Ov8l9>r#y%1CfiWG4*GHO08p3bW8?(cG_{ClF19omGH#ye?sU}7B2<@IOr zG`O;LnfCE#?!yXc*$?tHg|}SJ@pk}s8wxIg&`m=7y77&7VM;^bBEXcuses`7>pl$D za2b(0W~*TliP(@h{~jq!q~u?6J=J4(1dG9wTa}3QcACr~>@CtG*+^uuWJ#{w07N!!|$n1mE?~l zh&58G%k?!ZD{Xc)!oR-gJ`9JjYJW)@OVwu5E^bc=GeC)LaA5P(A!hmqd>2Mj@)MppVp+($NO3; znATz|)$7^DOcz@n$h8zvsFp8KcX@+{oFo~tCTV|(5oSJO4D_IU=IiHgbMiKdAs)j# zQ)Y-)N(V%7Q7j@(x^(qWZ&oG?SQcbms#&*ynIH9TyUwa?y5*y+LYLB>2JI1zv0d(EBFTjbQ~* zs;LR1J<*wq3ae6HYq!{EPD^#V4^;_)_k+-vSP?ogG}kmV8w(zeY_xY1lX z+BK{q>yitI_5)HNz$3de6^%WCupH913B^5Ot{lfjAeK{9S2Ol{DAh>K>ogquJG<5- zB`4hM^aX%Ti1I8;k4>}^TIy9pB3@L4fayr=+8=?5Cs85;dJS7G9fEx#CO994NF%Y? z^&3N5ia+<3oM_r!wQdF*r$UGS7Lm|}-A!C?Nl$^A@m;a&FsTAMzxQpViwx%q4{DL; z+wB7%vt|s$#FPj0H(6)>mr-!3g?nto{>Do_Le5tWHIA-Gry3sVWgm;Vyi(i;bi!H1 zU^%z)wKWomjj3f%vSh7|#GS1WPDutt3u_T?O3PtSJy!#_lxw-jb)-USySaP|wn;w) zkQO1a$iu;!xDP9BCx?a6TKNvi@zuEa^IkGPd%7|*4=K}UawyBg16)fC#3~t|W31g^ zVrc!7fSXL8Xy$%6_)4uyCqTP4-1Dk-J%GO0&5WAxUvK8hIkyYasWO46am@Y&XF@u0 zri{(`b;V1eB=3)(ExfzpP8QZ?x(H%6P^n|2arkV|l2JTm4GHj}C+C%APdH`(M1b5V z1kl&L^e|zKBT{u{*3rh-va7x=hAduNYEcUC!?WW?qKY!+r2IjgqXIQqD~=&*VHGx2 z$_nS5pID(m(O#hhpIt0u+_In<^}VOcbPB*_G8D%$LkUzD!(mA7TTJQ~Pr*t7?ut28 zTo}k9e!_c&kb8Lei$u_CiFT%Ccb13OWCr>uSLnE0bd$+SScA%uP9>*`Ybm`4k)DvN z*Ce0}Z7>SE0kpMqhz0O>d}bqAHhtsWorM@}4pL8@*NNj)l4TN(e++Yz%lm_xv1s#P z{nCUoZ@0!MeG2sq3&D5ydM$OU(vt*J;$AZ+^>{mJF2CSifXKF4m0}M?wrZVT92NqP zpMKn88Zrt@YM^V3I4&)p_uJ+|#q3wcD7Ilr!3M7srW8r1&wvRYK2s263T%vm{B`9vat#un{~oF17h884sR z8MkVOr$L!h3K8P^1n=_39ouL4nXu*u(;|mmAOgWg<|Ce?EzhpvML={lmfWudqZM}I z;)oNm#dmh7t{I&*?t700tuam~>$+KS8s%XEFD^b+YJw5}kjxEjep@ECNI9f;_)()( za?dwO9)Rd%R-_0m0$iDP(jiCA=TwbpYWhw89sQ zQ%hb*fT*R46~FyYY+OLopU((Ih+%}TPgm#C)@&SA?i_b5smm5A^IsB==h;u(h9pQR}ID{~j2d zK%wQE;g07V>2>Ez*dc#`p6i`PkCt&2=}?Gunc;^MStc8mlv%DGNcBS?NKco?)Vcca zXP?R=2d~U?$uIbr7_%dd^y}w55*w1U89cUX9GeZjRl~;jXl_jTJm|-QysI%6PJ$4q zG%LY{OG)k`UjH$rb0$hu>g{Eb(RWnapl)iPN?9IR)(E0B0@Nl4j;b_azHD0QHvDW2 z5C3EaPz{ooI$ZUy7ker72}WU4wr+V>S&a~UoP8VfTnH*1n-^Y(PWfQ-t%t2>_^ zWKL)M>gY#?t8Lt0t4G>?7vGyew~hO9{sP>`)3BG90Z0M2{?Q@EZHwz<<6xUYw16OB zPmdp@oJ~&#^agoX zd)ZtAJS@~P)2f_zZikHDQnY?cGHlIJ@}W3U!^xa_*rU2N*;cB=TQ!&1^Za%Y!&6=8 zPcGPU2A^G$NNj?jfxC8!-A;%516F=`f~Z9x{APZ%y033 z?@Z%wUsye(2IO@qfbOZ1i1EoIc>W?G?f(rB+EqK3q{$}((CUf_M9!~wjBaWF|C2*v EDbQV9EC2ui literal 0 HcmV?d00001