From 97042362f0be42f81775e59e707581b2940ab573 Mon Sep 17 00:00:00 2001 From: Anton Bukov Date: Tue, 7 Mar 2017 23:31:10 +0300 Subject: [PATCH 01/20] Add ability to fetch videos allowed to be watched on youtube only --- XCDYouTubeKit/XCDYouTubeVideoOperation.m | 1 + 1 file changed, 1 insertion(+) diff --git a/XCDYouTubeKit/XCDYouTubeVideoOperation.m b/XCDYouTubeKit/XCDYouTubeVideoOperation.m index facc2909..d296162a 100644 --- a/XCDYouTubeKit/XCDYouTubeVideoOperation.m +++ b/XCDYouTubeKit/XCDYouTubeVideoOperation.m @@ -139,6 +139,7 @@ - (void) startRequestWithURL:(NSURL *)url type:(XCDYouTubeRequestType)requestTyp NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10]; [request setValue:self.languageIdentifier forHTTPHeaderField:@"Accept-Language"]; + [request setValue:[NSString stringWithFormat:@"https://youtube.com/watch?v=%@", self.videoIdentifier] forHTTPHeaderField:@"Referer"]; self.dataTask = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { From 92adbb6dd8fbaa552fc0caa978cc5c1269b961a9 Mon Sep 17 00:00:00 2001 From: m_jr Date: Sat, 29 Sep 2018 20:48:10 +0300 Subject: [PATCH 02/20] TypeError: window.matchMedia is not a function correction --- XCDYouTubeKit/XCDYouTubePlayerScript.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/XCDYouTubeKit/XCDYouTubePlayerScript.m b/XCDYouTubeKit/XCDYouTubePlayerScript.m index ed422f5c..c40209d2 100644 --- a/XCDYouTubeKit/XCDYouTubePlayerScript.m +++ b/XCDYouTubeKit/XCDYouTubePlayerScript.m @@ -44,7 +44,9 @@ - (instancetype) initWithString:(NSString *)string _context[@"window"][propertyName] = value; } + NSString *matchMediaJsFunction = @"var matchMediaWindow=this;matchMediaWindow.matchMedia=function(a){return false;};"; NSString *script = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + script=[matchMediaJsFunction stringByAppendingString:(script)]; [_context evaluateScript:script]; NSRegularExpression *anonymousFunctionRegularExpression = [NSRegularExpression regularExpressionWithPattern:@"\\(function\\(([^)]*)\\)\\{(.*)\\}\\)\\(([^)]*)\\)" options:NSRegularExpressionDotMatchesLineSeparators error:NULL]; From 3e1cc0c66dcb62ec7f7824aa68d59789cc94bd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Thu, 4 Oct 2018 14:21:13 -0400 Subject: [PATCH 03/20] Deprecate XCDYouTubeVideoPlayerViewController --- XCDYouTubeKit/XCDYouTubeVideoPlayerViewController.h | 1 + 1 file changed, 1 insertion(+) diff --git a/XCDYouTubeKit/XCDYouTubeVideoPlayerViewController.h b/XCDYouTubeKit/XCDYouTubeVideoPlayerViewController.h index 09e11f66..812ee9c1 100644 --- a/XCDYouTubeKit/XCDYouTubeVideoPlayerViewController.h +++ b/XCDYouTubeKit/XCDYouTubeVideoPlayerViewController.h @@ -44,6 +44,7 @@ MP_EXTERN NSString *const XCDYouTubeVideoUserInfoKey; */ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" +DEPRECATED_MSG_ATTRIBUTE("Use `AVFoundation` or `AVKit` APIs instead.") @interface XCDYouTubeVideoPlayerViewController : MPMoviePlayerViewController #pragma clang diagnostic pop From d0238dacdbb03e7ec28160a264287c6ff695ee05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Mon, 5 Nov 2018 15:38:01 -0400 Subject: [PATCH 04/20] Add ability to assign cookies to XCDYouTubeVideoOperation --- XCDYouTubeKit/XCDYouTubeVideoOperation.h | 2 ++ XCDYouTubeKit/XCDYouTubeVideoOperation.m | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/XCDYouTubeKit/XCDYouTubeVideoOperation.h b/XCDYouTubeKit/XCDYouTubeVideoOperation.h index 5f5f0366..3cf03275 100644 --- a/XCDYouTubeKit/XCDYouTubeVideoOperation.h +++ b/XCDYouTubeKit/XCDYouTubeVideoOperation.h @@ -38,6 +38,8 @@ NS_ASSUME_NONNULL_BEGIN */ - (instancetype) initWithVideoIdentifier:(NSString *)videoIdentifier languageIdentifier:(nullable NSString *)languageIdentifier; +- (instancetype) initWithVideoIdentifier:(NSString *)videoIdentifier languageIdentifier:(nullable NSString *)languageIdentifier cookies:(NSArray * __nullable)cookies; + /** * -------------------------------- * @name Accessing operation result diff --git a/XCDYouTubeKit/XCDYouTubeVideoOperation.m b/XCDYouTubeKit/XCDYouTubeVideoOperation.m index d296162a..433356c4 100644 --- a/XCDYouTubeKit/XCDYouTubeVideoOperation.m +++ b/XCDYouTubeKit/XCDYouTubeVideoOperation.m @@ -25,6 +25,7 @@ typedef NS_ENUM(NSUInteger, XCDYouTubeRequestType) { @interface XCDYouTubeVideoOperation () @property (atomic, copy, readonly) NSString *videoIdentifier; @property (atomic, copy, readonly) NSString *languageIdentifier; +@property (atomic, strong, readonly) NSArray *cookies; @property (atomic, assign) NSInteger requestCount; @property (atomic, assign) XCDYouTubeRequestType requestType; @@ -76,7 +77,7 @@ - (instancetype) init @throw [NSException exceptionWithName:NSGenericException reason:@"Use the `initWithVideoIdentifier:languageIdentifier:` method instead." userInfo:nil]; } // LCOV_EXCL_LINE -- (instancetype) initWithVideoIdentifier:(NSString *)videoIdentifier languageIdentifier:(NSString *)languageIdentifier +- (instancetype) initWithVideoIdentifier:(NSString *)videoIdentifier languageIdentifier:(NSString *)languageIdentifier cookies:(NSArray *)cookies { if (!(self = [super init])) return nil; // LCOV_EXCL_LINE @@ -85,10 +86,18 @@ - (instancetype) initWithVideoIdentifier:(NSString *)videoIdentifier languageIde _languageIdentifier = languageIdentifier ?: @"en"; _session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration]]; - + _cookies = [cookies copy]; + for (NSHTTPCookie *cookie in _cookies) { + [_session.configuration.HTTPCookieStorage setCookie:cookie]; + } _operationStartSemaphore = dispatch_semaphore_create(0); return self; + +} +- (instancetype) initWithVideoIdentifier:(NSString *)videoIdentifier languageIdentifier:(NSString *)languageIdentifier +{ + return [self initWithVideoIdentifier:videoIdentifier languageIdentifier:languageIdentifier cookies:nil]; } #pragma mark - Requests @@ -98,7 +107,11 @@ - (void) startNextRequest if (self.eventLabels.count == 0) { if (self.requestType == XCDYouTubeRequestTypeWatchPage || self.webpage) + if (self.cookies.count != 0) { + [self startWatchPageRequest]; + } else { [self finishWithError]; + } else [self startWatchPageRequest]; } @@ -128,7 +141,8 @@ - (void) startRequestWithURL:(NSURL *)url type:(XCDYouTubeRequestType)requestTyp return; // Max (age-restricted VEVO) = 2×GetVideoInfo + 1×WatchPage + 1×EmbedPage + 1×JavaScriptPlayer + 1×GetVideoInfo + 1xDashManifest - if (++self.requestCount > 7) + //When user is signed in we may have to do over the request hence the number 14. + if (++self.requestCount > 14) { // This condition should never happen but the request flow is quite complex so better abort here than go into an infinite loop of requests [self finishWithError]; @@ -289,7 +303,7 @@ - (void) handleJavaScriptPlayerWithScript:(NSString *)script self.playerScript = [[XCDYouTubePlayerScript alloc] initWithString:script]; - if (self.webpage.isAgeRestricted) + if (self.webpage.isAgeRestricted && self.cookies.count == 0) { NSString *eurl = [@"https://youtube.googleapis.com/v/" stringByAppendingString:self.videoIdentifier]; NSString *sts = [(NSObject *)self.embedWebpage.playerConfiguration[@"sts"] description] ?: [(NSObject *)self.webpage.playerConfiguration[@"sts"] description] ?: @""; From 46e9c3ac05a0003c342299ea4f0be66da9a7d40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Mon, 5 Nov 2018 15:43:20 -0400 Subject: [PATCH 05/20] Expose XCDYouTubeClient to new cookie feature --- XCDYouTubeKit/XCDYouTubeClient.h | 1 + XCDYouTubeKit/XCDYouTubeClient.m | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/XCDYouTubeKit/XCDYouTubeClient.h b/XCDYouTubeKit/XCDYouTubeClient.h index ee6b6247..c5455ed7 100644 --- a/XCDYouTubeKit/XCDYouTubeClient.h +++ b/XCDYouTubeKit/XCDYouTubeClient.h @@ -79,6 +79,7 @@ NS_ASSUME_NONNULL_BEGIN */ - (id) getVideoWithIdentifier:(nullable NSString *)videoIdentifier completionHandler:(void (^)(XCDYouTubeVideo * __nullable video, NSError * __nullable error))completionHandler; +- (id) getVideoWithIdentifier:(NSString *)videoIdentifier cookies:(nullable NSArray *)cookies completionHandler:(void (^)(XCDYouTubeVideo * __nullable video, NSError * __nullable error))completionHandler; @end NS_ASSUME_NONNULL_END diff --git a/XCDYouTubeKit/XCDYouTubeClient.m b/XCDYouTubeKit/XCDYouTubeClient.m index 478f9e1d..05c76102 100644 --- a/XCDYouTubeKit/XCDYouTubeClient.m +++ b/XCDYouTubeKit/XCDYouTubeClient.m @@ -49,12 +49,12 @@ - (instancetype) initWithLanguageIdentifier:(NSString *)languageIdentifier return self; } -- (id) getVideoWithIdentifier:(NSString *)videoIdentifier completionHandler:(void (^)(XCDYouTubeVideo * __nullable video, NSError * __nullable error))completionHandler +- (id) getVideoWithIdentifier:(NSString *)videoIdentifier cookies:(NSArray *)cookies completionHandler:(void (^)(XCDYouTubeVideo * _Nullable, NSError * _Nullable))completionHandler { if (!completionHandler) @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"The `completionHandler` argument must not be nil." userInfo:nil]; - XCDYouTubeVideoOperation *operation = [[XCDYouTubeVideoOperation alloc] initWithVideoIdentifier:videoIdentifier languageIdentifier:self.languageIdentifier]; + XCDYouTubeVideoOperation *operation = [[XCDYouTubeVideoOperation alloc] initWithVideoIdentifier:videoIdentifier languageIdentifier:self.languageIdentifier cookies:cookies]; operation.completionBlock = ^{ [[NSOperationQueue mainQueue] addOperationWithBlock:^{ #pragma clang diagnostic push @@ -75,5 +75,9 @@ - (instancetype) initWithLanguageIdentifier:(NSString *)languageIdentifier [self.queue addOperation:operation]; return operation; } +- (id) getVideoWithIdentifier:(NSString *)videoIdentifier completionHandler:(void (^)(XCDYouTubeVideo * __nullable video, NSError * __nullable error))completionHandler +{ + return [self getVideoWithIdentifier:videoIdentifier completionHandler:completionHandler]; +} @end From 58ae454b397413df40f40119578f8cb9556f3d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Tue, 6 Nov 2018 12:28:56 -0400 Subject: [PATCH 06/20] Fix typo --- XCDYouTubeKit/XCDYouTubeClient.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XCDYouTubeKit/XCDYouTubeClient.m b/XCDYouTubeKit/XCDYouTubeClient.m index 05c76102..95ff0053 100644 --- a/XCDYouTubeKit/XCDYouTubeClient.m +++ b/XCDYouTubeKit/XCDYouTubeClient.m @@ -77,7 +77,7 @@ - (instancetype) initWithLanguageIdentifier:(NSString *)languageIdentifier } - (id) getVideoWithIdentifier:(NSString *)videoIdentifier completionHandler:(void (^)(XCDYouTubeVideo * __nullable video, NSError * __nullable error))completionHandler { - return [self getVideoWithIdentifier:videoIdentifier completionHandler:completionHandler]; + return [self getVideoWithIdentifier:videoIdentifier cookies:nil completionHandler:completionHandler]; } @end From 1dc975203f721d370777b5ae28a6fff3171d0f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Tue, 6 Nov 2018 12:32:59 -0400 Subject: [PATCH 07/20] Add test cookies --- .../Cookies/adultUserCookieData | Bin 0 -> 7296 bytes .../Cookies/minorUserCookieData | Bin 0 -> 7817 bytes .../XCDYouTubeProtectedVideosTestCase.m | 26 ++++++++++++++++++ XCDYouTubeKit.xcodeproj/project.pbxproj | 4 +++ .../UserInterfaceState.xcuserstate | Bin 46246 -> 44055 bytes 5 files changed, 30 insertions(+) create mode 100644 XCDYouTubeKit Tests/Cookies/adultUserCookieData create mode 100644 XCDYouTubeKit Tests/Cookies/minorUserCookieData diff --git a/XCDYouTubeKit Tests/Cookies/adultUserCookieData b/XCDYouTubeKit Tests/Cookies/adultUserCookieData new file mode 100644 index 0000000000000000000000000000000000000000..433ed14800b18335e994b9a4b530042eabdd0cf5 GIT binary patch literal 7296 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 literal 0 HcmV?d00001 diff --git a/XCDYouTubeKit Tests/Cookies/minorUserCookieData b/XCDYouTubeKit Tests/Cookies/minorUserCookieData new file mode 100644 index 0000000000000000000000000000000000000000..60607bdd80a706124a2f3b7b1f46bbf75854c686 GIT binary patch literal 7817 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 @interface XCDYouTubeProtectedVideosTestCase : XCDYouTubeKitTestCase +extern NSArray * XCDYouTubeProtectedVideosAdultUserCookies(void); +extern NSArray * XCDYouTubeProtectedVideosMinorUserCookies(void); @end @implementation XCDYouTubeProtectedVideosTestCase +NSArray * XCDYouTubeProtectedVideosMinorUserCookies() +{ + NSURL *cookieURL = [[NSBundle bundleForClass:[XCDYouTubeProtectedVideosTestCase class]]URLForResource:@"minorUserCookieData" withExtension:nil subdirectory:@"Cookies"]; + + NSCAssert(cookieURL != nil, @"Cookie data could not be found!"); + NSData *cookieData = [NSData dataWithContentsOfURL:cookieURL]; + NSCAssert(cookieData != nil, @"Cookie data could not be found!"); + NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookieData]; + NSCAssert(cookies.count != 0, @"No cookies found!"); + return cookies; +} + +NSArray * XCDYouTubeProtectedVideosAdultUserCookies() +{ + NSURL *cookieURL = [[NSBundle bundleForClass:[XCDYouTubeProtectedVideosTestCase class]]URLForResource:@"adultUserCookieData" withExtension:nil subdirectory:@"Cookies"]; + + NSCAssert(cookieURL != nil, @"Cookie data could not be found!"); + NSData *cookieData = [NSData dataWithContentsOfURL:cookieURL]; + NSCAssert(cookieData != nil, @"Cookie data could not be found!"); + NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookieData]; + NSCAssert(cookies.count != 0, @"No cookies found!"); + return cookies; +} + - (void) testAgeRestrictedVideo { __weak XCTestExpectation *expectation = [self expectationWithDescription:@""]; diff --git a/XCDYouTubeKit.xcodeproj/project.pbxproj b/XCDYouTubeKit.xcodeproj/project.pbxproj index b5ec5015..f67cdaf1 100644 --- a/XCDYouTubeKit.xcodeproj/project.pbxproj +++ b/XCDYouTubeKit.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 01D2370A1FA03AC100A13E5F /* XCDYouTubeDashManifestXML.m in Sources */ = {isa = PBXBuildFile; fileRef = 01D237091FA03AC100A13E5F /* XCDYouTubeDashManifestXML.m */; }; 01D2370B1FA03ADE00A13E5F /* XCDYouTubeDashManifestXML.h in Headers */ = {isa = PBXBuildFile; fileRef = 01D237081FA03AC100A13E5F /* XCDYouTubeDashManifestXML.h */; }; 01D2370C1FA03AF100A13E5F /* XCDYouTubeDashManifestXML.m in Sources */ = {isa = PBXBuildFile; fileRef = 01D237091FA03AC100A13E5F /* XCDYouTubeDashManifestXML.m */; }; + 01FB237C2191F98100DC8019 /* Cookies in Resources */ = {isa = PBXBuildFile; fileRef = 01FB237B2191F98100DC8019 /* Cookies */; }; C20F57A818817D5400EDBFB0 /* XCDYouTubeClientTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = C20F57A718817D5400EDBFB0 /* XCDYouTubeClientTestCase.m */; }; C2142F2A19644779000FA9C0 /* XCDYouTubeKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C2D0CBAC19122A8F00DA8CD4 /* XCDYouTubeKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; C215BEB91BE2E5B500F9783B /* XCDYouTubeVideoWebpage.h in Headers */ = {isa = PBXBuildFile; fileRef = C2386B1C1974036300646123 /* XCDYouTubeVideoWebpage.h */; }; @@ -99,6 +100,7 @@ /* Begin PBXFileReference section */ 01D237081FA03AC100A13E5F /* XCDYouTubeDashManifestXML.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XCDYouTubeDashManifestXML.h; sourceTree = ""; }; 01D237091FA03AC100A13E5F /* XCDYouTubeDashManifestXML.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XCDYouTubeDashManifestXML.m; sourceTree = ""; }; + 01FB237B2191F98100DC8019 /* Cookies */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Cookies; sourceTree = ""; }; C20F579B18817D5400EDBFB0 /* XCDYouTubeKit.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = XCDYouTubeKit.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; C20F57A718817D5400EDBFB0 /* XCDYouTubeClientTestCase.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XCDYouTubeClientTestCase.m; sourceTree = ""; }; C22263371B33FDE000BA6719 /* XCTestWorkarounds.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XCTestWorkarounds.m; sourceTree = ""; }; @@ -169,6 +171,7 @@ C20F57A118817D5400EDBFB0 /* XCDYouTubeKit Tests */ = { isa = PBXGroup; children = ( + 01FB237B2191F98100DC8019 /* Cookies */, C2D0CC5C19126E1200DA8CD4 /* Cassettes */, C2D0CC3A1912673500DA8CD4 /* VCRURLConnection */, C20F57A718817D5400EDBFB0 /* XCDYouTubeClientTestCase.m */, @@ -386,6 +389,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 01FB237C2191F98100DC8019 /* Cookies in Resources */, C2D0CC5D19126E1200DA8CD4 /* Cassettes in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/XCDYouTubeKit.xcodeproj/project.xcworkspace/xcuserdata/soneejohn.xcuserdatad/UserInterfaceState.xcuserstate b/XCDYouTubeKit.xcodeproj/project.xcworkspace/xcuserdata/soneejohn.xcuserdatad/UserInterfaceState.xcuserstate index 17d5541573f9159104c51a276842157c142ce241..3bcb36c73c0c72c8a48bbcf5381aacf8a76b6bb7 100644 GIT binary patch delta 19868 zcmaL82S60Z`#!!i+iuqgM?Z>iz)_@mXYZoY>rs^=NIBprM>{%rJ0@z3-2*jt5L=8T zCK`<;#;!5;7&U54QDcndW7HVyfA$WHNxr|o=k77>ooC;9=6&Cp*;{iPF1!fm+EM)P z{9WVK_k0XiWFEm162gYCCF}?v!k6ex_!0g@01-$85q$_H(VrMbBoK*25|K=#5UIpC zVmy&Xq!U#{HK8YJh+3kKs3#hTMxu#mCf+0F5{ro?L_4vTSVycUHWHr@vxu$4c47|k zIq?OtkNAo>L>wbd5@(4E#AO3o^C5s!(#Ko9T^=m{)Jum^kx_JkJD5;{W{*bBNsH|Pbup+6h|2f{&c zFdPDh!Vnk=!(b$ghiaG#$H7ck01IIetb)~0Z-Di1CY%Ll!#Qv+oCoJaBW#78a5Y>5 z*TQvhJ^To6fuF$7;SRVT9)JhoA^0^s1HXe;;m`0E{1ZNff5B()IebC#WDoKkvL|Ul zT9US;9cfQGk*=hI^dbXDC8;6@kORq~8BlAfO zSwI$&MWmK2CCkZ5vVm+Qo5*S8`{Z=;19ApAlbl7)CKr?KWCyv1TuZJaKPESlyU5+- z9`XQrj66f0CC`zU$REfX18mKy| zo@$^PsV1tKYM~}k21=k1HJN&sdXJhyO{Jz$?^DyM52zW`OllT2o0>z-rRGudDI?WN zwNVSGh14SILuxU#gjz~1qn1-EsFhSZ)j_SII;qvv8fq=Ij#^KBL~WoxrZ!TWsLj+C z>Jw@!^(plkwT&`tr#`24P&=tFs9n@Pc5H>jJ`E$S|Hk9tTwrCv}kX_98?p0ovRMLW_? zv@`8a`_L-7FWrwGL64+I(UEi%9Ze_Di3Yle*3!jv30+E;(K@=EuAnPvL{FyQrQf5c z&{OG|^dfpGy^7vIe@uTy@1S?md+5FNe)=$df<8^3p?{#S(?8Nb(Ld9_&^PEi^aJ`C z{hWTmFbvB`7>?=5*f6$?E91t<8F$8m@nn3MLCj!g2s4x!#u$b(BNz>%Wy+Werkbf` z8klCrz)WVQFz+)nnAyxcrj=R9EM}H5E16Zy8fHE7F|(Q3%4}nHFuRz&%va1o<_L3~ z`Gz^ooMSF9mzXQekIXIRSLQZr$=a~Ctc-PJd$F#p2kXiDu)b^n8_25IzU)AD5IfAk z4rhbe(QGIi#zwKxY&@%Gli3tDjZJ5>*lf0hEoIAC9b3*;vyE&M+swYlPGP6A^I0R? z%C@l!*u`u++rh44JK5FjMs^dsncc~Z#M_5}M4dy>7te#c&9e_?O1 zH`!b4uk7#aAM7L6@R)tV{>i?U5E3BiDY1}PN~97iiJinn(o5nhag)d;zLMS&KgmGJ zAjx3K5Xn%I!U>tLQ*ejkTgoBN~THP zmrR#@Aek*`lPr)dl&p}fl(b7WN;XM0OSVWpk!&;8(ZdXuoRpJsj+_(c&G~S?TyM^g z3*rWF1G$mhC@z?b;bOTsE}m0!$y^4P$xYxiTme_eRdaf-hO6c3xF&8g_b&GyH-($U z&F1ECOSq-nGHyAyf?LIX#BJa{=04-Laof55+yU+&cZfU89p}z)m$=K^P41R~`<1)R z{l?wn9&=B)Ke^XD!2`YrZ^=t}Ti%X$k7&X3{8@*(_qK8;W3 zGx$t?0-wca^Aq_TK9|qq^LY(l&R6i2d==lwzsFDEr}ESI_xb7k2Yf5v#xLL(^6h*F zzlz_;Z{nRl;lJYd^9T5Y{2~4re}eypKgplvFY;ITAB;WOQREjwmNA~yIl2)ZgbSe{ zyo7gzp7^p5ctI+Z3B|@QB+f=h$uuz1xSVq|K4QI$%Ox&jB-v6~QxcxVWUC{2YBwycKmNx1v;Atye0~14vRdGiEGyk-kwf zR>JW;-sx%K=q7jf@ec^>*MGp^;Uh+lPEqJ;N=vh)Znz7%N;O0-%9ju6+gGl{AJve) z_@*2%NS=}%mo#*6w$#%&DblN-b!15Bxbmu!>WZ8^%{Z+tzr0SJEw#hBA?0~BWg4A+ zY`IQfRbE=EsXAvVwX(L88Re|Ay^XCP5#H&rcMvQE8^QjZle3jeFIVGhwTkAjB6=7H zBn+TDJQZHXIJtvYQeKrtql?LDD6i3XD7?qVCB^3!Yx4ABGvD5>Sbr9{$*hC{Oi&*y zrK+#-Xu>E*sbD2o|6fWo$`jo^Jv;{v%8E-eL++A1(EA*2KV)cM!B(&ntd04J{cSxw zM+IlbC5347^xAS=PE|w4C~xD(iSF({NG(G`!@?sXqoQMC?** z9rtYPqQ8QN;W>B#-hh9SGSZt2!mc%zOd&I|H?1e%BNvjZ$erXt@*DCBd5yeI{zU#v z{(`;ZE%G*b2Ybl-x+CUSe_*Y7>I%R0SBim@=9~6t93bL zn(^j8HPsX1l45K0Ik}~p5X|OPxY`h6DAu8v`g`;Vj^HuxhZA9h_j+OkF_IWX1QVl) zF~nFRga{SKACpTQOMAgVkO_|KiEzS;h$NzjXd;I2k0soQc)N`&CEI1g(QP0AiO^!GKmR9 z7LiR%By#Yh=MnjYMsOBfgkFNH;3migcfmvO6cis3g+vj?6OTWoL>ZwY$_Y2YOBjIx z^}`>Xuvqw1*p1;7rxGd22TJP(XVl$#XUQfX3Ad0mJmx2CXAV}f{|XdxyM2CNW) zK*VI?UE}MRD0g89W|+4y`~oqBn2O7$5$_Yzak)Uu#G&kLVveyaHr5T-8YTsTkCgb9 zm`BXV^^8O-(MBvF77~kyc;g}eL~el4TNo_(3jK^{Lk0~cmJ%yh5zC0>#0tSr2oh96 z|8qnKu?jcsBvun^(j)Wn1lSXFC;zF0Yd6UL7XNh_~OuF2IzYxQPn zJBXcl!i}z~%4z5zb`V3);Yrg2Pn$i&UIJz0cUh#A#F#X_woHS^v8+NEC=3#aY^l~b zQ9Hsoywt|{exxI37Pp@`V9XA6pooJQTXv{@SN37zh;e&h07V?d+1msCNBmQ_$FX*2 z;spXC<_JTv@`nj{bs+Ne6tS|Mn2ZObzghe_;(WH$$7JN?@%%e+<@uTptpA~JWlF_N zbM5bli=y&Gmw;nNkSvT7#tUf} z%jn7(DL{d-052g$)F#$0@FiAug5E^DcnPT(wRrWHdV7v~U^Y8ax(hVu3kDF@9iSiR zFQf|@9bh0BBxDK`u;i!+Cj%HxtXwJdx9T^=q&<)G1Qz_0&qlN^S3d6;{{iN5>XB2=hTTqQ7)7U{juwBYElNsm8Jltpr2|mj!^pc zZE4}Ub*~4t-Sh-?Lb*`fUC;=cy9o+fgo?il1n?f_CO}{^cvq+ts)XuQUFV6!7LHPY@y~2H^DscA?7BS4~(D{w1EX+Ay_2T3Uxxg&>%DlO+vHC%_U$dScYBY z3a}D$vqhL8vo0N)7Hg%7ZFb%gCWaK=p0pv1R%_$|25#Y3Yo^KBk}FY@pTxC*WbvxGUqyf-|= zkL`l(>1;f&x-GL!H}`Iu4Dj4;13bWFfWaLTBj^7=83`VUrdDYEuTj+-{w5=MU?N_t znLf`&HN6l%{5O46eY@Gyr4>j(n(*#~076JYN?0N+6_yFhJ0SyEVl$4VRtTLK? z_!v!rK2@u!GsmJyI26_!mqhgpOE)|0SZr3)619azrb^x7rO-|kZw0NP4YU3*Cj)?a)(LBNS&#twK_hO`VB-N9r|Y)uu;; zKG3fN`oiAAT4AHGrMtfXsKm^MfiMX65!MOog^yN272yT@2^(-P9}8I%u(-edXr`E| zPSsXxaa@#btmtEHc=Mc|!9tPA%yr8i21orzb}*JbM%aX9Zx*utetgg1_xG9Fn&vzV zhY>h1?h3z5zH}7~H+xf)&4*DiMttsQVJq8?iH~C?V|lc59!!8qVt%6VSvyP?w*CL< zW4x%3G?*@I7k2)wj|nj6KbUhd=6vCEjCltpKZ^LLdNvrTCG1_84Pa##b57@iJopKWKEf;@jX-!g~!| z02jhV@I$y5E)k9hM}=d;ap7y>#2UB^E{7{H+IAf4eIuL~zQvd?i7}p0=I$%C#8GFG zrWCJjH2J1rFVMGf_y)Li1_YmHzh)r-8+>K+Zv%kfgqOvFPQkz3)aRQaxdyMl>ElP? z^51>@0wZqxbM$_N_eH(lhQGl(@OP};d%_jrs&GyC0c-dA8m!U(VcX;dAHm01n?GV& zmI+UVzpw@d_{ohodnXvb>FqeA`x#!6B;mapzJjkwf&?TKeiD8bei3d6H&>Gsj>)}9 zmXrv$u#7U{j_@azGS6?HB`GCsI!G(hTKHACE&OJj=x=LK{Zn&7mZX zeihDfB!*)DiW4T2KsrOecG5-oUD)!L4JQyOCl-<(q$f6z_plAWD?G`Ts>bJGdliJK z5tmb|EfkkUqHPHZt=Hrkg9Drgklxs{kUpd@*_-qe?hF4D{tzC$vGQb~$!I?ijdr#) zQ7O;P9@sB1LyQ&-ay<@%M;B@m@mCf0?wb76(A4-;ZN8>_LUwLxd0t7jR##hIf(d4F z0Ayd2$9O1ujPc1ucx99?$1c)bW^L-{w%AX1)-Y4nV{_N;!}G=Uio9BbS5f6Uc|o~x zYM|8K#_-zwFLO}A;GEq4Lvn`n@2A8ZbbwL{&ofU$*Qk-9WCG#6feeES$p|u%j3T4S z7`!}qoh|T0U@qlpsMh3%SC!XP7{fiojk`RYj0ZfO!pUOjw^G<*9`!O(w-N#KLV|Q8D>_74bU$7d zSwnbtkkzCffgT9F(?QmfbqMrCzy%YKRjB%s%_PDuifkb#kp@ygzybkF1f&R9b&`|G zckv2+3If&$*dSnwfE{j@t7wpsbI7^mJaRs1BzlmoWE(yVLF6LxL*pNc{&EDI5U`iv zMI&%T!1+9`vV>epE+dzVOBiycajcg&HhVI$fh7o9L}C-Q8ZIEWke^@^xllNQfGYxS z*hC&(O>V=J&yCzc?nFS2=N=vkF9iJYbIkE}G3vbCjVpZFByumguiI{rUm@WB#&F=R ziNoDCh{S?D-WVbBIQfmJ-LJ_L2zVl(=y+oQ#i2HyS|-D>vnhs-?}mDwyzr)*?-20* zyPM18l{ej7MZo9pZt$K6E+KzJz_*?J8G+sydmoX?)zMkRhg{YK%;;p}UTY}}!?crtY z`;MLQSPxg@wjTDzTRkF^O?;#1zqvPcBpmXwsTqO2(!%9gUD z>?sFIMmbVWlr!Z*^`cxUH%d;qQy!EjrJ%ehZ{yJ+QHfLx6-&iY@syfMpc1JhDw#^5 zQmJv&cq)xbr!uHaY66u-Wm6NW94eQ}qw*;YRX`O|MU<8*rb?(%s*KVhFaUvp2n<4C zuyJWWnE`>(2#i5sECL}2gdz}zKsW*s2t*W*U>pMD5lBNI9f1r4G7*@7Ko$bo2uwsE2Z3A!@({?!>mdXR5GX{T2mvhu#mMM3 zG#Bf8CIYh%n2o?31m+?z4}tjz7!hbipbdcq2rNWk5dt3~uvpmg>Ajxgtc_oJIs|tS zhPp^yGjW@`Onol~03x@SA+THw09I2!P}j*i>L&`bVg&*ncv>USiNI<+f(gDVW3anp zw_~J!rGCTAqi!RxvYonvK>PoX)2HrJ5B}jRsXwU4f46>uz^XUIrT(Ixnd@Tv>KaVF zqKP*(X@J0*H#KRB#=-Vm@e?hfc}!rMLttGyjqTHVj9VSl+mE(1k*rGxv^9;R=nmS3 z#s+8u0v~sX##XedxcaJ~(FWRucExf`aWn0P@LH5%_O2qoNTOxEq>ZBL1VV=LSQ!ndl1-*z?TT@L*Od}_9Jj$Jw}*K zPo#6`Tsn`=r!{ne2=*W%gAl1gEoa>-Jp)u3GMc@L4{r3`;{#;z5B5>CD+TdtBZ1A#qt8BNq z>^v?DiKV}!_x*FC9H0;WGvf$-Ok@Jq_{DY_EBW$2yEUu+8`lK?P>P5B>TY z^ZKV7@AmIw{IQ>{Q8|D$UhHpYyqYG<=$3zz{uM(rE!t?@@~7^B_#Lm%=)3ei1hBQb z`S(2hAB|1RKi91E6U@%12>c>a@&;!A2Lt;n=$8!mcSQygUJQi*4yzIP6<545(A!{| z`wWlAoxwKcj?n)+V}ZA9@y0D<$w=u_jCESIX+eY|Mg;C6@H+yR5cKpMz3=D?8CCp6 z*OM@Ij3Zv;F!qcCBSQcKzmLF!Rg4qk%wRkFKLj2k@P|;GYM$Du$vIVp8hy60-{9;N zM%+wfu-P#M&8Af@a%waK#Vi z({ltpFqOrR6085$!IuooNYUwfF{7AZW;8Q~8Oww)p-dPP&O|VgOcWE%#4xc;923u| znFJ=0Nn(`K@LG4!5+vPzJp*-1T7G>L{N&L6@u0X+8}6)pdEtt2s$7rGZtq!%ft}1 z2UEZlGDT^4i%?t-=n4^dY5Z`g+dwgc!N?%m8z$Nlbk?Okqw<5>u8Fy4oQzB_Hl(E_+W* zRZi$iO%qcqCU~05uo-%3{CYxH@3X`d$m;3=`}LQ`fmvN;*tx$nmS*{x+hGHVrDQ4I zF`>q8{$;k*%b1gGYuq=&)?8&N&YYj^ZBAf6juX9%G1;6s1ABE*fP-UXTzGa;T2gXo zY_~>Mo20pSNn>orq(sJqgeGi z!A{2ViPq+VPfP`2ZwmHJv^T@~OcaXpU2t_vV@V!od@#z%+~o6r$tun1lJ$kDU~HGH zKyz*ElQ5joZ#uBdwK5lAAB79z-V|i#x|$0Pm!g>mH=XLG?RQ-K-O^)X$b&YCiZbk(Mf>G`f^q1c*>PaS7YT@+In z^HZhF<*sO0B=c3~n$bDLond}puHz+&bBNrS8`8^x`H2w^N|>J!^lE2rAm}YRK@a1~ zbVq}E6^KuB$JJ`8#1(9}>G_R$L3nSLS}}K+-`vzuH&CAormi<8LtB^yrGcYCC2kD56QZl zi~AVemLUX?2%4nXy-~t?_hGkGGpE&D91N?-!-N-F$#K ze^9nmjhjcfj4jpT)5oBqw;xJ8i_;=F#5h5l`L@ha=KNvCZ?uJP=ZBc{N8o&otn6(` zk>-+7|LW}@b>hr*MjOit*1nB2$(%nnTlz(pYTMuLbiBDZ6zeU)?jHgtm`lQONwo2L ziDaPp1dg4^YH*0f=CHYJ9-EI~B!W>0Mk5&0$rgZ5hh;;G7(G? zvi=orSt%!XH=4%I6al`^PG>)0XCRn@++Zq#;}9I*$$LEZ#B3PozrEU|Um|PDqz^_q>K(Z-%>0ggX%j zhwKJnI)XVk^vE_i_hq-R+eB!euv^(r+0PKnLlA3FgJ3}?yPf@<-NEieun@r#1WOSV z19+^xOm?4$>?;I|x{)0eksZRSK7wOfs1;RRjDvvw(s-%bGdQRVS6DZ$Q|wtYt}`Mo zorvqah^rjqdeQ9Im%YT|Wn?FNnf;!J?2qhE2-YCjfM6qn zP2Hn$<><~v4aFSYXw?%#z>-;L}k``nD|nTV`eMD|id z*7Dy0wt1(kkpxOuj8@`DN+<~}!7+#dK>M1;MH2J4Sn0>f#wJ>q5JyyJL5W!h}}hDWd%Vqm_7z zXlGzO230w!{3S{eSb!u@5+vz^;4B1ZBRB`axt$V~q_3o(1e@M@2(}{FhTsA-uHM5$ zT-XlJ@5VJs#1%|z7B2*ic&|{r3H^=AYP*6+NsJjow1{CLo)VHcaZ2EG$$w7?TWL4& zB*}OYSh6HVk}AOyVKIVB5L}AjvQ9}FJ6n<=!4j66W<&>qtIWWX^F&~npDVh76^g)$ zBwF!8a3zB6<~vr{a4D1qbaz)N(VH<=ix@jaJ=KbOT8;IzSns52!kd2>PP3#%GD(65 zZ!LoB5L}PoN1YNRnau8xyocZh1UH$c!DcfY!weA)_C6nX!rt!n~ zjTlZ}&tRo_^tv%Ek}NS}S}bDPBI<3Ks5iWh|F_;O)^|7RkgOGfu99?0R(naX&-)ZX zJZ-ljxV=-d4lC{>35NN(NpW8weAFOL*qMf{B2rv+M>o>#qT)WsBZ@BscZws5Z}`j~ zSW2IDclM=ZzZv0IBEsDw!h<5hJ^w{Gq^7&kF$q2!>69Fod@VU4`3Au+5!}}cL2NAc zcS=r4PD{>6&LVgK!6OJBMetY`!b>8;%LpFqMtD_3cun$ycp-QQ!NcY|)@7!Y^bB_C znhVk09ser1V@CU%i1xUM_O6Kb>;Iy)ncm&#q2x~y?H|V7dWkzmdlJD@2%hegJeB+< zc_zWp${7T|MeqWG_?X9NRXcM6#7H?3!LwaRIR+!;Sji6@%i$%*ITKQRKaY`SNu4}{ zcm+Xh1+R5- z?&7TF6bNFam}f0su!^`0{vxgb1h04F>SJOfr(zFrDia%jG~Y3PHyX|1*UdV)G2B=#gbPLRCW5z+3;Y$q+nroE7r{kx*a2fR{5yho z5k96e0UVbg0!%~@uW(IEUM|H1@V`#OGg#WCvJu@~W^p-YoD)Ty_wfYg^27=J0IO_o zxnp0hh$|B@X}Myqgu|}tA%cG(_z1zrot%y<=PEetLY^S_7lO|ad~Sx6Q7=NmKIG4C zNX_C{wh-~+h2T@skKr4h7cj~*IMs~G3PyCpn#xT#!+KwY^+JR-LxlAb!>VX-QO)Jr zL{#&*`J9o%!}S`G_}l>?5_WP6Bz?I>+=qz7TxvxmgGknlO1)A<)s9H28&#)>YBhW; zUWlZHzf3ngj*F#Bx}j|3wwR%8#!yI!IFeiONRk|eqMYQYl*N2Eh1_apa{HG7Zy1(7mDI*V=_9~PRa zen*7$J0cysVci!M^Z+XeUx;)P6@+hCL2jPGe&$i@?(!*TcJQ3&;K^R%kckeSbp0>m z8T+nAJmeX?v%-@+#nXrklq1puk&0D3%S(6;k=}^(MI=7wcq>NcEllAm>2B;je&AaH zE^lMb_cT`jGanx>;pm+7GVU2a+@5#ld*MYG?}A95cDzT3LxyarqY(^n%)7aOplK=R^58!g?Ja#)tC}d?X*mNAod!EF$|NvL7P* zBXR&D2O@G1A_pUK$T}V$UK4J7BA>)3^C^TEB8QsJzsO;T9FE8lh#ZO2_!S8Bz^8yO z76+t|FXFMzFqqMZ9J7iq;Y;~4M2ULlGH<$naIXz$1P#A|ntPiO48%7`%;!cU_J8ci%V6 z;OG2bP3H3RL=-WI#1D&6cm|s(NF>Np#?)v_^ScLX5s%-L_)nKy1izeLAzDvTjYzy= zNgOK2s{O~?p7JDpj@~$T06(%@Rwuvi|BwZo`H%Pw!Z<`GAu?Gg&LiYrkdT{Rm*+PV z{XRYV-VFN~!LnP*R(>bm^TSH`jNisj;y>qim{gI9NGu{8k>e4WwuTpo&HQeD4}L#t zGu8|a9!NZuGI9JMZu+fUvckY0CVKEk_@m+*cjAktrme~oW3D_xWQOU`lt0dYZGM|s z)4?AX-{Z7OF3-Z+OBb=b^b{rm8bzfP?D2yZ|%HX}kz zI}yXh%?NN&d?O3*_u(B6P5$VrydwO@VAUD^9)ExSat8y4e-h)uD%d{w$1lU!5$q^7 z1pn?O694X{3NQ5*;9sz;W!JMC@b6eQ;}zDY?0)tjdzd|nf5mbF|AOT-dzQV+zL0p~ zAD&c6J~hQgcO;J_FM3|-d9CNIo)3FIx8N+K77iA2i$IHDi!l}<7GV|<7Eu;47I7A8 zi$sHk#-h+dYf)mMv#7MtThv)JSTtF*Sj@0kZt;o5L5s_loTa^GZ_6>3@s|0P1(rpY z#g?U(I?D>nDoed(t!2ICEXz5T^DK>)ZI%lyKeSw8xy*8fWxM4n%T1O?EWfq<-SSVV zrPND01P5H@QbF1#-7GyWJs~|QJuN*ey(2X|l0LU$t^BM8S`D@uYBk(yq*buh7^`ts z#a0bgGp*KHePs2q)h4SgR$HxpvAS#Z$m)sJQ>$lIFRVFhTWcq47i(8*xpkOzgmr>- zg>{W}t985eD(ltOYpwTKAGbbXebV~0^)>5T*7vO+*#MiKHV!t9HqJJ^Y^K}Hw^?Vi z(dK}`=7i0kHZN>_Y=dpb*oN4K*+$qV*e2Vi+K#u)v7KQ%*Y*qB1Gcwq@7dYfx!Wo1 zyzP41`P&8BrP$@#Y3vH^itS46bavHtg55N`>2@>hX4$pcEwEc;x7co}-BG*ic2Dhr zJ!Q|>OYH6J753itzV?3h0ro-mO8dU{qwUAq8$#{F?IZ1@?PKlZ?Gx;??2GNE*neoh z&HkMI5BAR;Bo0;%HV$?U4i1hE9u5izZwFroKZgK^NQZIA)jmkzIGK*q=pHVp+AUQPwP*BokzlWpiZnWJXz=tV7l*TO(U1+a~*5wo|rCc1(6bc2Ra& zcEyo!R634u40TL!Oma+d9OpREvB0s!QSbPH<2=X3j>{ZZIJP_Pbo|2ch~sg`6ON}G z&p4iQyzcn3;|<4O9e;ED-SICc!U;N2P6o!Qr<0|Vm6MH=ozrNiG^a|ZMyD1hgA;O^ z?X=8kg;TrJDyP*>Yn|3RZE*U+X}8l}r+rTQoenx3b~@^G-03@~pPgPgTRR6i$2gC7 z);Q~&E1avG_0F}<2502_uJaVE+_);_ISv>E|-QWsu7d zgUc|N5iX-#B3x2j(p@rLvRv|9G%kfMT92z7+ve{+3 z%MO<>Tz0$cb@|%m8<$fqXI%d5MfGBONqX_Uxb2EpaV#HI%znx>mb3yH0WyTqnD}=Q`DOj_X?2 zt**OWkGY<8J@0zK^`h%#*PmT)xZZNT?Rv-cu3HZ`U$*O2c8|9nj2jnN@XXNMP z-^#y}|02I5zbn5l|DXJ+{F(fP{FOW5&b!;VAAskhvzQOJ)ZkK_j?}nyx{q>=S|OFJ@0tl^}O%-Qo$>%6gCPwg@eLX zAy;@P6b6O2!bdSc5u->`WGb>0If^`mMp31xQPe3K70rrCiW!R8in$7-qD`?-(WzLg zSg-h4u}QH-u}85_v0rgWaYS)UaY6B&;-ccR;+Eo(;)&v^;+f)w;uU`Vt*4izmz9@| zmz|e`m!p@n*D$XXuX3*syjFW{_1fe0rPo(ph67%QypDLC^*Zl$!Rw;eWv?q<*Swy1 zyLu;jS9^cx-Qm5~d%gDt?~UI3y-#~z^1kVP*ZU9e7v8UZfDh>-^KtTV@p1K$`*`@I z`egeQ`4sz<`sjQre5!m5KFH@?pD8|O_POJ8*XM~Z=}Y^vzMQYUugurU*Tpy3 zH`3sn>RaYp?mORih3|IX9ll@q?)Kg5yU+K4?_u9#z9)Q7`JVN??R&@fp6>(SKYSni zKJ|U>`>Hq58}_Dqv%NifkM5n;yQp__?|Hpf_ukq2+ury67(Yutsh_o= zpx;oxQGR3mLj9urV*S*9iGDi2X20ov^ZnZV7Wo;L_$~Ka>-Ul0M!zk7pZaa{JLz}V z?=OD~f2qH(f1rPuzuG_DKi|LHztO+NU+_o%@A^;mpYFfdf2;p4|9$=k{15pb^*`@_ z)&H^ovjFP=zkoggg9Fk6vH}bNLcpwmMFEQgmIbT~=m_Wx*c`Am;In}30XqYB2kZ^F z9Pm6)64=8K*fUTXXcK4`=n?1@=o9D{7#P?maCqS8z>vW3z?i_eKy_eZU|Hb2z~zDM zfvW=71g;O<5V#|7SKyw&eSrr84+WkL{5J4n;P-*o03Q=sRHIfY}3f5BP1M zY+%?x{lJcarw6_o6fh`#(EEe75Bg=W_2A&ay1|EW+N1dK=@@&1VIBYqiaJu-NtZsgLD z$45RL%usEpF0?XKAKDPw6xtGM2wfPuGxTui zvCywWPllceJr{Z<^ykoBTu<*$6nDF@U#PF2x@!=WaS>Y4I z>%v>Z+rxK+-wA&i;S>=N5gw5okrR;@Q4pbxD2*tOsERN|OpY*2iFiL^M#Suhc@f5l zgAuPHgCfUA&WcUH!x(LJLrqNUNjqFtliqTQo|qE*rTqX$I~jUFBy z866!R8?BCB9KAMrYxK709nrg@_eOseeIoi)^x5cdqc28(AAL2ZXUyQ3!k7gyhhwhC z+>Ln<^DyRd%+r`>v1F_ywnwZ*tTeV)tRmJs);HEKRu$Vnc3|v~*kQ4T?AW5%n%L&p zNwGrgf`3eEs0wm*B-YjZcE&rxP5U4;tt0hi#ri_D(*_$ z4{<-m{StRG?$@~A;(m{}jt`1YF~m2;FNxn5e@tz!c2v8l-P9gxFSW1QUmc`Ysr#!3 zsfVgZsDssG)nV#Lb&NV*ov2Pxk5^}?v(!22e08C^SY4*BP*9# zO4^w8ZPK-*ACsx%p2^bWe#yg=M;= zq~$7PJmA6GbT+qk{sz8Y^g-gUhD zc-{EA@r~nmk3Tg2XqrWuLz+`sYFc($ZraAQ?P)vH`E;9f+jRSMxAalzVd(|w&FRzA zXQt0dpP$~AzA$}v`oZ)w=}*%CN`I05Is<0V8Ip`185S8<8MYY?8BQ6!G7Rzz&kU~& z-;CG{bw*M~YDQW{W=3{KZiXhKD5E4pmrcM8X0~T;%G{Eqp^iG3$7nz(x6+KKBYew<^S z%@|yA{<(AdONJ ztEtv3)NI#$soAeNq&cEFt+}MRqWMAdljerzmgctRj^>f(NdZ|PDc}ow7FZY97C00* z7Wftf77Q&ITM$+dSrAhYUogHP!%&b_kW-LfP*Cu0!TN%43VttmT=2BudBMvy| z&MKT+Xe?Y%xTtVj;rE5Fi(HF*iu{TKi~1A|E*f1FQWRbkRTNtkUzAXkRFqj{$SNu+ zswk=|swrwLYA!Mqp`y7(#-f!)>x(`v+FZ1?Xj{?VqOXb$79A-%UUZ`9w$@VHPn)RC z&}M0Kw0YW6ZH=~G+oYYOMcQ|@Q?%2xbG7reE3}>3HQM#sP1-HmPqo{$2en7E=e1Y0 z*R?-uZ)$IAA8H?KpK70LUlkLE;$FpLiwldV7SAc3U))x_uy|$h`r?m^Hx++U{AuyF z;?Ils74I)TReZkqLh+^IYsJ@#e=fdJ{HXZP5~`$UiL}I~#Jye=EIP`k?e->GLwG zj4k8KdX`Dctjlc6dX@Q=^(j-8^)DMzHmq!9S#Vi=Sz=jsSy5R@nXas|OkdW5e}D3B z+0?S>Wi!gwm7OemsI$^J>3ZqpIuC=+U)NtZNH;_`TsKk|tQ)Hf)g|i2>C$wWx*T1e zu0U6$tJ5{=rs?MDjJgH74|Pj*t99#i8+4m=pXff-oz^`mcPbxJKBhdhJfb|RJgGdh zJi9!%TvJ|DUR+*Ut}CxAZz!KyKBIhA`P}lh@`dG#%a@jKDBo1RtNdX3k#fWF@^8vd zmtQKsQvO5vPvtktZ&gqgeid;QWfip*4HeB5lPacF%&jn1EU5UfVrj+lij@@|6&orx zR(w(MWyMz&2P=+Md|h#};&jCi6+cznuXtMVyy8_QsH7@;R!S>vD(x#BE1fF`S7udC zu57RTsB&ZFmddS_yDAS>9;rND`Ay|%L*?1Z^OZkV-mLt!@=oQ0%7>MYEB~xws<pa`n4YFX+5i#>K*kidRM)>-c#?T_tmTP{q>{uVfqMtv|g=G)Tijj=?nBF z`g%Rmzo(z3|3E)Wzd-+?eyM(izC+)s|4M(WrbmrmO~0CfHA8BK)r8c<)~IU|Yf@^) z)uh#A)J&);t|_mntkKsr)HKyhGSmn)b86<-tf*O6v!P~F%_lXV)$FO+SF^w7V9k-5 zV>LHx->FsB#@CLo&8W?)omi`_t*X`6*4Eb7Hr6)RPOqI^JGa(YyQp???b6!iwHs@{ zs69}7xb|4>iP}@O7i+(-y;l2U?Ju=A>&Uv^b+L7&bv1SMbxn0GbyMr+)XlGJturjF z`><|F-Lkqhb)VMlsQaRBPu>2ygLOyhj@4bP`@Zhiy8Cqx>mJuVt$SS$>*;z)Jzwuo z?^y3#?^>T!Ke0ZyKEJ-Oerf&s`VI9P>$lY3sDD`hxc+JV^ZJ+duN#~jd>i~5f*Mo} z{Tc=|jA;mMh-ipzh;4{($ZW`N$ZgOx6d4+d8|oSw8k!m=HGJ7{qT!o{lMSaEt~Ok6 z__^U`!|jGU4SzMt8oe3^HV$bV-Z-jpOk-$cL}PSgTw``)ZexC9L8G>@w6VOgs!`uq z+bA^7XzXm<)p)w`M&rvS`zDX3@TRz?_@=C;lBTMrnx^`url!eFQ<~myn$a|?XEJFPkOJJ(?|=t(t9{9hx1Ry_*A@mCgN{2R4sr4sIUX9M&AsT-m&$`RnHM&EGfQ zZhq4IvV~|NTbP!fEz%a77W)=ii+hV_OYfF}EhAcjTgJA8wZyilTasE*TgJC!v^2I% zYnk0LucftRVaxKCl`X4U*0ii^+1#?Db!=;>p*68JyEV5}(^}M8(yD8%Y@O7KTHkG* z+B&^;M(eEBIjx_yUTP!T0^0_*jcf~Vi)u@1OK;0=t8S}lo79Hd-ff%GHovW{ZDHHu zwqSecyJi?Z>uX+HSS|)^@k;LE9f~PuiX?;1^gf Zu){n0z3>I0d2644(6z??@C~>Qz6U>m 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 AIsgCw From 2df4e49479981ba8d5b12b9747aa62ea1faf019b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Tue, 6 Nov 2018 14:07:34 -0400 Subject: [PATCH 08/20] Add the ability stop VCR from recording and replaying with selector Add `_ online` to a test will allow this behavior. It seems that VCR does not work well when using cookies --- XCDYouTubeKit Tests/XCDYouTubeKitTestCase.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XCDYouTubeKit Tests/XCDYouTubeKitTestCase.m b/XCDYouTubeKit Tests/XCDYouTubeKitTestCase.m index 4dff2c3d..068b3f67 100644 --- a/XCDYouTubeKit Tests/XCDYouTubeKitTestCase.m +++ b/XCDYouTubeKit Tests/XCDYouTubeKitTestCase.m @@ -17,6 +17,7 @@ @interface XCDYouTubeKitTestCase () @end static NSString *const offlineSuffix = @"_offline"; +static NSString *const onlineSuffix = @"_online"; @implementation XCDYouTubeKitTestCase @@ -68,7 +69,7 @@ - (void) setUpTestWithSelector:(SEL)selector } else { - if (onlineTests) + if (onlineTests || [testName hasSuffix:onlineSuffix]) return; self.cassetteURL = [[NSBundle bundleForClass:self.class] URLForResource:testName withExtension:@"json" subdirectory:[@"Cassettes" stringByAppendingPathComponent:NSStringFromClass(self.class)]]; From 9c0586ea72f752486082ddd3f53e39484262f9a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sonee=CC=81=20John?= Date: Tue, 6 Nov 2018 14:08:22 -0400 Subject: [PATCH 09/20] Add new cookie tests --- ...tAgeRestrictedVEVOVideoWithoutCookies.json | 83 +++++++++++++++++++ .../XCDYouTubeProtectedVideosTestCase.m | 43 +++++++++- 2 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 XCDYouTubeKit Tests/Cassettes/XCDYouTubeProtectedVideosTestCase/testAgeRestrictedVEVOVideoWithoutCookies.json diff --git a/XCDYouTubeKit Tests/Cassettes/XCDYouTubeProtectedVideosTestCase/testAgeRestrictedVEVOVideoWithoutCookies.json b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeProtectedVideosTestCase/testAgeRestrictedVEVOVideoWithoutCookies.json new file mode 100644 index 00000000..20ed1221 --- /dev/null +++ b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeProtectedVideosTestCase/testAgeRestrictedVEVOVideoWithoutCookies.json @@ -0,0 +1,83 @@ +[ + { + "body" : "thumbnail_url=https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fdefault.jpg&account_playback_token=QUFFLUhqbk9qcWkzcVBEQk9VMnhfRmlrekFQcHl4X1gyUXxBQ3Jtc0tscnVQd2ZhaGY4cC1uWWU5dktNV25fbXQ5MEtTOURYSE5EQjQ5NktLaUF2TGVBNTZsWHlFQ0I0ZjZ3R3hrTkVVY0tBNUhnMUw1bjZ0MmdKRXZ2aTBZT29GV1AycDZJUi1yLXA4dElKMWc4bFhaUjFaSQ%3D%3D&status=fail&apiary_host_firstparty=&vss_host=s.youtube.com&ucid=UCsXfDf1CDgU3SCt0gxJNXGg&apiary_host=&player_error_log_fraction=1.0&external_play_video=1&length_seconds=419&hl=en_US&cver=1.20181101&innertube_api_version=v1&ldpj=-25&subreason=This+video+may+be+inappropriate+for+some+users.&title=Justin+Timberlake+-+Tunnel+Vision+%28Explicit%29&host_language=en&avg_rating=4.74260807037&watermark=%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_watermark-vflHX6b6E.png%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_hd_watermark-vflAzLcD6.png&c=WEB&no_get_video_log=1&itct=&innertube_context_client_version=1.20181101&url_encoded_fmt_stream_map=&author=justintimberlakeVEVO&reason=Sign+in+to+confirm+your+age×tamp=1541527491&xhr_apiary_host=youtubei.youtube.com&video_id=07FYdnEawAQ&t=1&fexp=23710476%2C23721698%2C23721898%2C23730151%2C23744176%2C23751767%2C23752869%2C23755886%2C23755898%2C23757411%2C23762649%2C23762813%2C23763106%2C23763127%2C23763466%2C23764135%2C23767581%2C23769830%2C23771979%2C23773173%2C9449243%2C9471235%2C9485000&fmt_list=&player_response=%7B%22playabilityStatus%22%3A%7B%22status%22%3A%22LOGIN_REQUIRED%22%2C%22reason%22%3A%22Sign+in+to+confirm+your+age%22%2C%22errorScreen%22%3A%7B%22playerErrorMessageRenderer%22%3A%7B%22subreason%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%22This+video+may+be+inappropriate+for+some+users.%22%7D%5D%7D%2C%22reason%22%3A%7B%22simpleText%22%3A%22Sign+in+to+confirm+your+age%22%7D%2C%22proceedButton%22%3A%7B%22buttonRenderer%22%3A%7B%22style%22%3A%22STYLE_PRIMARY%22%2C%22size%22%3A%22SIZE_DEFAULT%22%2C%22isDisabled%22%3Afalse%2C%22text%22%3A%7B%22simpleText%22%3A%22Sign+in%22%7D%2C%22navigationEndpoint%22%3A%7B%22signInEndpoint%22%3A%7B%22nextEndpoint%22%3A%7B%22urlEndpoint%22%3A%7B%22url%22%3A%22%2Fget_video_info%3Fel%3Ddetailpage%5Cu0026hl%3Den%5Cu0026ps%3Ddefault%5Cu0026video_id%3D07FYdnEawAQ%22%7D%7D%7D%7D%7D%7D%2C%22thumbnail%22%3A%7B%22thumbnails%22%3A%5B%7B%22url%22%3A%22%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fmeh7-vflGevej7.png%22%2C%22width%22%3A140%2C%22height%22%3A100%7D%5D%7D%2C%22icon%22%3A%7B%22iconType%22%3A%22ERROR_OUTLINE%22%7D%7D%7D%7D%2C%22videoDetails%22%3A%7B%22videoId%22%3A%2207FYdnEawAQ%22%2C%22title%22%3A%22Justin+Timberlake+-+Tunnel+Vision+%28Explicit%29%22%2C%22lengthSeconds%22%3A%22419%22%2C%22keywords%22%3A%5B%22Justin+Timberlake%22%2C%22Tunnel+Vision%22%2C%22new+song%22%2C%22new+video%22%2C%22official+video%22%2C%22official%22%2C%22new%22%2C%22JT%22%2C%2220%2F20+Experience%22%2C%22naked%22%2C%22boobs%22%2C%22blurred+lines%22%2C%22nudity%22%2C%22nsfw%22%5D%2C%22channelId%22%3A%22UCsXfDf1CDgU3SCt0gxJNXGg%22%2C%22isCrawlable%22%3Atrue%2C%22thumbnail%22%3A%7B%22thumbnails%22%3A%5B%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEiCKgBEF5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ%3D%3D%5Cu0026rs%3DAOn4CLBS5jl_820CTEk94WX2KXZRPCEcpA%22%2C%22width%22%3A168%2C%22height%22%3A94%7D%2C%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEiCMQBEG5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ%3D%3D%5Cu0026rs%3DAOn4CLCaeepU7pTLb8k6VVnOh_Xii4BPGQ%22%2C%22width%22%3A196%2C%22height%22%3A110%7D%2C%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEjCPYBEIoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE%3D%5Cu0026rs%3DAOn4CLDETi44X_Fn5EtYAM9GG81_175vmA%22%2C%22width%22%3A246%2C%22height%22%3A138%7D%2C%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE%3D%5Cu0026rs%3DAOn4CLBe4qh0OfKEXhzHZZPwNdcmN4zxPw%22%2C%22width%22%3A336%2C%22height%22%3A188%7D%5D%7D%2C%22viewCount%22%3A%2215641330%22%2C%22author%22%3A%22justintimberlakeVEVO%22%2C%22isLiveContent%22%3Afalse%7D%2C%22messages%22%3A%5B%7B%22mealbarPromoRenderer%22%3A%7B%22messageTexts%22%3A%5B%7B%22runs%22%3A%5B%7B%22text%22%3A%22Get+YouTube+without+the+ads.%22%7D%5D%7D%5D%2C%22actionButton%22%3A%7B%22buttonRenderer%22%3A%7B%22style%22%3A%22STYLE_PRIMARY%22%2C%22size%22%3A%22SIZE_DEFAULT%22%2C%22text%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%221+month+free%22%7D%5D%7D%2C%22navigationEndpoint%22%3A%7B%22browseEndpoint%22%3A%7B%22browseId%22%3A%22SPunlimited%22%2C%22params%22%3A%22kgMREg9GRXdoYXRfdG9fd2F0Y2g%253D%22%7D%7D%7D%7D%2C%22dismissButton%22%3A%7B%22buttonRenderer%22%3A%7B%22style%22%3A%22STYLE_BLUE_TEXT%22%2C%22size%22%3A%22SIZE_DEFAULT%22%2C%22text%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%22No+thanks%22%7D%5D%7D%2C%22serviceEndpoint%22%3A%7B%22feedbackEndpoint%22%3A%7B%22feedbackToken%22%3A%22AB9zfpKf9BZ8kxDhm22YRC8SekjBZk0xVQiHmZPw29MSHlIbnjmrlDsYE6etu2m518StbSr39H4adm3JYTUwIrwwBhuVj80CH5PcS7bnYWVCtZPCQnx6zBpKK80m8rrjmni7v19ZNqfD1ysVh4kSJEGrIwFGY2EyLA%22%2C%22uiActions%22%3A%7B%22hideEnclosingContainer%22%3Atrue%7D%7D%7D%7D%7D%2C%22triggerCondition%22%3A%22TRIGGER_CONDITION_POST_AD%22%2C%22style%22%3A%22STYLE_MESSAGE%22%2C%22impressionEndpoints%22%3A%5B%7B%22feedbackEndpoint%22%3A%7B%22feedbackToken%22%3A%22AB9zfpIg3Y7ZZ5JTfXUjxtIlHxvS7sOnGfxLl2InLUV_qGQmm8hvgBno2rjtDwKjLKH4F0Soq64bAuQcSQa43cHuWHVOECa4KY0fXyc1LkP_GdeBczKS8qPvtBct6r3rVc-n8v0BeOIFzAg4V7xk9RBiYhIARpiuWQ%22%2C%22uiActions%22%3A%7B%22hideEnclosingContainer%22%3Afalse%7D%7D%7D%5D%2C%22isVisible%22%3Atrue%2C%22messageTitle%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%22YouTube+Premium%22%7D%5D%7D%7D%7D%5D%2C%22adSafetyReason%22%3A%7B%22isRemarketingEnabled%22%3Atrue%2C%22isFocEnabled%22%3Atrue%7D%7D&gapi_hint_params=m%3B%2F_%2Fscs%2Fabc-static%2F_%2Fjs%2Fk%3Dgapi.gapi.en.BstDmEhpa_Q.O%2Frt%3Dj%2Fd%3D1%2Frs%3DAHpOoo-oqKdOJIcyAi5YyA6pahSkp_ojsw%2Fm%3D__features__&ssl=1&fflags=html5_ultra_low_latency_streaming_responses%3Dtrue%26html5_streaming_xhr_optimize_lengthless_mp4%3Dtrue%26html5_no_placeholder_rollbacks%3Dtrue%26html5_manifestless_always_redux%3Dtrue%26html5_get_video_info_timeout_ms%3D30000%26segment_volume_reporting%3Dtrue%26html5_log_playback_rate_change_killswitch%3Dtrue%26html5_enable_non_diegetic%3Dtrue%26fix_gpt_pos_params%3Dtrue%26use_ima_media_selection_in_bulleit%3Dtrue%26html5_connect_timeout_secs%3D7.0%26mweb_add_ad_info_button_on_fullscreen_only_devices%3Dtrue%26html5_jumbo_mobile_subsegment_readahead_target%3D3.0%26bulleit_mimic_ima_player_api_calls%3Dtrue%26html5_subsegment_readahead_target_buffer_health_secs%3D0.5%26html5_reattach_resource_after_timeout_limit%3D0%26html5_creativeless_vast_on_ima%3Dtrue%26html5_ad_stats_bearer%3Dtrue%26visibility_error_html_dump_sample_rate%3D0.01%26player_external_control_on_classic_desktop%3Dtrue%26low_engagement_player_quality_cap%3D360%26bulleit_get_midroll_info_timeout_ms%3D8000%26spacecast_uniplayer_decorate_manifest%3Dtrue%26html5_log_hls_video_height_change_as_format_change%3Dtrue%26html5_subsegment_readahead_min_load_speed%3D1.5%26web_player_sentinel_is_uniplayer%3Dtrue%26ima_video_ad_with_overlay_class_logging_percentage%3D0.01%26bulleit_use_touch_events_for_skip%3Dtrue%26bulleit_round_up_tsla%3Dtrue%26html5_fludd_suspend%3Dtrue%26html5_disable_audio_slicing%3Dtrue%26bulleit_register_cue_range_events_before_ad_init%3Dtrue%26deprecate_vss_dallas_cache%3Dtrue%26add_border_to_bulleit_mweb_skip%3Dtrue%26html5_prefer_server_bwe3%3Dtrue%26lightweight_watch_video_swf%3Dtrue%26html5_manifestless_shrink_timestamps%3Dtrue%26desktop_shopping_companion_wta_support%3Dtrue%26html5_live_normal_latency_bandwidth_window%3D0.0%26html5_tv_bearer%3Dtrue%26bulleit_use_http_get_by_default_for_get_midroll_info%3Dtrue%26html5_frame_accurate_seek_limit%3D3%26midroll_notify_time_seconds%3D5%26html5_probe_live_using_range%3Dtrue%26html5_request_sizing_multiplier%3D0.8%26html5_unrewrite_timestamps%3Dtrue%26show_interstitial_white%3Dtrue%26defer_player_config_and_threed_deciders%3Dtrue%26html5_jumbo_ull_nonstreaming_mffa_ms%3D4000%26html5_manifestless_interpolate%3Dtrue%26postroll_notify_time_seconds%3D5%26embed_new_info_bar%3Dtrue%26bulleit_extract_delayed_mpu_on_all_placement_init%3Dtrue%26player_destroy_old_version%3Dtrue%26enable_bulleit_for_mweb%3Dtrue%26html5_maximum_readahead_seconds%3D0.0%26bulleit_check_overlay_container_before_show%3Dtrue%26enable_overlays_wta%3Dtrue%26html5_bmffparser_use_fast_read_string%3Dtrue%26bulleit_register_placements_in_order%3Dtrue%26html5_manifestless_no_redundant_seek_to_head%3Dtrue%26mweb_playsinline_webview%3Dtrue%26sdk_wrapper_levels_allowed%3D0%26process_extensions_in_vast_wrappers_for_survey_ads%3Dtrue%26html5_background_cap_idle_secs%3D60%26bulleit_web_dim_skip_using_css%3Dtrue%26playready_on_borg%3Dtrue%26html5_quality_cap_min_age_secs%3D0%26variable_buffer_timeout_ms%3D0%26html5_default_quality_cap%3D0%26kevlar_miniplayer%3Dtrue%26html5_widevine_hw_secure_all%3Dtrue%26mweb_enable_instream_ui_refresh%3Dtrue%26html5_subsegment_readahead_min_buffer_health_secs%3D0.25%26html5_manifestless_accurate_sliceinfo%3Dtrue%26preskip_button_style_ads_backend%3D%26html5_sticky_reduces_discount_by%3D0.0%26html5_enable_embedded_player_visibility_signals%3Dtrue%26mweb_bulleit_show_ad_top_bar_for_phones%3Dtrue%26interaction_click_on_gel_web%3Dtrue%26html5_stale_dash_manifest_retry_factor%3D1.0%26youtubei_for_web%3Dtrue%26use_new_skip_icon%3Dtrue%26html5_stop_video_in_cancel_playback%3Dtrue%26html5_ignore_updates_before_initial_ping%3Dtrue%26html5_disable_non_contiguous%3Dtrue%26embed_snippet_includes_version%3Dtrue%26kevlar_miniplayer_button%3Dtrue%26ad_duration_threshold_for_showing_endcap_seconds%3D15%26html5_ignore_bad_bitrates%3Dtrue%26use_html5_player_event_timeout%3Dtrue%26html5_progressive_fallback%3Dtrue%26html5_variability_discount%3D0.5%26sdk_ad_prefetch_time_seconds%3D-1%26html5_player_autonav_logging%3Dtrue%26html5_subsegment_readahead_load_speed_check_interval%3D0.5%26html5_exile_broken_instances%3Dtrue%26html5_disable_vp8_only_browsers%3Dtrue%26king_crimson_player_redux%3Dtrue%26html5_default_ad_gain%3D0.5%26html5_delay_initial_loading%3Dtrue%26html5_bandwidth_window_size%3D0%26html5_subsegment_readahead_seek_latency_fudge%3D0.5%26enable_afv_div_reset_in_kevlar%3Dtrue%26html5_tight_max_buffer_allowed_impaired_time%3D0.0%26live_fresca_v2%3Dtrue%26html5_dynamic_readahead_growth_rate%3D0.0%26html5_adjust_effective_request_size%3Dtrue%26desktop_videowall_companion_wta_support%3Dtrue%26enable_bulleit_lidar_integration%3Dtrue%26allow_midrolls_on_watch_resume_in_bulleit%3Dtrue%26html5_min_readbehind_cap_secs%3D60%26html5_get_video_info_promiseajax%3Dtrue%26html5_serverside_biscotti_id_wait_ms%3D1000%26html5_request_size_padding_secs%3D3.0%26html5_decode_to_texture_cap%3Dtrue%26use_touch_events_for_bulleit_mweb%3Dtrue%26html5_disable_move_pssh_to_moov%3Dtrue%26dynamic_ad_break_pause_threshold_sec%3D0%26log_playback_associated_web%3Dtrue%26ad_video_end_renderer_duration_milliseconds%3D7000%26html5_platform_minimum_readahead_seconds%3D0.0%26enable_live_premiere_web_player_indicator%3Dtrue%26html5_request_size_min_secs%3D0.0%26html5_min_upgrade_health%3D0%26bulleit_block_player_pause_until_ad_start%3Dtrue%26html5_seeking_buffering_only_playing%3Dtrue%26html5_tight_max_buffer_allowed_bandwidth_stddevs%3D0.0%26skip_ad_button_with_thumbnail%3Dtrue%26html5_disable_preserve_reference%3Dtrue%26mweb_autonav%3Dtrue%26html5_optimality_migration%3Dtrue%26html5_msi_error_fallback%3Dtrue%26set_default_wta_if_missing_for_externs%3Dtrue%26bulleit_update_tsla_cookie%3Dtrue%26html5_subsegment_readahead_require_whitelist%3Dtrue%26ima_disable_reset_active_media_load_timeout%3Dtrue%26html5_qoe_bearer%3Dtrue%26embed_api_deprecation%3Dtrue%26html5_max_readahead_bandwidth_cap%3D0%26max_resolution_for_white_noise%3D360%26web_player_sentinel_launch%3Dtrue%26hide_preskip%3Dtrue%26html5_incremental_parser_buffer_extra_bytes%3D16384%26bulleit_publish_external_playback_events%3Dtrue%26uniplayer_dbp%3Dtrue%26forced_brand_precap_duration_ms%3D2000%26html5_deadzone_multiplier%3D1.0%26html5_pipeline_manifestless%3Dtrue%26web_player_kaios_autoplay%3Dtrue%26html5_new_seeking%3Dtrue%26html5_manifestless_captions%3Dtrue%26html5_subsegment_readahead_min_buffer_health_secs_on_timeout%3D0.1%26use_full_timing_library%3Dtrue%26desktop_action_companion_wta_support%3Dtrue%26html5_probe_primary_delay_base_ms%3D0%26html5_streaming_xhr_buffer_mdat%3Dtrue%26html5_live_pin_to_tail%3Dtrue%26html5_license_constraint_delay%3D5000%26desktop_image_companion_wta_support%3Dtrue%26player_unified_fullscreen_transitions%3Dtrue%26use_new_style%3Dtrue%26mweb_cougar_big_controls%3Dtrue%26enable_html5_conversion_ve_reporting%3Dtrue%26stop_using_ima_sdk_gpt_request_activity%3Dtrue%26show_thumbnail_behind_ypc_offer_module%3Dtrue%26unplugged_tvhtml5_video_preload_on_focus_delay_ms%3D0%26html5_live_abr_repredict_fraction%3D0.0%26html5_inline_video_quality_survey%3Dtrue%26attach_child_on_gel_web%3Dtrue%26html5_suspend_loader%3Dtrue%26set_interstitial_start_button%3Dtrue%26html5_parse_inline_fallback_host%3Dtrue%26html5_use_media_capabilities%3Dtrue%26html5_subsegment_readahead_timeout_secs%3D2.0%26bulleit_remove_client_side_midroll_reactivation%3Dtrue%26html5_allowable_liveness_drift_chunks%3D2%26live_chunk_readahead%3D3%26delay_bulleit_media_load_timer%3Dtrue%26html5_streaming_xhr_progress_includes_latest%3Dtrue%26disable_client_side_midroll_freq_capping_nonpc%3Dtrue%26html5_cut_vss_on_visibility%3Dtrue%26provide_default_wta_reasons%3Dtrue%26html5_use_hasAdvanced_for_pbs%3Dtrue%26html5_ignore_public_setPlaybackQuality%3Dtrue%26html5_variability_no_discount_thresh%3D1.0%26html5_serverside_call_server_on_biscotti_error%3Dtrue%26external_fullscreen_button_click_threshold%3D3%26live_readahead_seconds_multiplier%3D0.8%26html5_pipeline_ultra_low_latency%3Dtrue%26html5_restrict_streaming_xhr_on_sqless_requests%3Dtrue%26html5_max_av_sync_drift%3D50%26html5_shrink_live_timestamps%3Dtrue%26external_fullscreen_button_shown_threshold%3D10%26enable_mute_ad_endpoint_resolution_on_bulleit%3Dtrue%26html5_aspect_from_adaptive_format%3Dtrue%26html5_use_adaptive_live_readahead%3Dtrue%26playready_first_play_expiration%3D-1%26defer_playability_status_fillers%3Dtrue%26html5_fallbacks_delay_primary_probes%3Dtrue%26enable_static_font_size_on_text_only_preview%3Dtrue%26dynamic_ad_break_seek_threshold_sec%3D0%26html5_vis_upgrades_are_resizes%3Dtrue%26html5_hls_min_video_height%3D0%26html5_pause_video_fix%3Dtrue%26android_early_fetch_for_autoplay%3Dtrue%26html5_preload_media%3Dtrue%26desktop_cleanup_companion_on_instream_begin%3Dtrue%26html5_no_shadow_env_data_redux%3Dtrue%26html5_waiting_before_ended%3Dtrue%26html5_remove_pause%3Dfalse%26bulleit_send_engage_ping_on_companion_click%3Dtrue%26web_player_api_logging_fraction%3D0.01%26tvhtml5_min_readbehind_secs%3D20%26call_release_video_in_bulleit%3Dtrue%26html5_adaptation_fix%3Dtrue%26html5_elbow_tracking_tweaks%3Dtrue%26enable_survey_ad_info_dialog%3Dtrue%26web_player_music_visualizer_treatment%3Dfake%26html5_disable_subscribe_new_vis%3Dtrue%26html5_spherical_bicubic_mode%3D1%26html5_widevine_robustness_strings%3Dtrue%26bulleit_disable_preroll_release_on_dispose%3Dtrue%26mweb_muted_autoplay%3Dtrue%26html5_new_vis_fullscreen_and_airplay%3Dtrue%26fast_autonav_in_background%3Dtrue%26mweb_undim_skip_button_on_ad_pause%3Dtrue%26html5_autonav_quality_cap%3D0%26use_always_dimmed_skip_in_bulleit_web%3Dtrue%26html5_repredict_interval_secs%3D0.0%26www_for_videostats%3Dtrue%26safari_enable_spherical%3Dtrue%26disable_client_side_midroll_freq_capping%3Dtrue%26website_actions_throttle_percentage%3D1.0%26mweb_muted_autoplay_animation%3Dshrink%26html5_log_rebuffer_events%3D0%26vss_dni_delayping%3D0%26preskip_countdown_font_size%3D%26html5_serverside_call_server_on_biscotti_timeout%3Dtrue%26flex_theater_mode%3Dtrue%26html5_post_interrupt_readahead%3D20%26interaction_screen_on_gel_web%3Dtrue%26send_html5_api_stats_ads_abandon%3Dtrue%26bulleit_use_video_end_cuerange_for_completion%3Dtrue%26html5_hls_initial_bitrate%3D0%26html5_live_low_latency_bandwidth_window%3D0.0%26html5_av1_thresh%3D0%26html5_incremental_parser_buffer_duration_secs%3D1.5%26enable_live_premieres_vss_live_type_lp%3Dtrue%26autoplay_time%3D8000%26html5_hfr_quality_cap%3D0%26use_refreshed_overlay_buttons%3Dtrue%26html5_live_4k_more_buffer%3Dtrue%26html5_vp9_live_whitelist%3Dtrue%26html5_ad_no_buffer_abort_after_skippable%3Dtrue%26bulleit_use_video_ad_div_as_overlay_container%3Dtrue%26mweb_ios_handle_player_click_by_touch_event%3Dtrue%26html5_qoe_intercept%3D%26fix_bulleit_cue_range_seek%3Dtrue%26allow_live_autoplay%3Dtrue%26html5_video_tbd_min_kb%3D0%26doubleclick_gpt_retagging%3Dtrue%26html5_desktop_vr180_allow_panning%3Dtrue%26html5_reason_reporting_migration%3Dtrue%26html5_manifestless_request_prediction%3Dtrue%26vmap_enabled_living_room%3Dtrue%26html5_probe_media_capabilities%3Dtrue%26enable_text_ad_overlay_link_fix%3Dtrue%26show_thumbnail_on_standard%3Dtrue%26bulleit_terminate_ad_when_ending_with_commands%3Dtrue%26html5_expire_preloaded_players%3Dtrue%26kevlar_allow_multistep_video_init%3Dtrue%26html5_start_date_from_element%3Dtrue%26html5_manifestless_synchronized%3Dtrue%26use_survey_skip_in_0s%3Dtrue%26html5_jumbo_ull_subsegment_readahead_target%3D1.3%26set_interstitial_advertisers_question_text%3Dtrue%26html5_min_readbehind_secs%3D0%26disable_new_pause_state3%3Dtrue%26html5_vp9_live_blacklist_edge%3Dtrue%26show_countdown_on_bumper%3Dtrue%26html5_minimum_readahead_seconds%3D0.0%26html5_live_disable_dg_pacing%3Dtrue%26mweb_cougar%3Dtrue%26html5_live_abr_head_miss_fraction%3D0.0%26html5_min_secs_between_format_selections%3D8.0%26show_interstitial_for_3s%3Dtrue%26mweb_playsinline%3Dtrue%26html5_probe_secondary_during_timeout_miss_count%3D2%26web_player_assume_format3_available%3Dtrue%26html5_readahead_ratelimit%3D3000%26html5_live_no_streaming_impedance_mismatch%3Dtrue%26web_player_sentinel%3Dtrue%26dash_manifest_version%3D5%26html5_media_fullscreen%3Dtrue%26html5_incremental_parser_coalesce_slice_buffers%3Dtrue%26html5_live_ultra_low_latency_bandwidth_window%3D0.0%26web_player_housebrand_video_url_killswitch%3Dtrue%26html5_dont_predict_end_time_in_past%3Dtrue%26variable_load_timeout_ms%3D0%26persist_text_on_preview_button%3Dtrue%26html5_request_size_max_secs%3D31%26html5_max_headm_for_streaming_xhr%3D0%26lasr_captions_holdback_counterfactual_id%3D0%26legacy_autoplay_flag%3Dtrue%26skip_restore_on_abandon_in_bulleit%3Dtrue%26use_forced_linebreak_preskip_text%3Dtrue%26enable_prefetch_for_postrolls%3Dtrue%26html5_max_buffer_duration%3D120%26html5_view_offset%3D0.0%26bulleit_use_cue_video_to_reset_on_stop_ad%3Dtrue%26mpu_visible_threshold_count%3D2%26desktop_companion_wta_support%3Dtrue%26html5_variability_full_discount_thresh%3D3.0%26web_player_response_player_config_parsing%3Dtrue%26html5_playback_data_migration%3Dtrue%26html5_min_buffer_to_resume%3D6%26android_attestation_flow%3Dyt_player%26use_fast_fade_in_0s%3Dtrue%26html5_suspend_manifest_on_pause%3Dtrue%26fixed_padding_skip_button%3Dtrue%26html5_background_quality_cap%3D360&errorcode=150&cr=US&innertube_api_key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&token=1&tmi=1&idpj=-1&csi_page_type=watch&errordetail=1&enablecsi=1&allow_ratings=1", + "headers" : { + "Content-Type" : "application\/x-www-form-urlencoded", + "Alt-Svc" : "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"", + "Content-Encoding" : "br", + "Server" : "YouTube Frontend Proxy", + "X-XSS-Protection" : "1; mode=block; report=https:\/\/www.google.com\/appserve\/security-bugs\/log\/youtube", + "Expires" : "Tue, 27 Apr 1971 19:44:06 EST", + "Cache-Control" : "no-store", + "Date" : "Tue, 06 Nov 2018 18:04:51 GMT", + "Content-Length" : "6576", + "Strict-Transport-Security" : "max-age=31536000", + "X-Content-Type-Options" : "nosniff", + "X-Frame-Options" : "SAMEORIGIN" + }, + "method" : "GET", + "status" : 200, + "uri" : "https:\/\/www.youtube.com\/get_video_info?el=detailpage&hl=en&ps=default&video_id=07FYdnEawAQ" + }, + { + "body" : "errorcode=150&idpj=0&url_encoded_fmt_stream_map=&external_play_video=1&c=WEB&csi_page_type=embed&innertube_api_key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&player_error_log_fraction=1.0&innertube_context_client_version=1.20181101&avg_rating=4.74260807037&length_seconds=419&t=1&fexp=23710476%2C23721698%2C23721898%2C23730151%2C23744176%2C23751767%2C23752869%2C23755886%2C23755898%2C23757411%2C23762649%2C23762813%2C23763106%2C23763127%2C23763466%2C23764135%2C23767581%2C23769830%2C23771979%2C23773173%2C9449243%2C9471235%2C9485000&account_playback_token=QUFFLUhqa0tKSmdpRWp0bTJ1c2FQU2w2bDJYUTJkSl93d3xBQ3Jtc0tsNEhESkRYblFOS19VWEdrVkplbVNUcEdxZDJUZEtMZy1EVlpDdXNkNWNGU1U3bm9aZEZqRUczNXlfVjVCS0wtOVFJcC05Sk13T1I3OW11VjJud1hrRElZVldxZDlReEZHWlVlWEN1alR4blZPdnRKSQ%3D%3D&allow_ratings=1&token=1&title=Justin+Timberlake+-+Tunnel+Vision+%28Explicit%29&no_get_video_log=1&itct=CAEQu2kiEwiqhe-zrcDeAhUIvsEKHV7jBSMop5UD&root_ve_type=51879&hl=en_US&watermark=%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_watermark-vflHX6b6E.png%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_hd_watermark-vflAzLcD6.png&thumbnail_url=https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fdefault.jpg&apiary_host=&author=justintimberlakeVEVO&player_response=%7B%22playabilityStatus%22%3A%7B%22status%22%3A%22UNPLAYABLE%22%2C%22reason%22%3A%22This+video+is+unavailable.%22%2C%22errorScreen%22%3A%7B%22playerErrorMessageRenderer%22%3A%7B%22reason%22%3A%7B%22simpleText%22%3A%22This+video+is+unavailable.%22%7D%2C%22proceedButton%22%3A%7B%22buttonRenderer%22%3A%7B%22style%22%3A%22STYLE_PRIMARY%22%2C%22size%22%3A%22SIZE_DEFAULT%22%2C%22isDisabled%22%3Afalse%2C%22text%22%3A%7B%22simpleText%22%3A%22Watch+on+YouTube%22%7D%2C%22trackingParams%22%3A%22CAUQ8FsiEwiqhe-zrcDeAhUIvsEKHV7jBSMop5UD%22%7D%7D%2C%22thumbnail%22%3A%7B%22thumbnails%22%3A%5B%7B%22url%22%3A%22%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fmeh7-vflGevej7.png%22%2C%22width%22%3A140%2C%22height%22%3A100%7D%5D%7D%2C%22icon%22%3A%7B%22iconType%22%3A%22ERROR_OUTLINE%22%7D%7D%7D%7D%2C%22videoDetails%22%3A%7B%22videoId%22%3A%2207FYdnEawAQ%22%2C%22title%22%3A%22Justin+Timberlake+-+Tunnel+Vision+%28Explicit%29%22%2C%22lengthSeconds%22%3A%22419%22%2C%22keywords%22%3A%5B%22Justin+Timberlake%22%2C%22Tunnel+Vision%22%2C%22new+song%22%2C%22new+video%22%2C%22official+video%22%2C%22official%22%2C%22new%22%2C%22JT%22%2C%2220%2F20+Experience%22%2C%22naked%22%2C%22boobs%22%2C%22blurred+lines%22%2C%22nudity%22%2C%22nsfw%22%5D%2C%22channelId%22%3A%22UCsXfDf1CDgU3SCt0gxJNXGg%22%2C%22isCrawlable%22%3Atrue%2C%22thumbnail%22%3A%7B%22thumbnails%22%3A%5B%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEiCKgBEF5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ%3D%3D%5Cu0026rs%3DAOn4CLBS5jl_820CTEk94WX2KXZRPCEcpA%22%2C%22width%22%3A168%2C%22height%22%3A94%7D%2C%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEiCMQBEG5IWvKriqkDFQgBFQAAAAAYASUAAMhCPQCAokN4AQ%3D%3D%5Cu0026rs%3DAOn4CLCaeepU7pTLb8k6VVnOh_Xii4BPGQ%22%2C%22width%22%3A196%2C%22height%22%3A110%7D%2C%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEjCPYBEIoBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE%3D%5Cu0026rs%3DAOn4CLDETi44X_Fn5EtYAM9GG81_175vmA%22%2C%22width%22%3A246%2C%22height%22%3A138%7D%2C%7B%22url%22%3A%22https%3A%2F%2Fi.ytimg.com%2Fvi%2F07FYdnEawAQ%2Fhqdefault.jpg%3Fsqp%3D-oaymwEjCNACELwBSFryq4qpAxUIARUAAAAAGAElAADIQj0AgKJDeAE%3D%5Cu0026rs%3DAOn4CLBe4qh0OfKEXhzHZZPwNdcmN4zxPw%22%2C%22width%22%3A336%2C%22height%22%3A188%7D%5D%7D%2C%22viewCount%22%3A%2215641330%22%2C%22author%22%3A%22justintimberlakeVEVO%22%2C%22isLiveContent%22%3Afalse%7D%2C%22messages%22%3A%5B%7B%22mealbarPromoRenderer%22%3A%7B%22messageTexts%22%3A%5B%7B%22runs%22%3A%5B%7B%22text%22%3A%22There%E2%80%99s+a+new+YouTube+Music+web+player+for+desktop%21%22%7D%5D%7D%5D%2C%22actionButton%22%3A%7B%22buttonRenderer%22%3A%7B%22style%22%3A%22STYLE_PRIMARY%22%2C%22size%22%3A%22SIZE_DEFAULT%22%2C%22text%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%22Check+it+out%22%7D%5D%7D%2C%22navigationEndpoint%22%3A%7B%22clickTrackingParams%22%3A%22CAQQ7G8iEwiqhe-zrcDeAhUIvsEKHV7jBSMop5UD%22%2C%22urlEndpoint%22%3A%7B%22url%22%3A%22https%3A%2F%2Fmusic.youtube.com%22%7D%7D%2C%22trackingParams%22%3A%22CAQQ7G8iEwiqhe-zrcDeAhUIvsEKHV7jBSMop5UD%22%7D%7D%2C%22dismissButton%22%3A%7B%22buttonRenderer%22%3A%7B%22style%22%3A%22STYLE_BLUE_TEXT%22%2C%22size%22%3A%22SIZE_DEFAULT%22%2C%22text%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%22No+thanks%22%7D%5D%7D%2C%22serviceEndpoint%22%3A%7B%22clickTrackingParams%22%3A%22CAMQ7W8iEwiqhe-zrcDeAhUIvsEKHV7jBSMop5UD%22%2C%22feedbackEndpoint%22%3A%7B%22feedbackToken%22%3A%22AB9zfpLpoyt9NYtc5NWViANI9mubPsthB5fT2ugt08C0HH0mXTRnIKOywiLgj93xPtMv3dtcsj1cNEsdsZg5LBADd8HHt1wZR-xjt-_MNc7wqyTQs3Gj3gnw-WgllvlJiPQmP4xisV1s23s6us4rULOmWpqQZAOkiA%22%2C%22uiActions%22%3A%7B%22hideEnclosingContainer%22%3Atrue%7D%7D%7D%2C%22trackingParams%22%3A%22CAMQ7W8iEwiqhe-zrcDeAhUIvsEKHV7jBSMop5UD%22%7D%7D%2C%22triggerCondition%22%3A%22TRIGGER_CONDITION_POST_AD%22%2C%22style%22%3A%22STYLE_MESSAGE%22%2C%22trackingParams%22%3A%22CAIQ42kYACITCKqF77OtwN4CFQi-wQodXuMFIyinlQM%3D%22%2C%22impressionEndpoints%22%3A%5B%7B%22clickTrackingParams%22%3A%22CAIQ42kYACITCKqF77OtwN4CFQi-wQodXuMFIyinlQM%3D%22%2C%22feedbackEndpoint%22%3A%7B%22feedbackToken%22%3A%22AB9zfpIQVEACdL7DBrXOUEfcVp_-UN2hFmY9R29BmD3zZwsB-QzAXx3t3mtNUMgXufsaA8Gl0q6Ysn4PCaZV5Oga_E1rl8GTQv-KWItRbDexxNENF10oDtTt0jy4hO8BKPqTf4gZqzNLBOW8EpRBYT-RV0tks1B57Q%22%2C%22uiActions%22%3A%7B%22hideEnclosingContainer%22%3Afalse%7D%7D%7D%5D%2C%22isVisible%22%3Atrue%2C%22messageTitle%22%3A%7B%22runs%22%3A%5B%7B%22text%22%3A%22Did+you+know...%22%7D%5D%7D%7D%7D%5D%2C%22adSafetyReason%22%3A%7B%22isEmbed%22%3Atrue%2C%22isRemarketingEnabled%22%3Atrue%2C%22isFocEnabled%22%3Atrue%7D%7D&ssl=1×tamp=1541527490&subreason=&reason=This+video+is+unavailable.&apiary_host_firstparty=&csn=wtfhW6qcH4j8hgbexpeYAg&vss_host=s.youtube.com&status=fail&host_language=en&tmi=1&xhr_apiary_host=youtubei.youtube.com&ldpj=-18&video_id=07FYdnEawAQ&fmt_list=&errordetail=0&cr=US&cver=1.20181101&innertube_api_version=v1&gapi_hint_params=m%3B%2F_%2Fscs%2Fabc-static%2F_%2Fjs%2Fk%3Dgapi.gapi.en.BstDmEhpa_Q.O%2Frt%3Dj%2Fd%3D1%2Frs%3DAHpOoo-oqKdOJIcyAi5YyA6pahSkp_ojsw%2Fm%3D__features__&fflags=html5_dynamic_readahead_growth_rate%3D0.0%26bulleit_get_midroll_info_timeout_ms%3D8000%26flex_theater_mode%3Dtrue%26html5_probe_media_capabilities%3Dtrue%26mweb_muted_autoplay_animation%3Dshrink%26html5_hls_min_video_height%3D0%26defer_playability_status_fillers%3Dtrue%26html5_default_quality_cap%3D0%26hide_preskip%3Dtrue%26preskip_button_style_ads_backend%3D%26html5_cut_vss_on_visibility%3Dtrue%26safari_enable_spherical%3Dtrue%26html5_request_size_padding_secs%3D3.0%26html5_live_no_streaming_impedance_mismatch%3Dtrue%26html5_bmffparser_use_fast_read_string%3Dtrue%26use_ima_media_selection_in_bulleit%3Dtrue%26bulleit_use_video_ad_div_as_overlay_container%3Dtrue%26html5_live_pin_to_tail%3Dtrue%26allow_live_autoplay%3Dtrue%26html5_serverside_call_server_on_biscotti_timeout%3Dtrue%26html5_deadzone_multiplier%3D1.0%26ima_video_ad_with_overlay_class_logging_percentage%3D0.01%26use_survey_skip_in_0s%3Dtrue%26html5_manifestless_interpolate%3Dtrue%26enable_mute_ad_endpoint_resolution_on_bulleit%3Dtrue%26html5_no_placeholder_rollbacks%3Dtrue%26html5_live_normal_latency_bandwidth_window%3D0.0%26skip_restore_on_abandon_in_bulleit%3Dtrue%26desktop_shopping_companion_wta_support%3Dtrue%26dynamic_ad_break_pause_threshold_sec%3D0%26html5_log_rebuffer_events%3D0%26html5_pipeline_ultra_low_latency%3Dtrue%26segment_volume_reporting%3Dtrue%26web_player_kaios_autoplay%3Dtrue%26html5_reattach_resource_after_timeout_limit%3D0%26max_resolution_for_white_noise%3D360%26enable_afv_div_reset_in_kevlar%3Dtrue%26website_actions_throttle_percentage%3D1.0%26set_interstitial_advertisers_question_text%3Dtrue%26html5_ultra_low_latency_streaming_responses%3Dtrue%26use_new_skip_icon%3Dtrue%26html5_live_abr_repredict_fraction%3D0.0%26html5_live_abr_head_miss_fraction%3D0.0%26doubleclick_gpt_retagging%3Dtrue%26bulleit_use_touch_events_for_skip%3Dtrue%26interaction_screen_on_gel_web%3Dtrue%26html5_log_playback_rate_change_killswitch%3Dtrue%26html5_min_upgrade_health%3D0%26html5_start_date_from_element%3Dtrue%26use_refreshed_overlay_buttons%3Dtrue%26html5_qoe_intercept%3D%26web_player_assume_format3_available%3Dtrue%26html5_incremental_parser_buffer_extra_bytes%3D16384%26html5_maximum_readahead_seconds%3D0.0%26enable_text_ad_overlay_link_fix%3Dtrue%26html5_ignore_bad_bitrates%3Dtrue%26external_fullscreen_button_click_threshold%3D3%26ad_video_end_renderer_duration_milliseconds%3D7000%26html5_post_interrupt_readahead%3D20%26html5_manifestless_accurate_sliceinfo%3Dtrue%26bulleit_block_player_pause_until_ad_start%3Dtrue%26vmap_enabled_living_room%3Dtrue%26html5_dont_predict_end_time_in_past%3Dtrue%26html5_repredict_interval_secs%3D0.0%26legacy_autoplay_flag%3Dtrue%26lightweight_watch_video_swf%3Dtrue%26html5_min_secs_between_format_selections%3D8.0%26html5_disable_subscribe_new_vis%3Dtrue%26desktop_action_companion_wta_support%3Dtrue%26html5_background_quality_cap%3D360%26html5_subsegment_readahead_timeout_secs%3D2.0%26disable_client_side_midroll_freq_capping_nonpc%3Dtrue%26enable_bulleit_for_mweb%3Dtrue%26html5_manifestless_shrink_timestamps%3Dtrue%26html5_live_disable_dg_pacing%3Dtrue%26web_player_music_visualizer_treatment%3Dfake%26deprecate_vss_dallas_cache%3Dtrue%26html5_msi_error_fallback%3Dtrue%26html5_background_cap_idle_secs%3D60%26web_player_response_player_config_parsing%3Dtrue%26html5_serverside_biscotti_id_wait_ms%3D1000%26bulleit_use_cue_video_to_reset_on_stop_ad%3Dtrue%26android_early_fetch_for_autoplay%3Dtrue%26show_thumbnail_behind_ypc_offer_module%3Dtrue%26html5_subsegment_readahead_target_buffer_health_secs%3D0.5%26embed_api_deprecation%3Dtrue%26html5_pipeline_manifestless%3Dtrue%26html5_bandwidth_window_size%3D0%26html5_new_seeking%3Dtrue%26embed_snippet_includes_version%3Dtrue%26show_countdown_on_bumper%3Dtrue%26html5_connect_timeout_secs%3D7.0%26bulleit_publish_external_playback_events%3Dtrue%26html5_max_buffer_duration%3D120%26embed_new_info_bar%3Dtrue%26html5_seeking_buffering_only_playing%3Dtrue%26html5_log_hls_video_height_change_as_format_change%3Dtrue%26enable_overlays_wta%3Dtrue%26ad_duration_threshold_for_showing_endcap_seconds%3D15%26bulleit_update_tsla_cookie%3Dtrue%26web_player_sentinel_is_uniplayer%3Dtrue%26lasr_captions_holdback_counterfactual_id%3D0%26fast_autonav_in_background%3Dtrue%26html5_live_ultra_low_latency_bandwidth_window%3D0.0%26html5_streaming_xhr_buffer_mdat%3Dtrue%26html5_stale_dash_manifest_retry_factor%3D1.0%26html5_suspend_loader%3Dtrue%26kevlar_miniplayer_button%3Dtrue%26html5_variability_no_discount_thresh%3D1.0%26kevlar_miniplayer%3Dtrue%26html5_expire_preloaded_players%3Dtrue%26html5_manifestless_always_redux%3Dtrue%26playready_first_play_expiration%3D-1%26desktop_image_companion_wta_support%3Dtrue%26log_playback_associated_web%3Dtrue%26use_forced_linebreak_preskip_text%3Dtrue%26enable_html5_conversion_ve_reporting%3Dtrue%26html5_preload_media%3Dtrue%26www_for_videostats%3Dtrue%26html5_use_media_capabilities%3Dtrue%26html5_spherical_bicubic_mode%3D1%26html5_widevine_hw_secure_all%3Dtrue%26html5_incremental_parser_coalesce_slice_buffers%3Dtrue%26html5_manifestless_request_prediction%3Dtrue%26mweb_cougar%3Dtrue%26low_engagement_player_quality_cap%3D360%26sdk_wrapper_levels_allowed%3D0%26html5_vp9_live_blacklist_edge%3Dtrue%26kevlar_allow_multistep_video_init%3Dtrue%26variable_load_timeout_ms%3D0%26html5_disable_audio_slicing%3Dtrue%26live_fresca_v2%3Dtrue%26use_touch_events_for_bulleit_mweb%3Dtrue%26enable_live_premiere_web_player_indicator%3Dtrue%26html5_stop_video_in_cancel_playback%3Dtrue%26html5_disable_non_contiguous%3Dtrue%26html5_hls_initial_bitrate%3D0%26html5_delay_initial_loading%3Dtrue%26html5_max_av_sync_drift%3D50%26dynamic_ad_break_seek_threshold_sec%3D0%26html5_no_shadow_env_data_redux%3Dtrue%26html5_max_headm_for_streaming_xhr%3D0%26html5_disable_move_pssh_to_moov%3Dtrue%26html5_request_sizing_multiplier%3D0.8%26html5_qoe_bearer%3Dtrue%26html5_incremental_parser_buffer_duration_secs%3D1.5%26html5_decode_to_texture_cap%3Dtrue%26use_full_timing_library%3Dtrue%26html5_get_video_info_timeout_ms%3D30000%26preskip_countdown_font_size%3D%26enable_prefetch_for_postrolls%3Dtrue%26unplugged_tvhtml5_video_preload_on_focus_delay_ms%3D0%26html5_probe_secondary_during_timeout_miss_count%3D2%26delay_bulleit_media_load_timer%3Dtrue%26autoplay_time%3D8000%26tvhtml5_min_readbehind_secs%3D20%26html5_request_size_min_secs%3D0.0%26attach_child_on_gel_web%3Dtrue%26html5_adjust_effective_request_size%3Dtrue%26html5_ad_no_buffer_abort_after_skippable%3Dtrue%26html5_tight_max_buffer_allowed_bandwidth_stddevs%3D0.0%26allow_midrolls_on_watch_resume_in_bulleit%3Dtrue%26html5_live_low_latency_bandwidth_window%3D0.0%26html5_pause_video_fix%3Dtrue%26defer_player_config_and_threed_deciders%3Dtrue%26disable_new_pause_state3%3Dtrue%26html5_subsegment_readahead_require_whitelist%3Dtrue%26bulleit_register_placements_in_order%3Dtrue%26html5_get_video_info_promiseajax%3Dtrue%26html5_minimum_readahead_seconds%3D0.0%26html5_probe_primary_delay_base_ms%3D0%26web_player_api_logging_fraction%3D0.01%26bulleit_extract_delayed_mpu_on_all_placement_init%3Dtrue%26fixed_padding_skip_button%3Dtrue%26html5_max_readahead_bandwidth_cap%3D0%26mpu_visible_threshold_count%3D2%26html5_default_ad_gain%3D0.5%26bulleit_check_overlay_container_before_show%3Dtrue%26provide_default_wta_reasons%3Dtrue%26forced_brand_precap_duration_ms%3D2000%26use_always_dimmed_skip_in_bulleit_web%3Dtrue%26mweb_cougar_big_controls%3Dtrue%26html5_allowable_liveness_drift_chunks%3D2%26use_fast_fade_in_0s%3Dtrue%26html5_view_offset%3D0.0%26fix_bulleit_cue_range_seek%3Dtrue%26html5_remove_pause%3Dfalse%26html5_min_readbehind_cap_secs%3D60%26mweb_autonav%3Dtrue%26html5_quality_cap_min_age_secs%3D0%26html5_subsegment_readahead_seek_latency_fudge%3D0.5%26enable_static_font_size_on_text_only_preview%3Dtrue%26html5_serverside_call_server_on_biscotti_error%3Dtrue%26call_release_video_in_bulleit%3Dtrue%26html5_fludd_suspend%3Dtrue%26html5_new_vis_fullscreen_and_airplay%3Dtrue%26ima_disable_reset_active_media_load_timeout%3Dtrue%26desktop_companion_wta_support%3Dtrue%26bulleit_remove_client_side_midroll_reactivation%3Dtrue%26show_interstitial_white%3Dtrue%26bulleit_use_video_end_cuerange_for_completion%3Dtrue%26html5_suspend_manifest_on_pause%3Dtrue%26html5_tv_bearer%3Dtrue%26html5_jumbo_ull_subsegment_readahead_target%3D1.3%26html5_min_readbehind_secs%3D0%26html5_use_adaptive_live_readahead%3Dtrue%26skip_ad_button_with_thumbnail%3Dtrue%26use_html5_player_event_timeout%3Dtrue%26set_default_wta_if_missing_for_externs%3Dtrue%26youtubei_for_web%3Dtrue%26king_crimson_player_redux%3Dtrue%26html5_adaptation_fix%3Dtrue%26html5_vis_upgrades_are_resizes%3Dtrue%26sdk_ad_prefetch_time_seconds%3D-1%26playready_on_borg%3Dtrue%26bulleit_register_cue_range_events_before_ad_init%3Dtrue%26mweb_add_ad_info_button_on_fullscreen_only_devices%3Dtrue%26html5_inline_video_quality_survey%3Dtrue%26html5_video_tbd_min_kb%3D0%26html5_prefer_server_bwe3%3Dtrue%26html5_disable_vp8_only_browsers%3Dtrue%26html5_manifestless_synchronized%3Dtrue%26html5_subsegment_readahead_min_buffer_health_secs_on_timeout%3D0.1%26set_interstitial_start_button%3Dtrue%26html5_hfr_quality_cap%3D0%26html5_subsegment_readahead_load_speed_check_interval%3D0.5%26html5_variability_discount%3D0.5%26mweb_enable_instream_ui_refresh%3Dtrue%26process_extensions_in_vast_wrappers_for_survey_ads%3Dtrue%26html5_elbow_tracking_tweaks%3Dtrue%26interaction_click_on_gel_web%3Dtrue%26html5_autonav_quality_cap%3D0%26html5_license_constraint_delay%3D5000%26postroll_notify_time_seconds%3D5%26uniplayer_dbp%3Dtrue%26web_player_housebrand_video_url_killswitch%3Dtrue%26live_chunk_readahead%3D3%26html5_frame_accurate_seek_limit%3D3%26html5_progressive_fallback%3Dtrue%26html5_readahead_ratelimit%3D3000%26html5_disable_preserve_reference%3Dtrue%26desktop_videowall_companion_wta_support%3Dtrue%26spacecast_uniplayer_decorate_manifest%3Dtrue%26android_attestation_flow%3Dyt_player%26web_player_sentinel_launch%3Dtrue%26html5_tight_max_buffer_allowed_impaired_time%3D0.0%26html5_enable_embedded_player_visibility_signals%3Dtrue%26html5_manifestless_no_redundant_seek_to_head%3Dtrue%26bulleit_mimic_ima_player_api_calls%3Dtrue%26html5_vp9_live_whitelist%3Dtrue%26html5_aspect_from_adaptive_format%3Dtrue%26html5_subsegment_readahead_min_load_speed%3D1.5%26fix_gpt_pos_params%3Dtrue%26html5_av1_thresh%3D0%26html5_restrict_streaming_xhr_on_sqless_requests%3Dtrue%26html5_reason_reporting_migration%3Dtrue%26variable_buffer_timeout_ms%3D0%26html5_jumbo_ull_nonstreaming_mffa_ms%3D4000%26html5_subsegment_readahead_min_buffer_health_secs%3D0.25%26bulleit_send_engage_ping_on_companion_click%3Dtrue%26html5_creativeless_vast_on_ima%3Dtrue%26send_html5_api_stats_ads_abandon%3Dtrue%26bulleit_use_http_get_by_default_for_get_midroll_info%3Dtrue%26stop_using_ima_sdk_gpt_request_activity%3Dtrue%26external_fullscreen_button_shown_threshold%3D10%26enable_live_premieres_vss_live_type_lp%3Dtrue%26html5_unrewrite_timestamps%3Dtrue%26html5_playback_data_migration%3Dtrue%26html5_variability_full_discount_thresh%3D3.0%26bulleit_disable_preroll_release_on_dispose%3Dtrue%26visibility_error_html_dump_sample_rate%3D0.01%26bulleit_web_dim_skip_using_css%3Dtrue%26mweb_bulleit_show_ad_top_bar_for_phones%3Dtrue%26html5_probe_live_using_range%3Dtrue%26show_thumbnail_on_standard%3Dtrue%26use_new_style%3Dtrue%26html5_streaming_xhr_optimize_lengthless_mp4%3Dtrue%26dash_manifest_version%3D5%26html5_parse_inline_fallback_host%3Dtrue%26html5_waiting_before_ended%3Dtrue%26midroll_notify_time_seconds%3D5%26vss_dni_delayping%3D0%26disable_client_side_midroll_freq_capping%3Dtrue%26html5_jumbo_mobile_subsegment_readahead_target%3D3.0%26html5_exile_broken_instances%3Dtrue%26html5_optimality_migration%3Dtrue%26html5_player_autonav_logging%3Dtrue%26live_readahead_seconds_multiplier%3D0.8%26mweb_ios_handle_player_click_by_touch_event%3Dtrue%26mweb_muted_autoplay%3Dtrue%26player_external_control_on_classic_desktop%3Dtrue%26bulleit_round_up_tsla%3Dtrue%26html5_fallbacks_delay_primary_probes%3Dtrue%26html5_manifestless_captions%3Dtrue%26mweb_undim_skip_button_on_ad_pause%3Dtrue%26web_player_sentinel%3Dtrue%26html5_desktop_vr180_allow_panning%3Dtrue%26html5_enable_non_diegetic%3Dtrue%26bulleit_terminate_ad_when_ending_with_commands%3Dtrue%26enable_bulleit_lidar_integration%3Dtrue%26html5_live_4k_more_buffer%3Dtrue%26html5_min_buffer_to_resume%3D6%26enable_survey_ad_info_dialog%3Dtrue%26player_destroy_old_version%3Dtrue%26html5_ignore_updates_before_initial_ping%3Dtrue%26html5_use_hasAdvanced_for_pbs%3Dtrue%26html5_ignore_public_setPlaybackQuality%3Dtrue%26show_interstitial_for_3s%3Dtrue%26persist_text_on_preview_button%3Dtrue%26desktop_cleanup_companion_on_instream_begin%3Dtrue%26html5_streaming_xhr_progress_includes_latest%3Dtrue%26html5_ad_stats_bearer%3Dtrue%26mweb_playsinline_webview%3Dtrue%26html5_request_size_max_secs%3D31%26html5_shrink_live_timestamps%3Dtrue%26html5_media_fullscreen%3Dtrue%26player_unified_fullscreen_transitions%3Dtrue%26html5_sticky_reduces_discount_by%3D0.0%26mweb_playsinline%3Dtrue%26html5_platform_minimum_readahead_seconds%3D0.0%26html5_widevine_robustness_strings%3Dtrue%26add_border_to_bulleit_mweb_skip%3Dtrue&ucid=UCsXfDf1CDgU3SCt0gxJNXGg&enablecsi=1", + "headers" : { + "Content-Type" : "application\/x-www-form-urlencoded", + "P3P" : "CP=\"This is not a P3P policy! See http:\/\/support.google.com\/accounts\/answer\/151657?hl=en for more info.\"", + "Alt-Svc" : "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"", + "Set-Cookie" : "YSC=gR9v-1cDWmE; path=\/; domain=.youtube.com; httponly", + "Server" : "YouTube Frontend Proxy", + "Content-Encoding" : "br", + "X-XSS-Protection" : "1; mode=block; report=https:\/\/www.google.com\/appserve\/security-bugs\/log\/youtube", + "Expires" : "Tue, 27 Apr 1971 19:44:06 EST", + "Cache-Control" : "no-store", + "Date" : "Tue, 06 Nov 2018 18:04:50 GMT", + "Strict-Transport-Security" : "max-age=31536000", + "Content-Length" : "6623", + "X-Content-Type-Options" : "nosniff", + "X-Frame-Options" : "SAMEORIGIN" + }, + "method" : "GET", + "status" : 200, + "uri" : "https:\/\/www.youtube.com\/get_video_info?el=embedded&hl=en&ps=default&video_id=07FYdnEawAQ" + }, + { + "body" : "