From e3c33adb01b0e7824ca4a3d89b13b70b23c7871d Mon Sep 17 00:00:00 2001 From: dayanch96 <38832025+dayanch96@users.noreply.github.com> Date: Sun, 18 Jun 2023 18:53:30 +0300 Subject: [PATCH] Initial release --- Makefile | 18 ++ Settings.x | 226 +++++++++++++++ YTLite.h | 41 +++ YTLite.plist | 13 + YTLite.x | 266 ++++++++++++++++++ control | 9 + .../YTLite.bundle/Info.plist | 24 ++ .../en.lproj/Localizable.strings | 30 ++ .../ru.lproj/Localizable.strings | 30 ++ .../com.dvntm.ytlite_1.0_iphoneos-arm.deb | Bin 0 -> 13972 bytes .../com.dvntm.ytlite_1.0_iphoneos-arm64.deb | Bin 0 -> 14018 bytes 11 files changed, 657 insertions(+) create mode 100644 Makefile create mode 100644 Settings.x create mode 100644 YTLite.h create mode 100644 YTLite.plist create mode 100644 YTLite.x create mode 100644 control create mode 100644 layout/Library/Application Support/YTLite.bundle/Info.plist create mode 100644 layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings create mode 100644 layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings create mode 100644 packages/com.dvntm.ytlite_1.0_iphoneos-arm.deb create mode 100644 packages/com.dvntm.ytlite_1.0_iphoneos-arm64.deb diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..03cdcce --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +ifeq ($(ROOTLESS),1) +THEOS_PACKAGE_SCHEME=rootless +endif + +DEBUG=0 +FINALPACKAGE=1 +ARCHS = arm64 +PACKAGE_VERSION = 1.0 +TARGET := iphone:clang:latest:11.0 + +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 + +include $(THEOS_MAKE_PATH)/tweak.mk diff --git a/Settings.x b/Settings.x new file mode 100644 index 0000000..bcdc53a --- /dev/null +++ b/Settings.x @@ -0,0 +1,226 @@ +#import "YTLite.h" + +@interface YTSettingsSectionItemManager (YTLite) +- (void)updateYTLiteSectionWithEntry:(id)entry; +@end + +static const NSInteger YTLiteSection = 789; + +NSBundle *YTLiteBundle() { + static NSBundle *bundle = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *tweakBundlePath = [[NSBundle mainBundle] pathForResource:@"YTLite" ofType:@"bundle"]; + if (tweakBundlePath) + bundle = [NSBundle bundleWithPath:tweakBundlePath]; + else + bundle = [NSBundle bundleWithPath:ROOT_PATH_NS("/Library/Application Support/YTLite.bundle")]; + }); + return bundle; +} + +// Settings +%hook YTAppSettingsPresentationData ++ (NSArray *)settingsCategoryOrder { + NSArray *order = %orig; + NSMutableArray *mutableOrder = [order mutableCopy]; + NSUInteger insertIndex = [order indexOfObject:@(1)]; + if (insertIndex != NSNotFound) + [mutableOrder insertObject:@(YTLiteSection) atIndex:insertIndex + 1]; + return mutableOrder; +} +%end + +%hook YTSettingsSectionController +- (void)setSelectedItem:(NSUInteger)selectedItem { + if (selectedItem != NSNotFound) %orig; +} +%end + +%hook YTSettingsSectionItemManager +%new +- (void)updatePrefsForKey:(NSString *)key enabled:(BOOL)enabled { + NSString *prefsPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"YTLite.plist"]; + NSMutableDictionary *prefs = [NSMutableDictionary dictionaryWithContentsOfFile:prefsPath]; + + if (!prefs) prefs = [NSMutableDictionary dictionary]; + + [prefs setObject:@(enabled) forKey:key]; + [prefs writeToFile:prefsPath atomically:NO]; + + CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("com.dvntm.ytlite.prefschanged"), NULL, NULL, YES); +} + +%new(v@:@) +- (void)updateYTLiteSectionWithEntry:(id)entry { + NSMutableArray *sectionItems = [NSMutableArray array]; + Class YTSettingsSectionItemClass = %c(YTSettingsSectionItem); + YTSettingsViewController *settingsViewController = [self valueForKey:@"_settingsViewControllerDelegate"]; + + YTSettingsSectionItem *general = [YTSettingsSectionItemClass itemWithTitle:LOC(@"General") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RemoveAds") + titleDescription:LOC(@"RemoveAdsDesc") + accessibilityIdentifier:nil + switchOn:kNoAds + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"noAds" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"BackgroundPlayback") + titleDescription:LOC(@"BackgroundPlaybackDesc") + accessibilityIdentifier:nil + switchOn:kBackgroundPlayback + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"backgroundPlayback" enabled:enabled]; + return YES; + } + settingItemId:0] + ]; + + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"General") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:general]; + + YTSettingsSectionItem *navbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Navbar") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RemoveCast") + titleDescription:LOC(@"RemoveCastDesc") + accessibilityIdentifier:nil + switchOn:kNoCast + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"noCast" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RemoveNotifications") + titleDescription:LOC(@"RemoveNotificationsDesc") + accessibilityIdentifier:nil + switchOn:kNoNotifsButton + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeNotifsButton" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RemoveSearch") + titleDescription:LOC(@"RemoveSearchDesc") + accessibilityIdentifier:nil + switchOn:kNoSearchButton + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeSearchButton" enabled:enabled]; + return YES; + } + settingItemId:0] + ]; + + 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]; + + YTSettingsSectionItem *tabbar = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Tabbar") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @"‣"; + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"RemoveLabels") + titleDescription:LOC(@"RemoveLabelsDesc") + accessibilityIdentifier:nil + switchOn:kRemoveLabels + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeLabels" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HideShortsTab") + titleDescription:LOC(@"HideShortsTabDesc") + accessibilityIdentifier:nil + switchOn:kRemoveShorts + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeShorts" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HideSubscriptionsTab") + titleDescription:LOC(@"HideSubscriptionsTabDesc") + accessibilityIdentifier:nil + switchOn:kRemoveSubscriptions + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeSubscriptions" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HideUploadButton") + titleDescription:LOC(@"HideUploadButtonDesc") + accessibilityIdentifier:nil + switchOn:kRemoveUploads + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeUploads" enabled:enabled]; + return YES; + } + settingItemId:0], + [YTSettingsSectionItemClass switchItemWithTitle:LOC(@"HideLibraryTab") + titleDescription:LOC(@"HideLibraryTabDesc") + accessibilityIdentifier:nil + switchOn:kRemoveLibrary + switchBlock:^BOOL (YTSettingsCell *cell, BOOL enabled) { + [self updatePrefsForKey:@"removeLibrary" enabled:enabled]; + return YES; + } + settingItemId:0] + ]; + + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"Tabbar") pickerSectionTitle:nil rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:tabbar]; + + YTSettingsSectionItem *ps = [%c(YTSettingsSectionItem) itemWithTitle:@"PoomSmart" titleDescription:@"YouTube-X, YTNoPremium, YouTubeHeaders" accessibilityIdentifier:nil detailTextBlock:nil selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + return [%c(YTUIUtils) openURL:[NSURL URLWithString:@"https://github.com/PoomSmart/"]]; + }]; + + 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 *version = [YTSettingsSectionItemClass itemWithTitle:LOC(@"Version") + accessibilityIdentifier:nil + detailTextBlock:^NSString *() { + return @(OS_STRINGIFY(TWEAK_VERSION)); + } + selectBlock:^BOOL (YTSettingsCell *cell, NSUInteger arg1) { + NSArray *rows = @[ps, dayanch96]; + + YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"About") pickerSectionTitle:LOC(@"Credits") rows:rows selectedItemIndex:NSNotFound parentResponder:[self parentResponder]]; + [settingsViewController pushViewController:picker]; + return YES; + }]; + [sectionItems addObject:version]; + + [settingsViewController setSectionItems:sectionItems forCategory:YTLiteSection title:@"YTLite" titleDescription:nil headerHidden:NO]; +} + +- (void)updateSectionForCategory:(NSUInteger)category withEntry:(id)entry { + if (category == YTLiteSection) { + [self updateYTLiteSectionWithEntry:entry]; + return; + } %orig; +} +%end \ No newline at end of file diff --git a/YTLite.h b/YTLite.h new file mode 100644 index 0000000..4824381 --- /dev/null +++ b/YTLite.h @@ -0,0 +1,41 @@ +#import +#import +#import +#import "../YouTubeHeader/YTIPivotBarSupportedRenderers.h" +#import "../YouTubeHeader/YTIPivotBarRenderer.h" +#import "../YouTubeHeader/YTISectionListRenderer.h" +#import "../YouTubeHeader/YTQTMButton.h" +#import "../YouTubeHeader/YTSettingsViewController.h" +#import "../YouTubeHeader/YTSettingsSectionItem.h" +#import "../YouTubeHeader/YTSettingsSectionItemManager.h" +#import "../YouTubeHeader/YTSettingsPickerViewController.h" +#import "../YouTubeHeader/YTUIUtils.h" + +extern NSBundle *YTLiteBundle(); + +static inline NSString *LOC(NSString *key) { + NSBundle *tweakBundle = YTLiteBundle(); + return [tweakBundle localizedStringForKey:key value:nil table:nil]; +} + +BOOL kNoAds; +BOOL kBackgroundPlayback; +BOOL kNoCast; +BOOL kNoNotifsButton; +BOOL kNoSearchButton; +BOOL kRemoveLabels; +BOOL kRemoveShorts; +BOOL kRemoveSubscriptions; +BOOL kRemoveUploads; +BOOL kRemoveLibrary; + +@interface YTPivotBarView : UIView +@end + +@interface YTPivotBarItemView : UIView +@end + +@interface YTRightNavigationButtons : UIView +@property (nonatomic, strong) YTQTMButton *notificationButton; +@property (nonatomic, strong) YTQTMButton *searchButton; +@end diff --git a/YTLite.plist b/YTLite.plist new file mode 100644 index 0000000..d036024 --- /dev/null +++ b/YTLite.plist @@ -0,0 +1,13 @@ + + + + + Filter + + Bundles + + com.google.ios.youtube + + + + diff --git a/YTLite.x b/YTLite.x new file mode 100644 index 0000000..a4bb1b2 --- /dev/null +++ b/YTLite.x @@ -0,0 +1,266 @@ +#import "YTLite.h" + +// YouTube-X (https://github.com/PoomSmart/YouTube-X/) +// Background Playback +%hook YTIPlayabilityStatus +- (BOOL)isPlayableInBackground { return kBackgroundPlayback ? YES : NO; } +%end + +%hook MLVideo +- (BOOL)playableInBackground { return kBackgroundPlayback ? YES : NO; } +%end + +// Disable Ads +%hook YTIPlayerResponse +- (BOOL)isMonetized { return kNoAds ? NO : YES; } +%end + +%hook YTDataUtils ++ (id)spamSignalsDictionary { return kNoAds ? nil : %orig; } ++ (id)spamSignalsDictionaryWithoutIDFA { return kNoAds ? nil : %orig; } +%end + +%hook YTAdsInnerTubeContextDecorator +- (void)decorateContext:(id)context { if (!kNoAds) %orig; } +%end + +%hook YTAccountScopedAdsInnerTubeContextDecorator +- (void)decorateContext:(id)context { if (!kNoAds) %orig; } +%end + +BOOL isAd(YTIElementRenderer *self) { + if (self == nil) return NO; + if (self.hasCompatibilityOptions && self.compatibilityOptions.hasAdLoggingData) return YES; + NSString *description = [self description]; + if (([description containsString:@"brand_promo"] + || [description containsString:@"product_carousel"] + || [description containsString:@"product_engagement_panel"] + || [description containsString:@"product_item"]) && kNoAds) + return YES; + return NO; +} + +%hook YTSectionListViewController +- (void)loadWithModel:(YTISectionListRenderer *)model { + if (kNoAds) { + NSMutableArray *contentsArray = model.contentsArray; + NSIndexSet *removeIndexes = [contentsArray indexesOfObjectsPassingTest:^BOOL(YTISectionListSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + YTIItemSectionRenderer *sectionRenderer = renderers.itemSectionRenderer; + YTIItemSectionSupportedRenderers *firstObject = [sectionRenderer.contentsArray firstObject]; + return firstObject.hasPromotedVideoRenderer || firstObject.hasCompactPromotedVideoRenderer || firstObject.hasPromotedVideoInlineMutedRenderer || isAd(firstObject.elementRenderer); + }]; + [contentsArray removeObjectsAtIndexes:removeIndexes]; + } %orig; +} +%end + +// NOYTPremium (https://github.com/PoomSmart/NoYTPremium) +// Alert +%hook YTCommerceEventGroupHandler +- (void)addEventHandlers {} +%end + +// Full-screen +%hook YTInterstitialPromoEventGroupHandler +- (void)addEventHandlers {} +%end + +%hook YTPromosheetEventGroupHandler +- (void)addEventHandlers {} +%end + +%hook YTPromoThrottleController +- (BOOL)canShowThrottledPromo { return NO; } +- (BOOL)canShowThrottledPromoWithFrequencyCap:(id)arg1 { return NO; } +- (BOOL)canShowThrottledPromoWithFrequencyCaps:(id)arg1 { return NO; } +%end + +%hook YTIShowFullscreenInterstitialCommand +- (BOOL)shouldThrottleInterstitial { return YES; } +%end + +// "Try new features" in settings +%hook YTSettingsSectionItemManager +- (void)updatePremiumEarlyAccessSectionWithEntry:(id)arg1 {} +%end + +// Survey +%hook YTSurveyController +- (void)showSurveyWithRenderer:(id)arg1 surveyParentResponder:(id)arg2 {} +%end + +// Statement banner +%hook YTPremiumSeasonCardCellController +- (void)setCell:(id)arg1 { arg1 = NULL; %orig; } +%end + +%hook YTPremiumSeasonCardView +- (long long)accessibilityElementCount { return 0; } +%end + +// Navbar Stuff +// Disable Cast +%hook MDXPlaybackRouteButtonController +- (BOOL)isPersistentCastIconEnabled { return kNoCast ? NO : YES; } +- (void)updateRouteButton:(id)arg1 { if (!kNoCast) %orig; } +- (void)updateAllRouteButtons { if (!kNoCast) %orig; } +%end + +%hook YTSettings +- (void)setDisableMDXDeviceDiscovery:(BOOL)arg1 { %orig(kNoCast); } +%end + +// Hide Cast, Notifications and Search Buttons +%hook YTRightNavigationButtons +- (void)layoutSubviews { + %orig; + if (kNoCast && self.subviews.count > 1 && [self.subviews[1].accessibilityIdentifier isEqualToString:@"id.mdx.playbackroute.button"]) self.subviews[1].hidden = YES; // Hide icon immediately + if (kNoNotifsButton) self.notificationButton.hidden = YES; + if (kNoSearchButton) self.searchButton.hidden = YES; +} +%end + +// Remove Tabs +%hook YTPivotBarView +- (void)setRenderer:(YTIPivotBarRenderer *)renderer { + NSMutableArray *items = [renderer itemsArray]; + + NSDictionary *identifiersToRemove = @{ + @"FEshorts": @(kRemoveShorts), + @"FEsubscriptions": @(kRemoveSubscriptions), + @"FEuploads": @(kRemoveUploads), + @"FElibrary": @(kRemoveLibrary) + }; + + for (NSString *identifier in identifiersToRemove) { + BOOL shouldRemoveItem = [identifiersToRemove[identifier] boolValue]; + NSUInteger index = [items indexOfObjectPassingTest:^BOOL(YTIPivotBarSupportedRenderers *renderers, NSUInteger idx, BOOL *stop) { + if ([identifier isEqualToString:@"FEuploads"]) { + return shouldRemoveItem && [[[renderers pivotBarIconOnlyItemRenderer] pivotIdentifier] isEqualToString:identifier]; + } else { + return shouldRemoveItem && [[[renderers pivotBarItemRenderer] pivotIdentifier] isEqualToString:identifier]; + } + }]; + + if (index != NSNotFound) { + [items removeObjectAtIndex:index]; + } + } %orig; +} +%end + +// Hide Tab Labels +BOOL hasHomeBar = NO; +CGFloat pivotBarViewHeight; + +%hook YTPivotBarView +- (void)layoutSubviews { + %orig; + pivotBarViewHeight = self.frame.size.height; +} +%end + +%hook YTPivotBarItemView +- (void)layoutSubviews { + %orig; + + CGFloat pivotBarAccessibilityControlWidth; + + if (kRemoveLabels) { + for (UIView *subview in self.subviews) { + if ([subview isKindOfClass:NSClassFromString(@"YTPivotBarItemViewAccessibilityControl")]) { + pivotBarAccessibilityControlWidth = CGRectGetWidth(subview.frame); + break; + } + } + + for (UIView *subview in self.subviews) { + if ([subview isKindOfClass:NSClassFromString(@"YTQTMButton")]) { + for (UIView *buttonSubview in subview.subviews) { + if ([buttonSubview isKindOfClass:[UILabel class]]) { + [buttonSubview removeFromSuperview]; + break; + } + } + + UIImageView *imageView = nil; + for (UIView *buttonSubview in subview.subviews) { + if ([buttonSubview isKindOfClass:[UIImageView class]]) { + imageView = (UIImageView *)buttonSubview; + break; + } + } + + if (imageView) { + CGFloat imageViewHeight = imageView.image.size.height; + CGFloat imageViewWidth = imageView.image.size.width; + CGRect buttonFrame = subview.frame; + + if (@available(iOS 13.0, *)) { + UIWindowScene *mainWindowScene = (UIWindowScene *)[[[UIApplication sharedApplication] connectedScenes] anyObject]; + if (mainWindowScene) { + UIEdgeInsets safeAreaInsets = mainWindowScene.windows.firstObject.safeAreaInsets; + if (safeAreaInsets.bottom > 0) { + hasHomeBar = YES; + } + } + } + + CGFloat yOffset = hasHomeBar ? 15.0 : 0.0; + CGFloat xOffset = (pivotBarAccessibilityControlWidth - imageViewWidth) / 2.0; + + buttonFrame.origin.y = (pivotBarViewHeight - imageViewHeight - yOffset) / 2.0; + buttonFrame.origin.x = xOffset; + + buttonFrame.size.height = imageViewHeight; + buttonFrame.size.width = imageViewWidth; + + subview.frame = buttonFrame; + subview.bounds = CGRectMake(0, 0, imageViewWidth, imageViewHeight); + } + } + } + } +} +%end + +static void reloadPrefs() { + NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"YTLite.plist"]; + NSDictionary *prefs = [NSDictionary dictionaryWithContentsOfFile:path]; + + kNoAds = (prefs[@"noAds"] != nil) ? [prefs[@"noAds"] boolValue] : YES; + kBackgroundPlayback = (prefs[@"backgroundPlayback"] != nil) ? [prefs[@"backgroundPlayback"] boolValue] : YES; + kNoCast = [prefs[@"noCast"] boolValue] ?: NO; + kNoNotifsButton = [prefs[@"removeNotifsButton"] boolValue] ?: NO; + kNoSearchButton = [prefs[@"removeSearchButton"] boolValue] ?: NO; + kRemoveLabels = [prefs[@"removeLabels"] 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; + + NSDictionary *newSettings = @{ + @"noAds" : @(kNoAds), + @"backgroundPlayback" : @(kBackgroundPlayback), + @"noCast" : @(kNoCast), + @"removeNotifsButton" : @(kNoNotifsButton), + @"removeSearchButton" : @(kNoSearchButton), + @"removeLabels" : @(kRemoveLabels), + @"removeShorts" : @(kRemoveShorts), + @"removeSubscriptions" : @(kRemoveSubscriptions), + @"removeUploads" : @(kRemoveUploads), + @"removeLibrary" : @(kRemoveLibrary) + }; + + if (![newSettings isEqualToDictionary:prefs]) [newSettings writeToFile:path atomically:NO]; +} + +static void prefsChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { + reloadPrefs(); +} + +%ctor { + CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback)prefsChanged, CFSTR("com.dvntm.ytlite.prefschanged"), NULL, CFNotificationSuspensionBehaviorCoalesce); + reloadPrefs(); + %init; +} diff --git a/control b/control new file mode 100644 index 0000000..bcca9d9 --- /dev/null +++ b/control @@ -0,0 +1,9 @@ +Package: com.dvntm.ytlite +Name: YTLite +Depends: mobilesubstrate +Version: 0.0.1 +Architecture: iphoneos-arm +Description: Lightweight YouTube Enhancer +Maintainer: dvntm +Author: dvntm +Section: Tweaks diff --git a/layout/Library/Application Support/YTLite.bundle/Info.plist b/layout/Library/Application Support/YTLite.bundle/Info.plist new file mode 100644 index 0000000..fa80b7d --- /dev/null +++ b/layout/Library/Application Support/YTLite.bundle/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleShortVersionString + 1.0.0 + CFBundleIdentifier + com.dvntm.ytlite + CFBundleSignature + ???? + CFBundleInfoDictionaryVersion + 6.0 + CFBundleDevelopmentRegion + English + CFBundleExecutable + YTLite + CFBundlePackageType + BNDL + CFBundleVersion + 1.0 + NSPrincipalClass + YTLite + + diff --git a/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings new file mode 100644 index 0000000..56893ac --- /dev/null +++ b/layout/Library/Application Support/YTLite.bundle/en.lproj/Localizable.strings @@ -0,0 +1,30 @@ +"General" = "General"; +"RemoveAds" = "Remove ads"; +"RemoveAdsDesc" = "Removes in-app ads."; +"BackgroundPlayback" = "Background playback"; +"BackgroundPlaybackDesc" = "Enables background playback."; + +"Navbar" = "Navigation bar"; +"RemoveCast" = "Hide Cast button"; +"RemoveCastDesc" = "Hides Cast button from the Navigation bar."; +"RemoveNotifications" = "Hide Notifications button"; +"RemoveNotificationsDesc" = "Hides Notifications button from the Navigation bar."; +"RemoveSearch" = "Hide Search button"; +"RemoveSearchDesc" = "Hides Search button from the Navigation bar."; + +"Tabbar" = "Tab bar"; +"RemoveLabels" = "Remove labels"; +"RemoveLabelsDesc" = "Removes tab labels."; +"HideShortsTab" = "Hide Shorts tab"; +"HideShortsTabDesc" = "Hides Shorts tab from the Tab bar"; +"HideSubscriptionsTab" = "Hide Subscriptions tab"; +"HideSubscriptionsTabDesc" = "Hides Subscriptions tab from the Tab bar"; +"HideUploadButton" = "Hide Upload button"; +"HideUploadButtonDesc" = "Hides Upload button from the Tab bar"; +"HideLibraryTab" = "Hide Library tab"; +"HideLibraryTabDesc" = "Hides Library tab from the Tab bar"; + +"Version" = "Version"; +"About" = "About"; +"Credits" = "Credits"; +"Developer" = "YTLite developer"; \ 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 new file mode 100644 index 0000000..c05defb --- /dev/null +++ b/layout/Library/Application Support/YTLite.bundle/ru.lproj/Localizable.strings @@ -0,0 +1,30 @@ +"General" = "Основные"; +"RemoveAds" = "Убрать рекламу"; +"RemoveAdsDesc" = "Убирает рекламу в приложении."; +"BackgroundPlayback" = "Фоновое воспроизведение"; +"BackgroundPlaybackDesc" = "Активирует фоновое воспроизведение."; + +"Navbar" = "Панель навигации"; +"RemoveCast" = "Скрыть «Трансляция»"; +"RemoveCastDesc" = "Скрывает кнопку трансляции с панели навигации."; +"RemoveNotifications" = "Скрыть «Уведомления»"; +"RemoveNotificationsDesc" = "Скрывает кнопку уведомлений с панели навигации."; +"RemoveSearch" = "Скрыть «Поиск»"; +"RemoveSearchDesc" = "Скрвыает кнопку поиска с панели навигации."; + +"Tabbar" = "Панель вкладок"; +"RemoveLabels" = "Скрыть названия"; +"RemoveLabelsDesc" = "Скрывает названия вкладок."; +"HideShortsTab" = "Скрыть «Shorts»"; +"HideShortsTabDesc" = "Скрывает вкладку «Shorts» с панели вкладок."; +"HideSubscriptionsTab" = "Скрыть «Подписки»"; +"HideSubscriptionsTabDesc" = "Скрывает вкладку «Подписки» с панели вкладок."; +"HideUploadButton" = "Скрыть «Создать» (+)"; +"HideUploadButtonDesc" = "Скрывает кнопку «Создать» с панели вкладок."; +"HideLibraryTab" = "Скрыть «Библиотеку»"; +"HideLibraryTabDesc" = "Скрывает вкладку «Библиотека» с панели вкладок."; + +"Version" = "Версия"; +"About" = "О твике"; +"Credits" = "Авторы"; +"Developer" = "Разработчик твика"; diff --git a/packages/com.dvntm.ytlite_1.0_iphoneos-arm.deb b/packages/com.dvntm.ytlite_1.0_iphoneos-arm.deb new file mode 100644 index 0000000000000000000000000000000000000000..1ae10808448b7eb9d5e7910ed70d57f87bd8276a GIT binary patch literal 13972 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 Ni?p9*`(bXl{{>x#{8Rt{ literal 0 HcmV?d00001 diff --git a/packages/com.dvntm.ytlite_1.0_iphoneos-arm64.deb b/packages/com.dvntm.ytlite_1.0_iphoneos-arm64.deb new file mode 100644 index 0000000000000000000000000000000000000000..408d8a07ddf1e6c2dab590b0bc81b7ed9fc3f945 GIT binary patch literal 14018 zcmai)Ly#~G(45z{ZQHhO^IhAvZQHhO+qP|cH(&mwa?Mj+bDK-gWomi|c?=wl%=w^< zO$;pzY-tTGYz-Ve2nYxm**Mr48JIX&83+je(|`P*%E-XL#==5C@SpxK|Dc%Y7@&;o zY@HqLtm&K$9O=wF|Ns3=oXr2PA3q8LAdoc97zp?#dB!rB0b$H(R{0oIt#A~jo3=S@ zuoXoO$}8GIW5|-|qr6#uuX>Re<7s zEqtE!Dz94jkDZYI5Qa3NR6Y~_=IeOLZ4%fQ)yJDpHLU6h0{DD1rI@|tvOi?ggSyl| zNexyHQ#Ub)tIap~N>+|cr2y=)Si68!NvZLIsPfn2h=?*AK5<43N6H|RoQId`;Ifb3BgW1ed&KMig$DSWy)PB zJ(S#j@cvC+3Z}h_{8X7PLR&+|Gjpf}Mr2cU)CHIlMzQ=Z> z>-u*3p6ch0tay8(NJgL8G`^F(fDP#me}(+M$?+-OKoTepv=pkZcSz@YA>(I4P3~V8 z-(U2_H-gPq5c|L6C8A#6dW$G`kht1Bzdx66r2uf&KjiMr1&7eFnpiHjMo*Vb+sDtc zxG848yZlrV-EME`=U`O6P1Q4=?`Q=(AJV@*3Cw73w(cxpKz*aiCQ(XH5*8p%LfnKX zAleN|Rz7JY0NTduxK%q!2kALd-;4$7tbeJz;x*UCUs!SMXRWsEEeM*-v@a735oaUk zkdLsoO))AbG;?lZbJ=P00I!h}EAmL$<)UBcoiRjw+bdRD+oG*8nPfoZfu%X~=!SD_ za&{)Qe_;GTz4O({OvW@SzsF==^$n@RTTv787(8K7kl#%$&M+C%`;9fyOh#?O0eRYS zT9j0eI6DshKV%5svlVQM`tATVwfwt4P3q~g?JNFQ|AK)_5SxR5z$Lz+34*NV!8sV1 zZx)NlNqw!%vphM_dlyl_${|RMXpNtsKtIhHVZtcbt(92v)-35G^{6X!Oyj1fj(`|g zx?zx59eqBD)vOH(hI8a=Hf~U?qycWwX-D5^od_!13C(sv z)>V8ZqNxVzT|O+kKec4fQ*5%OJKb1(lFNlX;<77T#QLIyt8is``byn6)mQ+R=^6!< zgE;!@nlm|}(TCmlHT(t5EGrTH3r+iqLF+Ur@a=kl=4%&UNPAg2X$Q7nh|@99r4NK zco(%8(0goGNO6R7_4Qa{JS|!Ay@wBS2zJ2czM-_JhpTED6!QR&r#-<4ewR zBu5c)LF8IBSBVu+TIru1EA{n}@7e@O$~#z#<<{6xUSSoS);a!NG2$U!d$I(87j;6C z%^U+(;CMFG@E1&2hZb%Y7)%@2Aur;CgC;4&Vm3+nP5h=aORj${6wrYZWXvy zJc?-iQb;iCqg<=x{VMiuHX|M&qPMFC^yg7(9!F&6B>NLHQ=f_Dca((kV+@CA+7g)n(dNKTP~7-dpJQkpbyn$}i0n4pO|Y5^t&aeH zF)B16R1w8raZKyW;7kkd0sUZ z-4bk7sMTy-}y17SM&n0o&V?g$NKc|&11s^ri0FCMnR7OjqcaE zVg^2X2v=a>{4SNCFmeBGaP|v;t>+6l zaLiKm6$=F}9~=#;%bqOsfR9`xYP_UJXp-9v;SB4iDl_YM$R$reenfQJl`nKKS)U! zxD8zfGY~NP&XdL4r9E6<$_4hjjjqY`Ca%ChV(fmh`)AcCm(r&t-bpC<}de zv-^<9J)qxyYw~WJET++zIJmH8jP6+(h6fMJKnqSKWkd$VL8i5Dr@dwNZQzHuMvxy)rKoaS|MrnZWiH15Gby|+WE^Btq32b%{FUKg}ZfJ z0iE8D&P!_9!DC@)rF^~)x{4mGz!H%fj6BpHXc4aco>Cx;8>x{h8-)V;jt~5?fpmE{ zlD-?>kutX%Aac65bZTQldxdrs*r_0QIEwYWuX;CWAxxeq1^4ta+#86l?O_Jl(vSsXrXlOr# z9#U27GJ;5M$K zVRz%JL79Z?5GBANvdd%p{^VxEY!35(?V--dOg*H zywE58jYXzqSVnx{$uFh><<2IxpJ6Gj0yQ${$Y60+G*p&iLY53MhKi9{8&X&9ym(Lh zDW(ab;+%X1wYnyB(ZD)+T8=Ny`u?RCr(9nN%8EM~N{PXE2iw&#@5=4VbjA)g%kS#9 zg}Gc$0Ah^VEB7}))*6U^fTNps&dl&({)Q8by;j(GAJ}dwn$-B-N8%5h9=NVa@OOUy zs%?fR30Tx#r=f+sQ|+$>7|6h#l}cp_mSoIJf{;~q*QJaH(z%&n`uL@=SE&-)Th+`4 zJXBn9(GbJuR`%8n6T`z$RtM9pQZSor4acgd8Ke*oV4f@}faexHPGv0=lpaMfq3#sY z>imalnmjN$9CBV z>07|nxMrLtY`%IvN2aMUFby+^$PBLU0G)p-mi~${PwF?Jdu%y+;zt$tNH=x}RVygN z(&@Tr-}W%+f^*QrF@8F)sZ?}!{~9v+oQ}4o`U zyE%#na>q~aivqPx4&*act)A*P38PsfyV2*ML=<;jWI@Per1T2yrO2XvJA!~uS|4`@EoL*99{0dLCQ(VJek&gj z$Qr!(z~7VxQyR2jd$ZANN%0`CgOQ3%*T!zuKkeQFXvoNp(=%GLDL}g8qIQvWUrYDl z`GL9mE89U?NQ3wfM(}Q{RU|dP{{jx>ZC&ZoGJ}?jd<#3>81L`9`(EuHrx_x7H)n22 z=@o=IRL;v4x9>KQc!9_-5rgx}4dKhVsnC~`6z>!cI&&i~p^=|j-}S^!Ha0n{mj$6* zaBpZ>kQ#T@&hi-#yWLRH$&3h}JLsV!xn7*%aaCcL7ncHbWyMMa)9xz*R;Zu=0_+XA zOnic#3n!y`8)ICeTJJyk%#f|!O|!%LErt2Sw&(uEbCEBGXmz3Yf>z=fS=R5d*9B8W zx&)HUSq99X79vSIl-u)kHtFn$AAO}5L$p`&d$ERsjJuP0CA=y&9(vq0OYfK1CU-8M zbPnpzgrq;>h2TMf+tfnsOC&!Y{X9D(8ixHNu%t z=(fBS902^88T+5Y$4=KgBxXJ3WXP!-D$y_~S;jZIWgv_QTr*FaEAV)jcb;A*DA|ME zCS#i)eH1l6LLtF7C3^A16}vXA=n^cCFza)_kdsK^&p3y_j!yfhb)!Gv$#)m;^V#0s z9EcMt)8XOklVCqTWp&cFo$;q^m~rBUi%j^VLL3 zf~rYB{X2HkVzdESk33*<_~s7Z#*N{ffU*I^X`+F5eXtdTv=dXtq;&}S8YN)B^^t8F zk?@02C>cWw^hwi>*ko!IL~$a`r_Uuj+(ee~p)sC^sZ1wdBrzyIaAxT69g8-T-fCAh zw+7?EP7MLM#Cg%h2ijZMcyjkQojIwN1O!b{kF;hkGp-Dh8fkMBQ-Nzg)k-3}aZ+h1 zBK=!EHoPt{4@Ac%SMdXE|83a3IAI>?Jhv#;K$dD&31pr4;?{hLk?%c6uBh(`UwbyT z!D~-R8#hUn?%rCDIHKZ{8&(HLG+PxMHX6lPp%4r&YQ+;)V0cIq?1YC`VxdYk-x&gS z-6uCn2VqG=5r+9!T~Z!D!K!1nwbEY`aIursP6^*(a}ji#8qmV4BAD<};*@S_F9L|j zWzqjt?v%kU>Ii=Y9i9pe$%PK>eHg5+MS&rl7^!&i#<{09D7|Z>bcJq9UB|Ri8SaDY zoLB2vDP!vdXtk>FFZJA7NX-nzELf)Hv+K5VtOe*IWewn^DTF$uNP9*H=@ahhj-t{9 zBF9|_1c!>Lg>5}K)KdwPi6&FC9Tn||>1ifSX)=Pz_-8BaRLD zHc<@6CTj|wd}mczY}O)*Tx(hx0#_ItZP;Tk(yVL_JpitG&_WO0SMElB%tqE=xWHaP znw&!ME{e@P)>G*sp*$j}aSasg_HB|uC6=*~j>XHE;$TT^D6~FNbmBM5X#`*F0DwgF za*wr%Uu1c%_pqOFx`;719gke3LtXoaEYCTCglm+QM(&T64U(}w%);mNQFxS6y-6?w z;Y44cMJ;p#yEpAfEWDZ`-$`-U53MNq03yh4;PsoD^BzwlmDP9tqw!zn9UxbHvgbY~ zcN>8TjygNw4hc>MwkiTgD_{!qpNO89{P{kX7tl;6E-%TjWQxkn!4$VkxY94k6SvJf z+Bc6%j+@U|W_#}AOW2`K3M+of7#{>zhCMenQOZO_sG_%5B@X|}GUWHty~Be4jhv1u&p)#+MO`P={H{Lm z!K?eW1Z!fSkEK`bPxBVU9tzz}qZ=ueYmBl2X8yCUXy(XM61ZmE<%SkGGzSRT6cjX< zKeQA#shjF8e+|&vaOCiDm-4ojHW1Dq zdTX}yhI@&O3m_Pxf=A2O^}IZ}eWxpfwC6pHh;4dmP>*EGmjK~ERogPFItgREF6CDs zQTNG#Q#p87sGB)u6N*~)-dtc%y9=p+ZCP_7OdzJKlR$)GS|j>La?J)IezC(qnqQfc z{)+kJJQ66S)UQoosbXy={Y2VU{5~$SpFCH0FZ%+bV}tOfUd3mO3)fzf{P z{Y}b|dG9KyYtzOs8=dlHOy~EJ4+LN<%mF*8=OYEDOp3Rl1TrKn3PbC}|7KhF8${PC ze09>*Hk}6DQn7Gb)QJj~$QLJmr&1`+-mWqHf9_&Qv3$^WT_3XU*KMXrTd&YB?A9^; zCl2F;Sm9TarHK19rLsyOGP>7WNH<$$Hj&CJ8|jkIHXDw8 zWQg-z-W+HN5ADZZU3aC^XpzAzX|=yVo(?`xdJV=VM=>8u=LrHTAnsLY^e6$GFD)pV zk!6^bcs@{j8iN4yf9%zKE;iC497QqPJQ65?h#-_uy+7DXDc~Co6A|J0bqU9(J&HRK zaQL%^nT=kT_RSlv$I)s-;ai_f;A*~?wgfa#4%<_wRuT$=U{+`6dRID%sYwWypmifN zl%K9zp9RU--Pn|LQf79>zc5~0vS_*pnIBgQ;-5Wh26k$mYk!K%mfui1Q!=2&x4&+M zjfC?3OFGpAgSs{w@9_C8G9VX*@}y6Dv#ur47|ge6ww1FkUK|C`#)uC!SPG!*G>Hq7 zsZ7(6oP%-kay0b+mEkDna4#iu_Nk79KdfFgI%@n0#i)>Uk%no+^C}&eLRS;g5qh-k zA3cmgnDOFj{Dh^1Pp5IUC_Z6QlIaL%!IT>uj!C73$+{Ne0)cWqM=68Jx@!BR4%Q?J zv_6;{EN|`%H7OR9kHzJRjs_U=dzLyU(}i?xXDz6B>0z)sdSKgEvkjpyW~E020^((s zFGu5}50B36po%Lt!POpU>JP60v9l&Ul=Nmod~QL=S98Gwc8f+zwKRFSwm zeQTeueJ@Tku!!E&2ysDNpPFz9&z$e<7b6xAKIs?jFq!^acmRqqE#7tla4}5s#9U5n zn56OqoiV5!w#g^Eoj&*`y_;6zVwzAwJ}*&L>5yy;Y$I`4pm$m-Ynf*5f0Uw5&$JYa z8XDOnw+mV^E39aP*qer?o^kI=}(0*8;I0@H)>8(q>1%S z6BZqJ4AvZofO+_A2D4nnr!h;oQgLKcQk~H^s5h|LVJ)tCfPMX(T0qQmy5LIbCHRhQeY{2TFwFm&MQ&(O58d`v5}p&JZQ>L2Wb6x;7B<>ET@Rh!B3E9 zvYLL~ewO?K`(-*|p}FrJ)39R3;d9tl(4pAdxq1dgSonrqXk0Cm3FOV`K} zxB!}9rsMA?l5?KLp#X4yW>L&!i|3}Aq4{~slff4tNlM4IPa$8xr5pu!h%33-R&p^? zIovCl4#%TCQ?V!L1UOLW6{jI?1h=Kfe<=%u=n)FVWuO zN#5d}e^etR!y093cJ$0$d~RG1JJR^#LalaVHL1RuS=*dpvD;<>i)KKR`2P+=b zeq4%)6`>sRA4qPgoXO-jqK1xdz9HB;4YQpusN>4F*yxyVC8VokL|}+>H0Y8uU&;-^ zV#c*XbdcVl}XJWo72`>Z_HqRJ%MNW7nYG_8i2I1oHk{t68 zSV&Ql`RHAaO#UpM8b2U;nPriv+hnJK1coX)T^SvyKYEy{364+T+veP4EOnl-tOKrc@P&N4 z;)#5o(c^H+Rh^?#$rpSOb%<8U?MOa+#?4nnv8j+x}@QB+8V>ixW(4N}T z5&%!yrVd3KEe0!63CW<+Si78-ie*y~At-gTPgVG&GOQ_8mF#oK+x|#T-u|5Y^nXUC ztL5y)OKx5*DpCUasC$@*#jCG^n8$L;ag!koG@b#{dq@c@(e`5RwHOlZ>00G>KtZhoMbCNaJyzH(bG+IPk5etE7zrX*D=iX%Hp+cGJ&M8kxM$wD#v?!1$)n?}`ZD_v|TIAy1s;kRqzh zC4VPl6m#l+ZGj`Oy?|}m(S(PFQoqcqC4+ZB_rn&Pxr@MZ$P}9U=12lwAZ7;ef;8~0 zt5ugyww@)A;~&gs=N8evb0b1eEewS9BS2M5#Y({w@Rpihs#W?LBFIkTAant3m!B1S zbjDZ+%CJu|i?`Ys`Yf5PSZFXAqb!M(!v1R2VMd)2{#ZFV=;w2f8kZYTn#X$%&|>Q` zD5{7V6fJokDAVc8TZ!^E^`0h+!fY^W(CSIL&uP#+C8Dr*Hl`JV5ZxmeONi>&+n!}N z1Rj$KWH4kNx8f3>BK(c$kMX$~-WxmiJyX{0&*^~tl*cVq3NEobIimato+6+s<&V)@ zWH0(Qi*bMWu|n!f!Yt7C6Nm@zm=+dcF+;S^n}Iy|ak#IDauzW>U-`~?7!CBo36hL!d5q)CZKo5Hl1r%CrHn^LT+nAa{JNx% zjT4bF<|PltJLHQNR2Q&$_H%s_{LEnhwRGjq2uVO{|CEnCJiU_Zvo>coL5BP*UD#>u z_h$rXcc(g|O2iH(c1?i%9@deCjUtQ{1Y$|ew4yxNT9_mcTjr4Rp&fxHR;JAMq9xEyW?Bw1t>($^ne}}NR7k8?8cM@^>%B%yP>8ao|FdK?lp-6U zHfd-`(pKoZ@0)IxUr=VcpZBZud_g3ouk>)baXN~4`jnZQaY{?^)hwg>x%_dZJHo4s z6HhQoU!2gQDt@UW%_Vzu;wb^LEL zJr@^MATM$Vwx$NUoNet@qnp&W&-fMQe_5Ta0Wz9jW6ZasiJm-d2C1bLK=MTFTkRwH z+^q1|k5_YPhFn9EJTq-3rS4G&=$}&==dOobJ+>k06K0kz5}Me!0Vk0a%C%}v<&Oos z0Y-roj_jf!LJo|CtPL0~?+x8OdzaKXKqm1n4AQ3@_<2aSrppDhRd?;0mk&^Dq2BwY z;v+DJLYrR`uwKJ`^9%;C1A)m)kl2-n;6uTTmWn?XgXD0lesr%AppNk+`-e#PH9g7C zjcBAy1YJt-Jqn@Aai^WPBJaFJtH9g>h5l?O%>1*{NTQTKrF`Wsmzm6mqMqImW~@eh z_^F>UMOGQzHi_e=Ri16~(8Wx~1KV#OX9J{1n;Gu9uXjxaEs?C%t0E0J>5@QVdGbYc zmbf^ufPk+bfhhLEP>E|QTd{^h=6azGng#p{>0B>n7f-P?J0(NO$uv1^|0@Z`zDl~u zZ;2@dQ_1mj68C^2(uUyVmsp>IZEERfD?D;mpm^@cjm_Nh7^A!E0?*`0_=$79z`A7o zY2Ja5-P>wYc>@|dgQaG<^;{ZIj{9k*&XHCHUt+c+)c12#hJNh(V zDS@^SUFrR}%{K_ruRL>hj1EnW2gZ><>Ex0autF(*C4x=LG~ZoC69lQKK+mFT?W@Jm zi?VRxH#dc;A#dH#t>f(G>@E^E(_NM*sQq@$V{uzyVQ!qmoT~ggJ_^j{PQ6^s#VNfw zQ@N9U{%?;Trc)*++$}ujM&KiBNee5&)9mRhn?JBZ-ebeSVnqrL6}u!HX%@SShQgz; zg{&-+fN3&+J`~4R=D?&I9|Z`t)NMo{RG95cdqVp;vAjI#U;{vRO6?X;cR=;K_b}OB zD4xdXE3V#6kUbX)Jh1aP_3NI&%=C&YkMz3%tbNYmrjEuh^)HVUC7a)%kSh>K%k!XE z%v=}TOP#!VTnKwdh-*>%>g(jte5BL-=x`ioIgnh7)rIOh!Ho`QCLuh-j!N&7lT%RF`2#9@KlEng=h=Ao zUu1NrKjQ)S^mj7(Q>btmZ0$l%VNav@89E6ww&B*Dk;ygKQx4{t1<-`; z`M_KLE-_r7axg#{EF!uDgLPhjG%+##--mKVIg5=b10mV3UR+4C&BCU$y$~kqjGr|J zWUcM#bX*Ide@JWW1^dH9N^5JBqD_YT!OnS5U&XpqbEiO=%+wY1eOG_ok_N35X_7X9 z0=01_MN{s4rX!VO>8t{fFWB?~#0Tl>2pBDg@Hn*2J#Hf@79OQpxl1teJFm`O=J}xOfc0kjIBuWg#qK) z7*3=58Pz`J5NsV@Y;|~agXMHm@|<#zKR*u9azeLf7@?4EPzVa?no!6kW)li(8|ibl zk8U_9ek-nA)6Q)QHC z`R+9zTSLjE)!QCjICiPFpve_|4@UiW9=yxv%8z;~9PfF|QOhp(nCbicFh-U^3ZPKV zsD_l5yb=J(jIDRy{{2XTE#36%Rghi4sPG-o{q$Nn8)hC<8%!47j!le+i3od5v!#E~ z1(0J2TirF3D;!nbXdARUf1(gpX$ilXi*m4TDzUg=BhG(MF5&7n0-;^{Lon+sqV4k* zpyKS@t|j^Bhbr%yxmQeB#wajYmPa#dSw&nO)xh^i*eoUSEup{P5$9iuU?sy)(*5sy zeL6w3ErAjqT zA>=BkgSspyMYH`{>L-6<@9^66dL?14hx6qMq^PXOwUXSgBgx1UICRdN_aj$@d$FI+ zlQt)!phfsLF+*iKc7Ed7PCiQ)i?ORs(R|+2E^t zaMLybgrYx{c-^>4D-J0m2ns5z+h>Ktw~sM%axtW8i= z2qdfu;@ohyxkY9Btk~}5v9XR3qTpLkoZ1s8eS>t76R*i0kOh5%UoHBV3Va&I>Ne$L zUH0Y>HH~j}PFatP#~Zu){F7*?N(Q?)i2C=>!K|(i#jWJvD?$UN%hj8He%#B=s?J8H zX#|_(Di8u)`(WlVZqmv)cJu#1l*h)DM;c< z6>jnJ5au^etUaYKP!EX2E(Wf6o^w;-8_o#bvfS{R_gw{#@y$x4QYIf39g}!pWDTU2vRIL!$J`oX zpk=5})pz#?7o*MLt?dPljIhIV#y3}L@Nb(SGAo7#={@_3EKCJKvJApeH)O5Jwyy;U ze!_deTN>po_o|iAdIr%c9$VLE4tXvk|L`f)(+`TV5_l0aLXUqUSs}yKr$C_?DOimz zIV#qJNpATrc8hZG!4O0`M9q3r7ge_zJ#NKaU_Nc31;4!vi zUpGk|YKAo3^?f28`%;p>nn7dJ6NgvD@q}viB)VoGo+Mn4eYL1&TkIa_daPw>zkgSq z;K*;4I#QYbG%SyjSCzt_zPgp-*GASWLgbJQmOJ$i5_Lc_&Y%gU3kf{)jX+yZ=;oi& zLi#kymp38qHEMxineR6)4GgvS$bapB1l;@TsVgITb{)NIOuy{2u^?8?*l!3 z?6S){`dn*tukEB1s#sNpyjH%1;*8bz;Qe~aV7GQu3lccizMo%bCGkZD7b|f}z&LQ$ zKx?u=Mav+D+Qm^z&($c=TCIRP^ek(n)}LLD?)p{$m<@o%R#RM}Od2XsqwkX3%nBdq z|5%u%c@GwZ`_}@Weo>kDldB7rQ5x`b^8sDr8;eUYZWz4?1G~6xMz9&i@Kt8&QrEYo zQQ>sZF-pqw5NvV5CbL%Enh*&j{v0enk;M4xP&96$3@QNDDL(A52eSoVsF)y-;?Bvp z0x1+61P`6?cQiH`Mo!Y7R`NHtuopyeS(P-B0P4f0bc%2-azOBMq$ZZiv0JFMMziXA@%?EBJjq0r&QZ}vJYUe#9$9%LbQj5Y@uHh z-&k98`Cu4wb0KW7965uhB|1Ca(*cD~R9^2sm+LZu){ZwOcq#XQSH|iheVoc|smI{F zkzb~jrv8gx2B8src1|o;%YT8io$J(SR$^t);!1m&b3DVC05iph+e5jyBE&O*PPm{P zL?q+fZ$zGAH`NMPXY}t>1MZ109twtEjxFw-F+gurJ#X{|W$=3-y3R#Ha-^q7Rnuoe zc$v#Woeuq1&NVQjYRD^h0A7@vF>WV;rr&cq>0DtCCQ9Bu`97{ zvW$Tn7oe%JnlWSas%t0flA>4lizQLja7(9A&f_@xQ%E^NPh!Y3NVEE{wL zB^J;G#g*?RU^e9kT^zl}cj|G7^TLh$B= z%t@($4r&KcxM1a^cLsxGM7IuaX#-ei(M=!l;5GKwGd{bmr7P^#H0`Ue@z8!p18Tne z9DutOOUYG=_X7}lz#Np|H$GWf9=CI)&>E+6&==5wwKmQ_XkM7pmlu3NIp$Fewqwkc zS{O~_MAz^Wf6*kj-?&kcX1Re;rKR`CNo{eoKHy_9Zd<=StmgRZp$||d0_Sj@iuBW` zMAZO!?2+-4=pv6+0IFB0l;3(Spc>25`_o82C-0c~6x!) zau`h}ztdrWg~Mo4ikc3L=qT268o#}WV}1GfHIO&<^fm=Uyi`*NvUmqO9%mtnd^M@a zI*tce6Vy+qS3a;K5G^R!Smd+q2Y)l6)sxK$`CYu7_|KEh?yxBf#*ohlJi3XwQ%%YR zuyh`6FNp0bB+aZH9xhR*BZ6Ww5~#}V<|K)NUK18k>@Y_(aWDI0sxX zE7dtf+8w3J`$g&&fC|u}rE+&Y4Jw{W*8Xi%Z%9OtZxp>)sB7`{MC5-)M*+v|hp1w4 zoTwvd8+(9526RnQdE;%4FOQIR4x2Z3pD>8koA#)iwU-+|?~8v39?eDG^8zi7#Tve0 zDIuC-NLP`$n?+Q`BR<7k;y%70+b+7-v!~DN36)rC%6;vJ!N4K&M2Z3=J%r99(6*0c zVT3&dgyoz zzu3_LQ9^$%73O;9ik#8-ThRyq#8tpk2b^WnYE<_vOIub;D=VLey9On%*ff2|RSfZ* zH-Vuot=jlg@I@1kObw7#!A^_vY#!c`cg!GtTOUiFp2W(@KKbDbWQ?|ZNN4rL)y@Ib z~vUAd3zT4Y7_QSi`q(DeBP zB`2oCLkMAQq>deCFO%oQbZ9FhHN_XHT%uIeiJd-$*RO51h!Hkn5M^$33&-Ju+lA&( zdn)cx?s!X(+(ZR|$ramsZq{o0G?~`$@fGfiS`-Z8OX#SR!PK%k;YcbJ^Km}9@8hCu zAfu;@6+snW0$ODkm0KA+%RW^1M@3xS&4;CGiUfoI@fM}chC05;l7x2#GE2ap10QKdE(#8_rU*2GJA>y%4d!0D{t$1DyJYWx8hsSK;pp>dvRh<-DXo_S!d0o z=ExwWBK6cWujU=tOw$umrTB`Llo74$rKo!C1NNL?#-{Cj-4_99OF+bX rDj8h_$hdb8sXaHZxDXe}Zq(Ke#;3h`JWp&oa%H~#{q^(!>_h!8{dDh^ literal 0 HcmV?d00001