{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_root.js","webpack:///D:/a/_work/1/s/libs/isomorphic-util/dist/requestData.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isBuffer.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_freeGlobal.js","webpack:///(webpack)/buildin/harmony-module.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_nodeUtil.js","webpack:///(webpack)/buildin/global.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/stubFalse.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_cloneBuffer.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/Constants.js","webpack:///D:/a/_work/1/s/libs/experiences-constants/dist/PageTypes.js","webpack:///D:/a/_work/1/s/libs/experiences-constants/dist/BrowserTypes.js","webpack:///D:/a/_work/1/s/libs/core-contracts/dist/resolver-contracts/ConfigOrigin.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/UrlUtility.js","webpack:///D:/a/_work/1/s/libs/experiences-constants/dist/AppTypes.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/UrlSearchParamsHelper.js","webpack:///D:/a/_work/1/s/libs/experiences-constants/dist/Flights.js","webpack:///D:/a/_work/1/s/libs/experimentation-helpers/dist/GetPeregrineFlights.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/Environment.js","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/dist/diagnostic-utils/PerfMarkerHelper.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/PostMessage.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/Logger.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/MessageHandler.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/PerfMarker.js","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/dist/constants/PerfMarkerConstants.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/SubscribableMap.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/WebWorkerCache.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/AppErrors/wwAppErrorTracker.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/AppErrors/wwAppErrors.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Symbol.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getRawTag.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_objectToString.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseGetTag.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isObjectLike.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isSymbol.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_isKey.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isObject.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isFunction.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_isMasked.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_coreJsData.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_toSource.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseIsNative.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getValue.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getNative.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_nativeCreate.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_hashClear.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_hashDelete.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_hashGet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_hashHas.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_hashSet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Hash.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_listCacheClear.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/eq.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_assocIndexOf.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_listCacheDelete.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_listCacheGet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_listCacheHas.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_listCacheSet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_ListCache.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Map.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_mapCacheClear.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_isKeyable.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getMapData.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_mapCacheDelete.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_mapCacheGet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_mapCacheHas.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_mapCacheSet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_MapCache.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/memoize.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_memoizeCapped.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_stringToPath.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_arrayMap.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseToString.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/toString.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_castPath.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_toKey.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseGet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/get.js","webpack:///D:/a/_work/1/s/node_modules/tslib/tslib.es6.js","webpack:///D:/a/_work/1/s/libs/config-data-types/dist/PlatformType.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwResolver/Utility.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/IndexedDb.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_stackClear.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_stackDelete.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_stackGet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_stackHas.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_stackSet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Stack.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_defineProperty.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseAssignValue.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_assignMergeValue.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_createBaseFor.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseFor.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Uint8Array.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_cloneArrayBuffer.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_cloneTypedArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_copyArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseCreate.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_overArg.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getPrototype.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_isPrototype.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_initCloneObject.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseIsArguments.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isArguments.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isLength.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isArrayLike.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isArrayLikeObject.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isPlainObject.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseIsTypedArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseUnary.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isTypedArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_safeGet.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_assignValue.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_copyObject.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseTimes.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_isIndex.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_arrayLikeKeys.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_nativeKeysIn.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseKeysIn.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/keysIn.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/toPlainObject.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseMergeDeep.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseMerge.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/identity.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_apply.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_overRest.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/constant.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseSetToString.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_shortOut.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_setToString.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseRest.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_isIterateeCall.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_createAssigner.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/mergeWith.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isString.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_nativeKeys.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseKeys.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_DataView.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Promise.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_Set.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_WeakMap.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getTag.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isEmpty.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_setCacheAdd.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_setCacheHas.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_SetCache.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_arraySome.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_cacheHas.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_equalArrays.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_mapToArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_setToArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_equalByTag.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_arrayPush.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseGetAllKeys.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_arrayFilter.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/stubArray.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getSymbols.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/keys.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_getAllKeys.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_equalObjects.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseIsEqualDeep.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/_baseIsEqual.js","webpack:///D:/a/_work/1/s/node_modules/lodash-es/isEqual.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwResolver/ConfigCacheBustHelper.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/utilities/Constants.js","webpack:///D:/a/_work/1/s/node_modules/exenv-es6/dist/can-use-dom.js","webpack:///D:/a/_work/1/s/node_modules/@microsoft/fast-layouts-react/dist/utilities/breakpoints.js","webpack:///D:/a/_work/1/s/node_modules/@microsoft/fast-layouts-react/dist/utilities/breakpoint-tracker.js","webpack:///D:/a/_work/1/s/libs/isomorphic-util/dist/DOMHelpersCore.js","webpack:///D:/a/_work/1/s/libs/isomorphic-util/dist/DOMHelpers.js","webpack:///D:/a/_work/1/s/libs/mock-config/dist/MockManager.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/utilities/Utilities.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/BlobFetcher.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/ClientConfigIndexService.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/ClientConfigService.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/ClientManifestService.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/ClientConfigMerger.js","webpack:///D:/a/_work/1/s/libs/config-data-types/dist/BrowserVersionOperator.js","webpack:///D:/a/_work/1/s/libs/core-contracts/dist/appError-contracts/Severity.js","webpack:///D:/a/_work/1/s/libs/core-contracts/dist/appError-contracts/ErrorBehavior.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/TargetScopeMatcher.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/ClientSingleConfigResolver.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/utilities/ResolverAppErrors.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/client-fallback-resolver/ClientResolver.js","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/dist/indexedDb/IndexedDb.js","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/dist/AppErrorHelper.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/ConfigCache.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/ConfigService.js","webpack:///D:/a/_work/1/s/libs/config-resolver/dist/resolver/client-resolver/ConfigResolver.js","webpack:///D:/a/_work/1/s/libs/web-worker-shared-utils/dist/getRootConfigRef.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwResolver/wwGitConfigResolver.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwResolver/WebWorkerResolver.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwResolver/Variables.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/OneServiceConstants.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/Common.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/OneServiceRequest.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/OneServiceFeed.js","webpack:///D:/a/_work/1/s/libs/experiences-constants/dist/service/WpoService.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/Constants.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/Image.js","webpack:///D:/a/_work/1/s/libs/wpo-enterprise/dist/Constants.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/WpoFeed.js","webpack:///D:/a/_work/1/s/libs/wpo-enterprise/dist/WpoEnterpriseHelper.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/MyBriefing.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/ContentPreview.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwCommon/IndexedDBCache.js","webpack:///D:/a/_work/1/s/libs/pdp-service-contracts/dist/TargetType.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/PdpCardData.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/LocalNews.js","webpack:///D:/a/_work/1/s/libs/config-data-types/dist/AudienceModeType.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/AppAnonCookie.js","webpack:///D:/a/_work/1/s/libs/web-worker/dist/wwDataFetch/IndustryNewsArticles.js","webpack:///./src/web-worker.ts"],"names":["root","factory","exports","module","define","amd","a","i","self","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","freeSelf","Function","RequestData","data","this","url","URL","href","innerHeight","devicePixelRatio","canUseCssGrid","requestId","cookie","referer","global","_instance","resetRequestData","resetInstance","getRequestData","getInstance","freeExports","nodeType","freeModule","Buffer","undefined","isBuffer","freeGlobal","originalModule","webpackPolyfill","children","freeProcess","process","nodeUtil","types","require","binding","e","g","window","allocUnsafe","buffer","isDeep","slice","length","result","constructor","copy","AppType","AudienceModeType","PageType","WebWorkerMessageId","allEnvironments","prod","domain","int1","int","intPR","intPef","ExperienceTypes","ocidMapping","MMX","DHP","NTP","scnMapping","WindowsHP","NewsBar","RiverConfigType","MessageType","BrowserType","ConfigOrigin","UrlUtility","CardStyleMode","getParamsWithItems","queryString","params","startsWith","substring","queryArray","split","ndx","parts","queryKey","queryValue","toLowerCase","queryItems","newParam","findIndex","entry","push","UrlSearchParamsHelper","search","searchParams","parseQueryString","keys","sort","map","join","charAt","forEach","keyValuePairs","query","appTypeExpectedFlightMap","Map","Edge","Finance","SuperApp","Traffic","Weather","getPeregrineFlights","flights","cleanedUpFlights","item","lowercaseItem","toLocaleLowerCase","trim","shouldUseGitConfigs","version","configIndexDocId","apptype","expectedGitFlight","prgFlights","includes","containsGitConfigsFlight","_activityId","_apptype","_audienceMode","_browser","_currentFlights","_configIndexDocId","_configRootUrl","_domain","_disableWWConfigPreload","_enableConfigService","_enableCMSPPEConfigs","_isMultiConfigRetrievalEnabled","_disableContentPreviewCache","_isMyFeedFetchDisabled","_sendFeedCallActivityIdInHeader","_configServiceBaseUrl","_cacheBustingConfigUrl","_deviceFormFactor","_env","_featureFlags","_feedServiceUrlBase","_enterpriseServiceUrlBase","_contentServiceUrlBase","_isDebug","_locale","_latitude","_weatherHomeLocationCookie","_weatherDetectLocationCookie","_longitude","_pagetype","_signedIn","_userId","_ocid","_os","_pcsPagetype","_pcsApptype","_pcsLocale","_pcsDomain","_cacheBustingIdentifier","_cacheBypassValue","_perfTimeOffset","_isEnterpriseCompliantNTP","_buildVersion","_isGitConfigs","_configOrigins","_oneServiceApiKey","getSearchParams","isMyFeedFetchDisabled","EdgeChromium","MicrosoftNews","Hub","Windows","Homepage","decodeURIComponent","replace","localeSegmentsArray","locale","countOfSegmentsNeededForLanguagePart","langArray","language","market","overrideLocationHash","locationHash","location","hash","domainExt","hostname","endsWith","itemParams","1","true","aaceValue","getQueryParameter","setDomainEnvironment","setAppType","setPageType","tryParseJson","pcsLocale","script","servicesEndpoints","_servicesEndpoints","_feedServiceDomain","feedService","origin","_crsVersion","crs","v","setUserId","setAudienceModeType","dataInfo","exec","useGitConfigs","setConfigOrigin","JSON","parse","cmsItem","find","featureFlags","disableCachingConfigs","enableConfigService","disableContentPreviewCache","disableMyFeedFetch","shouldSendFeedCallActivityIdInHeader","getContentServiceUrlBase","getFeedServiceUrlBase","getEnterpriseServiceUrlBase","getConfigRootUrl","useMultiConfigsRetrieval","getConfigServiceBaseUrl","getCacheBustingConfigUrl","parseInt","mainTimeOrigin","isNaN","performance","timeOrigin","checkEnterpriseCompliantNTP","getOneServiceApiKey","apiKey","WindowsShell","NewsAndInterests","WindowsNewsPlus","newEnvironment","muid","FirstParty","Office","Views","Unknown","pagetype","audienceModeString","signedIn","Kids","Adult","jsonString","_a","host","set","searchParam","enterpriseFeedServiceDomain","enterpriseFeedService","currentFlights","indexOf","relativePath","pcsApptype","isMultiConfigRetrievalEnabled","isGitConfigs","param","disableActivityIdInHeader","audienceMode","Enterprise","browser","browserType","configOrigins","feature","Production","loc","getEnableConfigService","queryParamOverride","_perfMarkers","_pageTimings","_perfTimeline","subscriptions","sendMessage","message","postMessage","notifySubscription","id","payload","has","fetched","logger","isDebug","console","log","WebWorkerError","error","commandMessageHandlers","dataMessageHandlers","initializeMessageHandler","onmessage","event","info","type","Data","handler","Subscription","Command","commandHandlers","callback","index","ex","executeCommand","registerSubscription","registerCommandMessageHandler","messageId","action","handlers","registerDataMessageHandler","PerfMarkers","perfMarkers","addWWPerfMarker","perfMarker","newMarker","endMeasure","startMeasure","startTime","now","timeTaken","Math","round","addPerfMarker","markerName","customTime","mark","perfTimeOffset","super","arguments","subscriptionCallbacks","subscription","subscribeInternal","setTimeout","tryExecuteSubscriptionCallback","unsubscribe","subscribe","internalSubscriptions","callbacks","webWorkerCache","returnCachedData","Severity","severity","Alert","pb","build","customMessage","FetchAppAnonFailed","source","wwResolverFile","BlankCacheBustingUrl","InvalidCbidResponse","CbidUncaughtErrors","RefreshConfigsCbidError","RefreshConfigsNewConfigsFailed","ErrorParsingConfigTree","HrefNotValid","GetConfigTreeError","GetConfigTreeEmpty","GetConfigTreeNull","PageScopeInvalid","CrsFetchError","RefreshConfigsError","ConfigCrsFetchNon200Response","ConfigCdnFetchNon200Response","IdbConfigInitFailed","IdbConfigReadFailed","IdbConfigWriteFailed","IdbConfigClearFailed","FailedToInitIdb","FailedToSaveIdb","FailedToClearIdb","FailedToHydrateIdb","ConfigsDownloadedByCdn","NoAlert","LocalNewsFetchFailed","LocalNewsLocationIdFetchFailed","FetchPdpDataFailed","ContentPreviewFetchFailed","UnknownComplexInfopaneSlide","ImageFetchFailed","RiverConfigIsNull","FetchOneServiceMyFeedFailed","DesktopFeedEdgeNextConfigIsNull","OneServiceFeedResponseEmpty","FetchIndustryNewsArticlesFailed","FetchMyBriefingFailed","WpoFeedFetchFailed","WpoFeedImageFetchFailed","WpoFeedGetMuidFailure","Array","isArray","objectProto","nativeObjectToString","toString","symToStringTag","isOwn","tag","unmasked","reIsDeepProp","reIsPlainProp","test","uid","maskSrcKey","IE_PROTO","func","funcToString","reIsHostCtor","reIsNative","RegExp","__data__","size","Hash","entries","clear","other","array","splice","pop","ListCache","MapCache","memoize","resolver","TypeError","memoized","args","apply","cache","Cache","rePropName","reEscapeChar","string","charCodeAt","match","number","quote","subString","iteratee","symbolProto","symbolToString","baseToString","path","defaultValue","PlatformType","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","rejected","done","then","stringHasData","idb","indexedDB","IDBObjectStore","getAll","idbPromise","req","withIdbStore","store","isGetAllAllowed","openCursor","onsuccess","cursor","target","continue","storeCallback","put","delete","idbVersion","idbStoreName","dbName","storeName","openreq","open","onerror","onupgradeneeded","createObjectStore","db","transaction","oncomplete","onabort","objectStore","pairs","LARGE_ARRAY_SIZE","Stack","fromRight","keysFunc","iterable","props","Uint8Array","arrayBuffer","byteLength","typedArray","byteOffset","objectCreate","proto","transform","arg","getPrototypeOf","Ctor","propertyIsEnumerable","objectCtorString","typedArrayTags","nodeIsTypedArray","isTypedArray","objValue","customizer","isNew","newValue","reIsUint","inherited","isArr","isArg","isBuff","isType","skipIndexes","String","isProto","srcIndex","mergeFunc","stack","srcValue","stacked","isCommon","isTyped","baseMerge","nativeMax","max","start","otherArgs","nativeNow","Date","count","lastCalled","stamp","remaining","assigner","sources","guard","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ArrayBuffer","ctorString","SetCache","values","add","predicate","bitmask","equalFunc","isPartial","arrLength","othLength","seen","arrValue","othValue","compared","othIndex","symbolValueOf","valueOf","convert","offset","symbolsFunc","resIndex","nativeGetSymbols","getOwnPropertySymbols","symbol","objProps","objLength","skipCtor","objCtor","othCtor","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","baseIsEqual","getLiveCacheBustingIdentifier","cacheBustingConfigUrl","assign","response","fetch","ok","Error","statusText","text","downloadFile","liveCbid","ConfigCachingConstants","canUseDOM","document","createElement","idbName","configStalenessDuration","serverLruConfigCacheMax","idbInitPromiseNameKey","idbReadPromiseNameKey","idbWritePromiseNameKey","defaultBreakpoints","identifyBreakpoint","windowWidth","breakpoints","breakpoint","_breakpoints","_defaultBreakpoint","update","innerWidth","defaultBreakpoint","notifySubscribers","openRequestAnimationFrame","currentBreakpoint","requestFrame","requestAnimationFrame","addEventListener","breakpointConfig","filter","getLocationSearch","mockManager","_mocksEnabled","_mockConfigDictionary","createMockDictionary","URLSearchParams","mockConfigDictionary","_","mockParam","mockFrom","mockWith","buildNumberRegex","getCacheKeyFromConfigRef","configRef","appType","experienceType","instanceSrc","sharedNs","getConfigRefFromKey","sharedPrefix","getChildConfigRefs","resolvedConfig","configRefSet","Set","properties","addConfigRefFromObject","obj","indicies","getConfigReferencePath","configReference","isLocalizationConfig","instance","sendAppError","appErrorCallback","appError","useLocalConfigs","configType","isFeatureConfigType","isLocalOrigin","configOrigin","Local","getLocalDevPrefix","hasMockReplacement","mockReplacement","mocksEnabled","prependConfigType","fetchAsync","relativeUrl","fetchUrl","json","status","catch","failedConfigIndexFetches","fetchAndParseConfigIndex","hashedFileName","isLocalConfigs","failedConfigFetches","fetchAndParseConfig","configFileName","manifestsMap","manifestType","manifestBlobResult","configIndexKey","getFromManifest","configKey","cacheKey","manifest","fileHashes","stringify","substr","configMergeCustomizer","BrowserVersionOperator","ErrorBehavior","targetScopeMatched","configTargetScope","pageTargetScope","audienceModeMatched","pcsBrowserVersion","configBrowserVersion","pcsIntBrowserVersion","operator","Equals","GreaterThan","LessThan","NotEquals","OneOf","browserTypeMatched","deviceFormFactor","deviceTypeMatched","domainMatched","pageExperiments","experimentId","experimentMatched","targetLocale","currentLocale","stringsEqualCaseInsensitive","marketMatched","configStringValue","pageStringValue","lowerCasePageStringValue","equals","notEquals","contains","oneOf","stringTargetScopeTypeMatched","ocid","ocidMatched","os","osMatched","pageType","pcsPageType","configPageType","exact","toUpperCase","segments","pcsPageTypeSegments","pageTypeMatched","platform","platformMatched","lhs","rhs","localeCompare","sensitivity","resolverEnvironment","configServiceParameters","configServiceBaseUrl","targetScope","buildVersion","clientManifestService","clientConfigIndexService","clientConfigService","entity","featureEntityReference","localizationEntityReference","buildNumber","tryGetBuildNumber","itemSpalink","getTime","getBuildNumberAsync","featureManifestTask","fetchAndParseManifest","localizationManifestTask","all","featureIndexHashedFileName","getConfigIndexHashedFileName","localizationIndexHashedFileName","featureConfigIndexTask","localizationConfigIndexTask","indexResults","results","featureIndex","localizationIndex","featureConfigPaths","configs","localizationConfigPaths","configTasks","fetchMathingConfigs","mergeConfigs","config","configPaths","configPath","src","getConfigHashedFileName","allNullFetches","configNullFetches","getFailedConfigFetches","configIndexNullFetches","getFailedConfigIndexFetches","_buildNumber","ResolverAppErrors","IndexedDbWriteFailed","IndexedDbReadFailed","ReceivedConfigFromCdnAsCrsFetchFailed","GetConfigException","Critical","IndexedDbBulkReadFailed","IndexedDbFailedToRemoveCachedConfig","IndexedDbFailedToClearAllCachedConfigs","RenderCachePurgedDueToChangesInConfig","FailedToPurgeRenderCache","RefreshConfigCacheFailed","IndexedDbInitFailed","DifferentCbid","PrgFlightLsWriteError","PrgFlightLsReadError","userImpacting","errorBehavior","Fallback","CrsFetchTimeout","FallbackResolverAppErrors","RecursiveGetFailed","BlobFetchReturnedNull","HighImpact","mergedConfigMap","clientSingleConfigResolver","getFullTree","getConfigRecursive","getFailedFetches","nullFetchUrl","mergedConfig","resolveConfigAsync","unresolvedConfigRefs","returnArray","preInitializedIdbPromise","operationName","createError","baseError","environment","enableIdbCaching","enableConfigCaching","useConfigCaching","stalenessCheckTimestamp","indexedDbMap","readConfigsFromIdb","_readConfigsFromIdb","initializeIdb","indexedDb","queryParams","configMap","experienceConfig","storageTimestamp","configRefCacheKey","writeConfigMapToIdb","idbConfigOpenPromise","configCacheProperties","initializeIndexedDb","indexedDbInitialized","logMessage","indexedDbKey","generateIdbKey","cachedConfigs","cacheSource","idbConfigLookup","idbConfigReadPromise","getObject","cachedConfig","isConfigStale","setObject","loggerCallback","configPromiseMap","_shouldTryFallbackResolver","_hadNetworkError","configServiceParams","shouldUseConfigService","setConfigServiceParams","maxDepth","containsDevOnlyQueryParameters","configPromise","getConfigTreeFromCrs","timer","timeoutInMs","timeoutPromise","isWebWorker","isThisWebWorkerThread","crsFetchPromise","downloadFromCrs","crsResponse","clearTimeout","race","generateCrsUrl","crsVersion","headers","msedgeRef","errorMessage","isWebWorkerPresent","fetchNetworkResponse","activityId","statusCode","sharedNsQsp","configServiceRelativeUrl","fallbackResolverCalled","crsInitComplete","configService","configsEqual","bundleHash","lastBundleHash","configHash","lastConfigHash","locHash","lastLocHash","isConfigBundleLocHashSameAsLastPage","configCache","clientResolver","hadNetworkError","tryGetConfigSync","isLoggerCallbackAvailable","localConfigs","getConfig","sendPerfMarker","initiateConfigService","fromMemoryConfig","networkReadPromise","shouldTryFallbackResolver","cdnConfig","crsConfig","cacheReadPromise","crsConfigMap","getConfigMap","updateCache","clientResolverConfigMap","initialize","perfMarkerCallback","configResolver","visitedHrefs","experienceGitConfigMap","getGitConfigTree","mergedConfigsMap","experienceTypeKey","configsOfThisType","promises","configRefs","childConfigRef","experienceConfigMap","registerConfigResolverTasks","disableWWConfigPreload","env","cdnConfigBaseUrl","configRootUrl","pcsPagetype","pcsDomain","currentRequestTargetScope","getLocaleObject","Web","currentPageExperiments","concat","getTargetScope","scopeWithPeregrineFlights","useIndexedDb","supported","isCachingAllowed","enableCMSPPEConfigs","useConfigService","formConfigServiceUrl","cacheBustingIdentifier","currentTargetScope","initializeGitResolverEnvironment","initializeWwResolver","ClearConfigCache","clearConfigCache","RefreshConfigs","configsRefreshResponse","liveCbId","updateConfigsCache","loadConfigTree","indexedDbPromise","generateKey","configIndexHref","populateConfigsFromIndexedDb","liveCacheBustingIdentifier","cbIdPromise","cachedEntrypointConfig","indexedDbCbid","cbId","clearIndexedDb","donwloadPromiseMap","downloadMap","networkConfig","areConfigsEqual","writeConfigMapToIndexedDb","writeConfigsToIndexedDbCalled","configTreePromiseMap","experienceConfigsNeeded","EntryPointEdgeNext","EntryPoint","River","WeatherCard","PlacementManager","MyBriefing","NewsbarFeed","DesktopFeed","DesktopFeedEdgeNext","DesktopFeedSingleColumn","IndustryNewsCard","multiConfigRetrievalEnabled","crsMaxDepth","getConfigRetrievalMaxDepth","cbid","configTreeTraversalPromiseKey","configTreePromise","gitConfigs","gitConfig","gitResolvedConfig","_name","typeVersion","isMyFeed","MyFeed","StripeMyFeed","addConfigToExperienceConfigMap","getConfigTree","rootConfigIndexId","crsMergedConfig","addConfigToConfigMap","experienceIndex","configIndex","experienceRef","overrideConfig","resolveConfigIndex","mergeConfig","baseConfigUrl","hrefs","promiseArray","downloadExperienceConfig","downloadMergeConfig","getConfigFromNetwork","experienceTypes","checkForExperienceConfigs","configIndexHrefSet","addConfigIndiciesInObject","dynamicPivots","addUniqueConfigIndexHrefInArray","addConfigIndexHrefsFromPivots","staticPivots","pivots","xfeedConfigIndexHref","_id","getChildrenConfigIndexes","initializeIdbPromise","clearObjects","pivot","isCrsFetch","cachedValue","cachedPromise","resultPromise","getExperienceTypeConfig","oneServiceHeaders","oneServiceQueryStringKeys","OneServiceResponseSchema","tryReformatGuid","guid","matches","trySetSearchParam","urlSearchParamsHelper","addStartPerfMarker","addEndPerfMarker","subscribeToExperienceConfig","experienceConfigResolver","experienceConfigReadyPromise","experienceConfigSubscription","aadToken","getOneServiceHeaders","useEnterpriseHeaders","shouldMakeEnterpriseRequest","getEntryPointConfigSetting","shouldUseEnterpriseDomain","getOneServiceFeedCallHeaders","sendFeedCallActivityIdInHeader","entryPointConfig","feedDisplaySetting","subscribeToFeedConfigs","riverConfigsToWait","stripeConfigsToWait","isEnterpriseCompliantNTP","myFeedConfigSubscription","subscribeMultiple","fetchRiverFeed","cacheBypassValue","stripeConfigSubscription","fetchStripeFeed","canFetchFeed","riverConfig","fetchOneServiceFeed","updateOneServiceFeeds","stripeRiverConfig","isEnterpriseRequest","initialRequest","feedId","feedLayoutRequestType","requestPath","urlBase","enterpriseServiceUrlBase","feedServiceUrlBase","feedUrl","urlSearchParams","oneServiceApiKey","FlatView","userId","setDefaultSearchParams","latitude","longitude","infopaneItemCount","complexInfopaneEnabled","disableFlatViewResponse","CardView","useDelta","contentType","timeoutMs","getRequestURL","onFetchComplete","init","credentials","method","sessionId","tabbedInfopaneQueryString","isTabbedInfopaneResponse","responseSchema","subCards","feedItems","requestUrl","feedData","reason","WpoQueryStringKeys","ContentPreview","OneServiceMetadataType","imageSizeMap","width","height","HalfPane","HeadToHead","Mosaic","Triptych","Image_1x1y","_2x_3y","fetchImage","imageMetadata","imageSize","options","overrideImageQuality","getBingImageUrl","imageData","getImageIdFromUrl","auxQsp","focalRegion","focusX","midPoint","x1","x2","focusY","y1","y2","quality","getImageUrl","appErrorPB","min","floor","wpoEnterpriseFlights","registerWpoFeedTasksForEdgeChromium","isPrefetchEnabled","UpdateMyFeed","updateWpoFeed","RenderSingleColumn","messagesToWait","FeedDisplaySetting","desktopFeedEdgeNextConfigSubscription","feedConfig","_b","initialRequestFromConfig","riverSectionCardProviderConfig","feedName","useOneServiceUrl","getUrl","MUID","fetchWpoFeed","logMuidError","request","requestQueryParams","customFeedTimeoutMs","getRequestTimeout","disableQueryType","trimmedFlights","flightId","renderSingleColumn","powerRightRailWithWpo","wpoPageId","wpoSchema","oneServiceFeedPath","pathname","shouldUseNewWpoEndpoint","ipValue","infopaneCount","wpoitems","bypassTrigger","sections","maxPreloadCount","imagesToPrefetch","aboveTheFoldCard","cards","firstInfopaneCard","images","metadata","imageToPrefetch","contentPreviewCache","updateMyBriefing","fetchMyBriefing","subscribeToMyBriefingConfig","myBriefingConfigSubscription","canFetchBriefing","transformResponse","isFeatureEnabled","isIndexedDBSupported","staleItems","dbVersion","registerIndexedDBCommandHandler","hydrate","maxItems","indexName","clearLocalCache","indexedDBData","populateInMemoryCache","dataConverter","convertToMap","convertedData","items","freshnessDuration","hasUpdates","existingItem","saveToIndexedDB","isRefreshComplete","registerContentPreviewTasks","contentPreviewConfigSubscription","cpConfig","contentPreviewItems","toArray","ContentPreviewData","refreshStaleContentPreviewItems","initializecontentPreviewCache","PostTtvr","myFeedSubscription","feedResponse","fetchItems","stripeMyFeedSubscription","stripeFeedResponse","getContentItems","contentItems","filterCachedItems","infopaneContentItems","riverContentItems","contentPreviewPreloadCount","Number","preloadRiverContentItemsInWebWorker","getWWContentPreviewPreloadCount","fetchContentPreviewItem","ContentPreviewCache","fetchContentPreviewItems","parentId","fetchImages","getStaleItems","findStaleItemsInCache","contentPreviewPromises","cacheEntry","riverItems","staleItemsInCache","variation","ContentServiceUrlBase","getAllInfoPaneItems","fetchDoubleWideImageForMMX","isMMX","subItems","subItem","complexSlideContentIds","sizeMap","getInfopaneComplexSlideContentItems","getInfopaneContentItems","contentItem","TargetType","fetchUserPdpData","pdpInfo","WeatherPdp","Location","SportsTeamPdp","Team","SportsPlayerPdp","Player","SportsLeaguePdp","League","MoneyPdp","targetTypes","fdhead","aad","filterQueryString","targetType","countFilter","scn","getPdpUrl","valueGroups","fetchPdpComplete","invalidateWeatherPdp","InvalidateWeatherPdp","isPdpDataFeatureEnabled","latLongLocation","localNewsCache","registerLocalNewsTasks","weatherConfig","fetchLocalNews","weatherPdpData","locationInfo","pdpResponse","defaultLocations","degree","homeLocation","b","updatedDateTime","definitionName","latLong","myLocation","locality","city","region","state","country","countryRegion","displayName","isoCode","mysetting","displayunit","WeatherUnit","Celsius","Fahrenheit","unit","favLocations","convertPdpDataToPdpResponse","detectLocationCookie","getGeoLocation","homeLocationCookie","getHomeLocationfromCookies","getActiveWeatherLocation","ocidLocalNews","getOneServiceOCIDLocal","locationData","lat","long","isEnterpriseDomain","locationParam","urlHref","getLocalNewsUrl","responseData","locationId","isLocalNewsPresent","getLocalNewsUrlForLocationId","fetchLocalNewsComplete","fetchLocalNewsForLocationId","LocalNews","registerFetchAppAnonCookie","AppAnonCookie","appAnonCookieSubscription","appAnonCookieResponse","entryPointConfigType","useOneServiceAuthEndpoints","fetchAppAnonCookieComplete","appAnonCookieExists","fetchAppAnonCookie","registerFetchIndustryNewsArticles","IndustryNewsArticles","industryNewsArticlesSubscription","industryNewsArticlesResponse","AuthToken","industryNewsConfig","industryNewsOcid","fetchIndustryNewsArticles","setting","token","pureReactMarkets","registerOneServiceFeedTasksForEdgeChromium","UpdateMyBriefing","registerMyBriefingTasksForEdgeChromium","Updatepdp","registerPdpTasks"],"mappings":"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","file":"web-worker.7afe5e1c1fccc1517c4d.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 22);\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Singleton class to store client browser data sent through query param to Render Service.\r\n * This is only used under server environment.\r\n */\r\nclass RequestData {\r\n /**\r\n * Initialize the request data instance with passed in client properties\r\n */\r\n constructor(data) {\r\n this.url = new URL(data.href);\r\n this.innerHeight = data.innerHeight;\r\n this.devicePixelRatio = data.devicePixelRatio;\r\n this.canUseCssGrid = data.canUseCssGrid;\r\n this.requestId = data.requestId;\r\n this.cookie = data.cookie;\r\n this.referer = data.referer;\r\n }\r\n /**\r\n * Returns singleton class instance.\r\n * @returns RequestData\r\n */\r\n static getInstance() {\r\n if (global[\"TEST_ENV\"] && !RequestData._instance) {\r\n resetRequestData({\r\n href: \"http://localhost:8080/\",\r\n innerHeight: 768,\r\n devicePixelRatio: 1,\r\n canUseCssGrid: false,\r\n requestId: \"0\",\r\n cookie: \"\",\r\n referer: \"\"\r\n });\r\n }\r\n if (!RequestData._instance) {\r\n // Throw error if the request data has not been set as this should never be the case.\r\n // This likely highlights that the request data was not initialized when handling a\r\n // request when server side rendering.\r\n // TODO - http://osgvsowi/24832691 renable throwing an error.\r\n // This is currently disabled as other singletons that are initialized at import time use\r\n // this they will throw an error before anyone has the chance to initialize the request data\r\n resetRequestData({\r\n href: \"http://localhost:8080/\",\r\n innerHeight: 0,\r\n devicePixelRatio: 0,\r\n canUseCssGrid: false,\r\n requestId: \"0\",\r\n cookie: \"\",\r\n referer: \"\"\r\n });\r\n // throw new Error(\"Request data is not initialized yet through ResetInstance.\");\r\n }\r\n return RequestData._instance;\r\n }\r\n /**\r\n * Reset singleton class instance with passed in info and client settings\r\n * @returns RequestData\r\n */\r\n static resetInstance(data) {\r\n RequestData._instance = new RequestData(data);\r\n return RequestData._instance;\r\n }\r\n}\r\n/**\r\n * The single instance of the RequestData class.\r\n * @type {RequestData}\r\n */\r\nRequestData._instance = null;\r\n/**\r\n * Export function to reset the request data singleton.\r\n * This must be used to set the request data.\r\n */\r\nexport const resetRequestData = RequestData.resetInstance;\r\n/**\r\n * Export get instance function for testing\r\n */\r\nexport const getRequestData = () => (RequestData.getInstance());\r\n//# sourceMappingURL=requestData.js.map","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","module.exports = function(originalModule) {\n\tif (!originalModule.webpackPolyfill) {\n\t\tvar module = Object.create(originalModule);\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"exports\", {\n\t\t\tenumerable: true\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","// © Microsoft Corporation. All rights reserved.\r\n/** The AppType enum. */\r\nexport var AppType;\r\n(function (AppType) {\r\n AppType[AppType[\"MMX\"] = 0] = \"MMX\";\r\n AppType[AppType[\"Edge\"] = 1] = \"Edge\";\r\n AppType[AppType[\"EdgeChromium\"] = 2] = \"EdgeChromium\";\r\n AppType[AppType[\"FirstParty\"] = 3] = \"FirstParty\";\r\n AppType[AppType[\"MicrosoftNews\"] = 4] = \"MicrosoftNews\";\r\n AppType[AppType[\"Office\"] = 5] = \"Office\";\r\n AppType[AppType[\"Hub\"] = 6] = \"Hub\";\r\n AppType[AppType[\"Unknown\"] = 7] = \"Unknown\";\r\n AppType[AppType[\"Views\"] = 8] = \"Views\";\r\n AppType[AppType[\"SuperApp\"] = 9] = \"SuperApp\";\r\n AppType[AppType[\"Windows\"] = 10] = \"Windows\";\r\n AppType[AppType[\"Homepage\"] = 11] = \"Homepage\";\r\n AppType[AppType[\"WindowsShell\"] = 12] = \"WindowsShell\";\r\n AppType[AppType[\"NewsAndInterests\"] = 13] = \"NewsAndInterests\";\r\n AppType[AppType[\"WindowsNewsPlus\"] = 14] = \"WindowsNewsPlus\";\r\n})(AppType || (AppType = {}));\r\n/** The AudienceMode enum. */\r\nexport var AudienceModeType;\r\n(function (AudienceModeType) {\r\n AudienceModeType[\"Enterprise\"] = \"enterprise\";\r\n})(AudienceModeType || (AudienceModeType = {}));\r\n/** The PageType enum */\r\nexport var PageType;\r\n(function (PageType) {\r\n PageType[PageType[\"MMX\"] = 0] = \"MMX\";\r\n PageType[PageType[\"DHP\"] = 1] = \"DHP\";\r\n PageType[PageType[\"NTP\"] = 2] = \"NTP\";\r\n PageType[PageType[\"WindowsHP\"] = 3] = \"WindowsHP\";\r\n PageType[PageType[\"NewsBar\"] = 4] = \"NewsBar\";\r\n PageType[PageType[\"Unknown\"] = 5] = \"Unknown\";\r\n})(PageType || (PageType = {}));\r\n/** The WebWorkerMessageId enum. */\r\nexport var WebWorkerMessageId;\r\n(function (WebWorkerMessageId) {\r\n WebWorkerMessageId[\"AppAnonCookie\"] = \"appanoncookie\";\r\n WebWorkerMessageId[\"MyFeed\"] = \"myfeed\";\r\n WebWorkerMessageId[\"AuthToken\"] = \"AuthToken\";\r\n WebWorkerMessageId[\"UpdateMyFeed\"] = \"updatemyfeed\";\r\n WebWorkerMessageId[\"RefreshConfigs\"] = \"refreshconfigs\";\r\n WebWorkerMessageId[\"DetectConfigChanges\"] = \"detectconfigchanges\";\r\n WebWorkerMessageId[\"ClearConfigCache\"] = \"clearconfigcache\";\r\n WebWorkerMessageId[\"Updatepdp\"] = \"updatepdp\";\r\n WebWorkerMessageId[\"WeatherPdp\"] = \"weatherpdp\";\r\n WebWorkerMessageId[\"MoneyPdp\"] = \"moneypdp\";\r\n WebWorkerMessageId[\"LocalNews\"] = \"localnews\";\r\n WebWorkerMessageId[\"SportsTeamPdp\"] = \"sportsteampdp\";\r\n WebWorkerMessageId[\"SportsPlayerPdp\"] = \"sportsplayerpdp\";\r\n WebWorkerMessageId[\"SportsLeaguePdp\"] = \"sportsleaguepdp\";\r\n WebWorkerMessageId[\"PerfMarkers\"] = \"perfmarkers\";\r\n WebWorkerMessageId[\"ContentPreviewData\"] = \"ContentPreviewData\";\r\n WebWorkerMessageId[\"ContentPreviewCache\"] = \"ContentPreviewCache\";\r\n WebWorkerMessageId[\"PostTtvr\"] = \"PostTtvr\";\r\n WebWorkerMessageId[\"FeedDisplaySetting\"] = \"FeedDisplaySetting\";\r\n WebWorkerMessageId[\"WebWorkerError\"] = \"WebWorkerError\";\r\n WebWorkerMessageId[\"InvalidateWeatherPdp\"] = \"InvalidateWeatherPdp\";\r\n WebWorkerMessageId[\"StripeMyFeed\"] = \"StripeMyFeed\";\r\n WebWorkerMessageId[\"UpdateMyBriefing\"] = \"UpdateMyBriefing\";\r\n WebWorkerMessageId[\"MyBriefing\"] = \"MyBriefing\";\r\n WebWorkerMessageId[\"WindowsFeed\"] = \"WindowsFeed\";\r\n WebWorkerMessageId[\"ViewsData\"] = \"ViewsData\";\r\n WebWorkerMessageId[\"ViewsDataFetch\"] = \"ViewsDataFetch\";\r\n WebWorkerMessageId[\"IndustryNewsArticles\"] = \"IndustryNewsArticles\";\r\n WebWorkerMessageId[\"RenderSingleColumn\"] = \"RenderSingleColumn\";\r\n})(WebWorkerMessageId || (WebWorkerMessageId = {}));\r\n/** The all environments. */\r\nexport const allEnvironments = {\r\n prod: {\r\n domain: \"https://www.msn.com\"\r\n },\r\n int1: {\r\n domain: \"https://int1.msn.com\"\r\n },\r\n int: {\r\n domain: \"https://int.msn.com\"\r\n },\r\n intPR: {\r\n domain: \"https://int.msn.com\"\r\n },\r\n intPef: {\r\n domain: \"https://int.msn.com\"\r\n }\r\n};\r\n/** The Experience Types enum */\r\nexport var ExperienceTypes;\r\n(function (ExperienceTypes) {\r\n ExperienceTypes[\"ContentPreview\"] = \"contentpreview\";\r\n ExperienceTypes[\"River\"] = \"river\";\r\n ExperienceTypes[\"EntryPointEdgeNext\"] = \"entrypointedgenext\";\r\n ExperienceTypes[\"EntryPoint\"] = \"entrypoint\";\r\n ExperienceTypes[\"IndustryNewsCard\"] = \"industrynewscard\";\r\n ExperienceTypes[\"PlacementManager\"] = \"placementmanager\";\r\n ExperienceTypes[\"WeatherCard\"] = \"weathercard\";\r\n ExperienceTypes[\"MyBriefing\"] = \"mybriefrivercard\";\r\n ExperienceTypes[\"NewsbarFeed\"] = \"newsbarfeed\";\r\n ExperienceTypes[\"DesktopFeed\"] = \"desktopfeed\";\r\n ExperienceTypes[\"DesktopFeedEdgeNext\"] = \"desktopfeededgenext\";\r\n ExperienceTypes[\"DesktopFeedSingleColumn\"] = \"desktopfeedsinglecolumn\";\r\n})(ExperienceTypes || (ExperienceTypes = {}));\r\nexport const ocidMapping = {\r\n [PageType.MMX]: \"EMMX\",\r\n [PageType.DHP]: \"spartan-dhp-feeds\",\r\n [PageType.NTP]: \"spartan-ntp-feeds\"\r\n};\r\nexport const scnMapping = {\r\n [PageType.MMX]: \"APP_ANON\",\r\n [PageType.DHP]: \"APP_ANON\",\r\n [PageType.NTP]: \"APP_ANON\",\r\n [PageType.WindowsHP]: \"ANON\",\r\n [PageType.NewsBar]: \"APP_ANON\"\r\n};\r\nexport var RiverConfigType;\r\n(function (RiverConfigType) {\r\n RiverConfigType[\"MyFeed\"] = \"MyFeed\";\r\n RiverConfigType[\"StripeMyFeed\"] = \"StripeMyFeed\";\r\n})(RiverConfigType || (RiverConfigType = {}));\r\nexport var MessageType;\r\n(function (MessageType) {\r\n MessageType[\"Data\"] = \"data\";\r\n MessageType[\"Command\"] = \"command\";\r\n MessageType[\"Subscription\"] = \"subscription\";\r\n})(MessageType || (MessageType = {}));\r\n//# sourceMappingURL=Constants.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Enum for different page types\r\n * @enum\r\n */\r\nexport var PageType;\r\n(function (PageType) {\r\n PageType[\"Article\"] = \"article\";\r\n PageType[\"ArticleFullScreen\"] = \"articlefullscreen\";\r\n PageType[\"DHP\"] = \"dhp\";\r\n PageType[\"Gallery\"] = \"gallery\";\r\n PageType[\"GalleryFullScreen\"] = \"galleryfullscreen\";\r\n PageType[\"Launcher\"] = \"launcher\";\r\n PageType[\"MMX\"] = \"mmx\";\r\n PageType[\"NewsAndInterests\"] = \"newsandinterestshp\";\r\n PageType[\"Newsbar\"] = \"newsbar\";\r\n PageType[\"NTP\"] = \"ntp\";\r\n PageType[\"Story\"] = \"story\";\r\n PageType[\"Shopping\"] = \"shopping\";\r\n PageType[\"ShoppingProductDetails\"] = \"shopping::product\";\r\n PageType[\"ShoppingDealsStoreCategory\"] = \"shopping::deals::storecategory\";\r\n PageType[\"Video\"] = \"video\";\r\n PageType[\"Windows\"] = \"windowshp\";\r\n PageType[\"WindowsShell\"] = \"shellhp\";\r\n})(PageType || (PageType = {}));\r\n/** The AudienceMode enum */\r\nexport var AudienceModeType;\r\n(function (AudienceModeType) {\r\n AudienceModeType[\"Adult\"] = \"adult\";\r\n AudienceModeType[\"Enterprise\"] = \"enterprise\";\r\n AudienceModeType[\"Kids\"] = \"kids\";\r\n})(AudienceModeType || (AudienceModeType = {}));\r\n//# sourceMappingURL=PageTypes.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Enum for different browser types\r\n * @enum\r\n */\r\nexport var BrowserType;\r\n(function (BrowserType) {\r\n BrowserType[\"EdgeChromium\"] = \"edgeChromium\";\r\n})(BrowserType || (BrowserType = {}));\r\n//# sourceMappingURL=BrowserTypes.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Contract related to local dev workflow\r\n */\r\nexport var ConfigOrigin;\r\n(function (ConfigOrigin) {\r\n // Configs are fetched from remote\r\n ConfigOrigin[ConfigOrigin[\"Production\"] = 0] = \"Production\";\r\n // Configs are fetched from local file system\r\n ConfigOrigin[ConfigOrigin[\"Local\"] = 1] = \"Local\";\r\n})(ConfigOrigin || (ConfigOrigin = {}));\r\n//# sourceMappingURL=ConfigOrigin.js.map","// © Microsoft Corporation. All rights reserved.\r\n// IF YOU UPDATE THIS FILE PLEASE UPDATE THE ONE IN @msnews/core\r\n// DUE TO TREE SHAKING ISSUES WHEN IN DEBUG WE CAN'T USE COMMON CODE\r\n// WITHOUT CAUSING ISSUES IN WebWorker\r\nexport var UrlUtility;\r\n(function (UrlUtility) {\r\n /**\r\n * Parse specific parameters from the given query string, allowing for multiple item=key:value.\r\n * This function ONLY parses qsp item=[key]:[value]\r\n * Note: Use first given rule for duplicate key!\r\n * @param {string} queryString - the query string to parse for parameters\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n function getParamsWithItems(queryString) {\r\n const params = [];\r\n const inputKey = \"item\";\r\n if (queryString) {\r\n // Remove the leading ? if it is present\r\n if (queryString.startsWith(\"?\")) {\r\n queryString = queryString.substring(1);\r\n }\r\n // split on the hashes.\r\n queryString = queryString.split(\"#\")[0];\r\n const queryArray = queryString.split(\"&\");\r\n for (let ndx = 0; ndx < queryArray.length; ndx++) {\r\n const parts = queryArray[ndx].split(\"=\");\r\n let queryKey = parts[0];\r\n let queryValue = parts[1];\r\n // If the query key is inputKey (default: \"item\"), and the query values is key:value, then convert the\r\n // value into the actual key/value\r\n if (queryKey.toLowerCase() === inputKey) {\r\n const queryItems = queryValue.split(\":\");\r\n // Ignore value not in \"key:value\" format\r\n if (queryItems.length === 2) {\r\n queryKey = queryItems[0];\r\n queryValue = queryItems[1];\r\n // Don't allow for duplicate query string parameter keys. Use first given rule for duplicate key!\r\n const newParam = { key: queryKey, value: queryValue };\r\n const existingParam = params.findIndex((entry) => entry.key === newParam.key);\r\n if (existingParam === -1) {\r\n params.push(newParam);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return params;\r\n }\r\n UrlUtility.getParamsWithItems = getParamsWithItems;\r\n})(UrlUtility || (UrlUtility = {}));\r\n//# sourceMappingURL=UrlUtility.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Enum for different app types\r\n * @enum\r\n */\r\nexport var AppType;\r\n(function (AppType) {\r\n AppType[\"Community\"] = \"community\";\r\n AppType[\"Edge\"] = \"edge\";\r\n AppType[\"EdgeChromium\"] = \"edgeChromium\";\r\n AppType[\"Finance\"] = \"finance\";\r\n AppType[\"FirstParty\"] = \"firstParty\";\r\n AppType[\"HomePage\"] = \"homePage\";\r\n AppType[\"Hub\"] = \"hub\";\r\n AppType[\"MicrosoftNews\"] = \"microsoftNews\";\r\n AppType[\"MMX\"] = \"mmx\";\r\n AppType[\"NewsAndInterests\"] = \"newsAndInterests\";\r\n AppType[\"Office\"] = \"office\";\r\n AppType[\"qna\"] = \"qna\";\r\n AppType[\"Recipes\"] = \"recipes\";\r\n AppType[\"SharedWidgets\"] = \"sharedWidgets\";\r\n AppType[\"SuperApp\"] = \"superApp\";\r\n AppType[\"Shopping\"] = \"shopping\";\r\n AppType[\"Traffic\"] = \"traffic\";\r\n AppType[\"UGC\"] = \"ugc\";\r\n AppType[\"Views\"] = \"views\";\r\n AppType[\"Weather\"] = \"weather\";\r\n AppType[\"Windows\"] = \"windows\";\r\n AppType[\"WindowsNewsPlus\"] = \"windowsNewsPlus\";\r\n AppType[\"WindowsShell\"] = \"windowsShell\";\r\n AppType[\"WindowsNewsBar\"] = \"windowsNewsbar\";\r\n})(AppType || (AppType = {}));\r\n/**\r\n * Card style mode\r\n */\r\nexport var CardStyleMode;\r\n(function (CardStyleMode) {\r\n CardStyleMode[\"Default\"] = \"Default\";\r\n CardStyleMode[\"WinDashboard\"] = \"WinDashboard\";\r\n CardStyleMode[\"Edge\"] = \"Edge\";\r\n})(CardStyleMode || (CardStyleMode = {}));\r\n//# sourceMappingURL=AppTypes.js.map","// © Microsoft Corporation. All rights reserved.\r\n// IF YOU UPDATE THIS FILE PLEASE UPDATE THE ONE IN @msnews/core\r\n// DUE TO TREE SHAKING ISSUES WHEN IN DEBUG WE CAN'T USE COMMON CODE\r\n// WITHOUT CAUSING ISSUES IN WebWorker\r\n/** Helper class to work on URL search params */\r\nexport class UrlSearchParamsHelper {\r\n constructor(search) {\r\n /** Object that contains all the query strings */\r\n this.searchParams = Object.create(null);\r\n this.parseQueryString(search);\r\n return this;\r\n }\r\n /**\r\n * Sets the query string value\r\n * @param name query string name\r\n * @param value query string value\r\n */\r\n set(name, value) {\r\n if (value !== undefined && value !== null) {\r\n this.searchParams[name] = value;\r\n }\r\n return this;\r\n }\r\n /**\r\n * Gets the query string value\r\n * @param name query string name\r\n */\r\n get(name) {\r\n return this.searchParams[name];\r\n }\r\n /**\r\n * Deletes the query string value\r\n * @param name query string name\r\n */\r\n delete(name) {\r\n delete this.searchParams[name];\r\n }\r\n /**\r\n * Get all the query string params\r\n * @returns all query string params\r\n */\r\n getSearchParams() {\r\n return this.searchParams;\r\n }\r\n /**\r\n * Returns the query parameters as a string\r\n */\r\n toString() {\r\n const keys = Object.keys(this.searchParams);\r\n if (!keys.length) {\r\n return \"\";\r\n }\r\n return keys.sort().map((key) => {\r\n return `${key}=${this.searchParams[key]}`;\r\n }).join(\"&\");\r\n }\r\n /** Parses the query string and adds the values to searchParams */\r\n parseQueryString(queryString) {\r\n if (!queryString) {\r\n return;\r\n }\r\n if (queryString.charAt(0) === \"?\") {\r\n queryString = queryString.substring(1);\r\n }\r\n queryString.split(\"&\").forEach((keyValuePairs) => {\r\n const query = keyValuePairs.split(\"=\");\r\n const name = query[0];\r\n if (!this.get(name)) {\r\n this.searchParams[name] = query[1];\r\n }\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=UrlSearchParamsHelper.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Peregrine flights with prefix\r\n */\r\nexport const PeregrineFlightPrefix = \"prg-\";\r\n/**\r\n * OneService flights with prefix\r\n */\r\nexport const OneServiceFlightPrefix = \"1s-\";\r\n/**\r\n * Config Service v3 endpoint\r\n */\r\nexport const CrsV3Endpoint = \"v3\";\r\n/**\r\n * Git configs indexedDB caching flight\r\n */\r\nexport const GitConfigsIndexedDbTreatment = \"prg-gitconfigs-t\";\r\n//# sourceMappingURL=Flights.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, CrsV3Endpoint, OneServiceFlightPrefix, PeregrineFlightPrefix } from \"@msnews/experiences-constants\";\r\n/**\r\n * Specific flights for app types to allow Git configs\r\n */\r\nexport const appTypeExpectedFlightMap = new Map([\r\n [AppType.Edge, \"prg-gitcfgs-edge\"],\r\n [AppType.Finance, \"prg-gitcfgs-fi\"],\r\n [AppType.SuperApp, \"prg-gitcfgs-t\"],\r\n [AppType.Traffic, \"prg-gitcfgs-traf\"],\r\n [AppType.Weather, \"prg-gitcfgs-wea\"]\r\n]);\r\n/**\r\n * Goes through the array of flights that is given and will filter out any flight that doesn't start with\r\n * prg-. It then sorts them and returns a new string[].\r\n * @param flights Array of flights that we will filter through and return only the peregrine\r\n * @returns specific flights\r\n */\r\nexport function getPeregrineFlights(flights) {\r\n if (!flights || flights.length === 0) {\r\n return flights;\r\n }\r\n const cleanedUpFlights = [];\r\n flights.forEach((item) => {\r\n const lowercaseItem = item.toLocaleLowerCase().trim();\r\n // Including specific 1s- prefix to bypass flightID regards OneService's bing.news backfill. Will fill bug to track/remove this.\r\n if (lowercaseItem.startsWith(PeregrineFlightPrefix) || lowercaseItem.startsWith(OneServiceFlightPrefix)) {\r\n cleanedUpFlights.push(lowercaseItem);\r\n }\r\n });\r\n return cleanedUpFlights.sort();\r\n}\r\n/**\r\n * Check if Git configs should be used\r\n * @param {string} version - CRS version. Example: v2 or v3 (case sensitive)\r\n * @param {string[]} flights Array of flights. Example: [\"testFlight\", \"prg-abcd\"]\r\n * @param {string} configIndexDocId. Example: cms/api/amp/experienceConfigIndex/BBUsYQa\r\n * @param {string} apptype. Example: edgeChromium\r\n * @returns true if git configs are supported\r\n */\r\nexport function shouldUseGitConfigs(version, flights, configIndexDocId, apptype) {\r\n // If app type is not defined or empty, do not use Git configs.\r\n // For local dev scenarion of individual experiences running in standalone, app type is blank.\r\n // Also app type is MUST param in Git configs, if app type is not present, we do not want to attempt Git configs too in prod.\r\n // If version is not present or it is not v3, do not support Git configs\r\n if (!apptype || !version || version !== CrsV3Endpoint) {\r\n return false;\r\n }\r\n // Return true if this does not have configIndexDocId\r\n return !configIndexDocId\r\n // Return true if this is a Git configs treatment flight\r\n || containsGitConfigsFlight(apptype, flights);\r\n}\r\n/**\r\n * Return true if Git configs treatment flight is the expected one for the current apptype\r\n * @param apptype Current apptype\r\n * @param flights array of flights active for current page instance\r\n */\r\nfunction containsGitConfigsFlight(apptype, flights) {\r\n const expectedGitFlight = appTypeExpectedFlightMap.get(apptype);\r\n if (expectedGitFlight) {\r\n const prgFlights = getPeregrineFlights(flights);\r\n return !!(prgFlights && prgFlights.length && prgFlights.includes(expectedGitFlight));\r\n }\r\n return false;\r\n}\r\n//# sourceMappingURL=GetPeregrineFlights.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, PageType, allEnvironments } from \"./Constants\";\r\nimport { AudienceModeType, BrowserType } from \"@msnews/experiences-constants\";\r\nimport { ConfigOrigin } from \"@msnews/core-contracts\";\r\nimport { UrlUtility } from \"./UrlUtility\";\r\nimport { UrlSearchParamsHelper } from \"./UrlSearchParamsHelper\";\r\nimport { shouldUseGitConfigs } from \"@msnews/experimentation-helpers\";\r\n/** The Environment class information about Web Worker environment. */\r\nclass Environment {\r\n /** Returns activity id. */\r\n get activityId() {\r\n return this._activityId;\r\n }\r\n /** Returns app type. */\r\n get apptype() {\r\n return this._apptype;\r\n }\r\n /** Returns audienceMode. */\r\n get audienceMode() {\r\n return this._audienceMode;\r\n }\r\n /** Returns _browser. */\r\n get browser() {\r\n return this._browser;\r\n }\r\n /** Returns current flights. */\r\n get currentFlights() {\r\n return this._currentFlights;\r\n }\r\n /** Returns configIndexDoc. */\r\n get configIndexDocId() {\r\n return this._configIndexDocId;\r\n }\r\n /** Returns config root url. */\r\n get configRootUrl() {\r\n const url = new URL(\"\", this._configRootUrl);\r\n return url;\r\n }\r\n /** Returns domain URL. */\r\n get domain() {\r\n return this._domain;\r\n }\r\n /** Returns a flag indicating whether config preload by web worker is disabled or not. */\r\n get disableWWConfigPreload() {\r\n return this._disableWWConfigPreload;\r\n }\r\n /** Returns a flag indicating whether config service is enabled or not. */\r\n get enableConfigService() {\r\n return this._enableConfigService;\r\n }\r\n /** Returns a flag indicating whether configs will be fetched from CMS:PPE or not. */\r\n get enableCMSPPEConfigs() {\r\n return this._enableCMSPPEConfigs;\r\n }\r\n /** Returns a flag indicating whether multiple config retrieval by web worker is enabled or not. */\r\n get multiConfigRetrievalEnabled() {\r\n return this._isMultiConfigRetrievalEnabled;\r\n }\r\n /** Returns a flag indicating whether content preview caching by web worker is disabled or not. */\r\n get disableContentPreviewCache() {\r\n return this._disableContentPreviewCache;\r\n }\r\n /** Returns a flag indicating whether one service 'myfeed' fetch call by web worker is disabled or not. */\r\n get isMyFeedFetchDisabled() {\r\n return this._isMyFeedFetchDisabled;\r\n }\r\n /**\r\n * Returns a flag indicating whether the one service feed fetch call should send activityID\r\n * in the request header or as a QSP in the URL (current behavior is via QSP).\r\n */\r\n get sendFeedCallActivityIdInHeader() {\r\n return this._sendFeedCallActivityIdInHeader;\r\n }\r\n /** Returns Config Service Base Url. */\r\n get configServiceBaseUrl() {\r\n return this._configServiceBaseUrl;\r\n }\r\n /** Returns cache busting config url. */\r\n get cacheBustingConfigUrl() {\r\n return this._cacheBustingConfigUrl;\r\n }\r\n /** Returns deviceFormFactor. */\r\n get deviceFormFactor() {\r\n return this._deviceFormFactor;\r\n }\r\n /** Returns env. */\r\n get env() {\r\n return this._env;\r\n }\r\n /** Returns feature flags. */\r\n get featureFlags() {\r\n return this._featureFlags;\r\n }\r\n /** The schema://domain to be used for the main feed URL */\r\n get feedServiceUrlBase() {\r\n return new URL(\"\", this._feedServiceUrlBase);\r\n }\r\n /** The schema://domain to be used for the main feed URL for enterprise */\r\n get enterpriseServiceUrlBase() {\r\n if (!this._enterpriseServiceUrlBase) {\r\n return undefined;\r\n }\r\n return new URL(\"\", this._enterpriseServiceUrlBase);\r\n }\r\n /** Returns the content service base url */\r\n get ContentServiceUrlBase() {\r\n // If I mutate the same object, I will need to revert to the original state somewhere.\r\n // For safety reason, it is better to use a new Object\r\n return new URL(\"\", this._contentServiceUrlBase);\r\n }\r\n /** Returns debug status. */\r\n get isDebug() {\r\n return this._isDebug;\r\n }\r\n /** Returns locale. */\r\n get locale() {\r\n return this._locale;\r\n }\r\n /** Returns latitude. */\r\n get latitude() {\r\n return this._latitude;\r\n }\r\n /** Returns weather home location cookie */\r\n get homeLocationCookie() {\r\n return this._weatherHomeLocationCookie;\r\n }\r\n /** Returns weather detect location cookie */\r\n get detectLocationCookie() {\r\n return this._weatherDetectLocationCookie;\r\n }\r\n /** Returns longitude. */\r\n get longitude() {\r\n return this._longitude;\r\n }\r\n /** Returns page type. */\r\n get pagetype() {\r\n return this._pagetype;\r\n }\r\n /** Returns signedIn state. */\r\n get signedIn() {\r\n return this._signedIn;\r\n }\r\n /** Returns user id. */\r\n get userId() {\r\n return this._userId;\r\n }\r\n /** Returns ocid string. */\r\n get ocid() {\r\n return this._ocid;\r\n }\r\n /** Returns Operating system type. */\r\n get os() {\r\n return this._os;\r\n }\r\n /** Returns pagetype given by pcs. */\r\n get pcsPagetype() {\r\n return this._pcsPagetype;\r\n }\r\n /** Returns apptype given by pcs. */\r\n get pcsApptype() {\r\n return this._pcsApptype;\r\n }\r\n /** Returns locale object given by pcs. */\r\n get pcsLocale() {\r\n return this._pcsLocale;\r\n }\r\n /** Returns domain object given by pcs. */\r\n get pcsDomain() {\r\n return this._pcsDomain;\r\n }\r\n /** Returns cache busting identifier given by pcs. */\r\n get cacheBustingIdentifier() {\r\n return this._cacheBustingIdentifier;\r\n }\r\n /** Returns cache bypass value from stored cookie. */\r\n get cacheBypassValue() {\r\n return this._cacheBypassValue;\r\n }\r\n /**\r\n * The performance time offset from the main thread to add\r\n * to our web-worker timings to normalize with the main thread timeline\r\n */\r\n get perfTimeOffset() {\r\n return this._perfTimeOffset;\r\n }\r\n /** Returns _isEnterpriseCompliantNTP */\r\n get isEnterpriseCompliantNTP() {\r\n return this._isEnterpriseCompliantNTP;\r\n }\r\n /** Returns Bundle build version */\r\n get buildVersion() {\r\n return this._buildVersion;\r\n }\r\n /** True if this is git configs flight */\r\n get isGitConfigs() {\r\n return this._isGitConfigs;\r\n }\r\n /** Fetches local dev environment for client resolver */\r\n get configOrigins() {\r\n return this._configOrigins;\r\n }\r\n /** Returns _oneServiceApiKey */\r\n get oneServiceApiKey() {\r\n return this._oneServiceApiKey;\r\n }\r\n /**\r\n * Get all search params\r\n * @returns all search params\r\n */\r\n getSearchParams() {\r\n return this.searchParams && this.searchParams.getSearchParams();\r\n }\r\n /**\r\n * Checks if prefetch is enabled for the current AppType\r\n */\r\n get isPrefetchEnabled() {\r\n return !this.isMyFeedFetchDisabled &&\r\n (this.apptype === AppType.EdgeChromium ||\r\n this.apptype === AppType.Edge ||\r\n this.apptype === AppType.MMX ||\r\n this.apptype === AppType.MicrosoftNews ||\r\n this.apptype === AppType.Hub ||\r\n this.apptype === AppType.Windows ||\r\n this.apptype === AppType.Homepage);\r\n }\r\n /**\r\n * Extract query string param in the url.\r\n * @param name - Query param name\r\n * @returns Query param value\r\n */\r\n getQueryParameter(name) {\r\n const queryValue = this.searchParams.get(name);\r\n if (typeof queryValue === \"undefined\") {\r\n return null;\r\n }\r\n return decodeURIComponent(queryValue.replace(/\\+/g, \" \")) || \"\";\r\n }\r\n /**\r\n * Get locale object from locale string. e.g. en-us, en-ca, fr-ca\r\n */\r\n getLocaleObject() {\r\n const localeSegmentsArray = this.locale.split(\"-\");\r\n let countOfSegmentsNeededForLanguagePart = localeSegmentsArray.length;\r\n if (countOfSegmentsNeededForLanguagePart > 2) {\r\n countOfSegmentsNeededForLanguagePart = countOfSegmentsNeededForLanguagePart - 1;\r\n }\r\n const langArray = localeSegmentsArray.slice(0, countOfSegmentsNeededForLanguagePart);\r\n langArray.join(\"-\");\r\n return {\r\n language: langArray[0],\r\n market: langArray[1]\r\n };\r\n }\r\n /**\r\n * Initialize the environment.\r\n * @param overrideLocationHash - The location href override used in testing\r\n */\r\n init(overrideLocationHash) {\r\n let locationHash = overrideLocationHash || location.hash;\r\n locationHash = locationHash.charAt(0) === \"#\" ? locationHash.substring(1) : locationHash;\r\n this.searchParams = new UrlSearchParamsHelper(locationHash);\r\n this.domainExt = location.hostname.endsWith(\".cn\") ? \"cn\" : \"com\";\r\n // This only finds multiples of item=key:value qsp. If keys are the same, first given will be used (similar to UrlSearchParamsHelper).\r\n this.itemParams = UrlUtility.getParamsWithItems(locationHash);\r\n this._isDebug = ((this.searchParams.get(\"debug\") || \"\").toLowerCase() in { 1: 1, true: 1 });\r\n const aaceValue = this.getQueryParameter(\"aace\");\r\n this._signedIn = !!aaceValue;\r\n this.setDomainEnvironment();\r\n this._pcsApptype = this.getQueryParameter(\"apptype\") || undefined;\r\n this.setAppType();\r\n this._pcsPagetype = this.getQueryParameter(\"pagetype\") || undefined;\r\n this.setPageType();\r\n const locale = this.getQueryParameter(\"locale\") || undefined;\r\n this._pcsLocale = locale ? this.tryParseJson(locale) : undefined;\r\n this._locale = this.pcsLocale &&\r\n (this.pcsLocale.language\r\n + \"-\"\r\n + (this.pcsLocale.script ? this.pcsLocale.script + \"-\" : \"\")\r\n + this.pcsLocale.market).toLowerCase() || \"en-us\";\r\n const servicesEndpoints = this.getQueryParameter(\"servicesEndpoints\") || undefined;\r\n this._servicesEndpoints = servicesEndpoints && this.tryParseJson(servicesEndpoints) || undefined;\r\n // Get from headdata if possible.\r\n // Else using location.origin is okay (current MMX scenario) since it'd use .cn version for China.\r\n this._feedServiceDomain =\r\n this._servicesEndpoints &&\r\n this._servicesEndpoints.feedService &&\r\n this._servicesEndpoints.feedService.domain || location.origin;\r\n this._crsVersion = this._servicesEndpoints\r\n && this._servicesEndpoints.crs\r\n && this._servicesEndpoints.crs.v;\r\n this.setUserId();\r\n this._activityId = this.getQueryParameter(\"aid\");\r\n this._ocid = this.getQueryParameter(\"ocid\") || undefined;\r\n this._os = this.getQueryParameter(\"os\") || undefined;\r\n this.setAudienceModeType();\r\n const dataInfo = this.getQueryParameter(\"dataInfo\");\r\n this._currentFlights = ((/f:\\s*([^;]+)/i.exec(dataInfo) || {})[1] || \"\").toLowerCase();\r\n this._configIndexDocId = this.getQueryParameter(\"configIndexDocId\");\r\n // Make sure that _apptype, _crsVersion, _configIndexDocId and _currentFlights are set before calling this function.\r\n this._isGitConfigs = this.useGitConfigs();\r\n this._configOrigins = this.setConfigOrigin();\r\n this._browser = JSON.parse(this.getQueryParameter(\"browser\")) || undefined;\r\n const cmsItem = this.itemParams.find(item => item.key === \"cms\");\r\n this._enableCMSPPEConfigs = !!(cmsItem && cmsItem.value === \"ppe\");\r\n this._pcsDomain = this.getQueryParameter(\"domain\") || undefined;\r\n this._featureFlags = JSON.parse(this.getQueryParameter(\"featureFlags\")) || {};\r\n this._deviceFormFactor = this.getQueryParameter(\"deviceFormFactor\") || undefined;\r\n this._weatherHomeLocationCookie = this.getQueryParameter(\"weaSpartanHomeLocation\") ? this.getQueryParameter(\"weaSpartanHomeLocation\") : this.getQueryParameter(\"weaPeregrineHomeLocation\");\r\n this._weatherDetectLocationCookie = this.getQueryParameter(\"weaDetectLocation\") ? this.getQueryParameter(\"weaDetectLocation\") : this.getQueryParameter(\"weaPeregrineDetectLocation\");\r\n this._disableWWConfigPreload = this.featureFlags.disableCachingConfigs\r\n ? this.featureFlags.disableCachingConfigs === \"true\"\r\n : false;\r\n this._enableConfigService = this.featureFlags.enableConfigService\r\n ? this.featureFlags.enableConfigService === \"true\"\r\n : true;\r\n this._disableContentPreviewCache = this.featureFlags.disableContentPreviewCache\r\n ? this.featureFlags.disableContentPreviewCache === \"true\"\r\n : false;\r\n this._isMyFeedFetchDisabled = this.featureFlags.disableMyFeedFetch\r\n ? this.featureFlags.disableMyFeedFetch === \"true\"\r\n : false;\r\n this._sendFeedCallActivityIdInHeader = this.shouldSendFeedCallActivityIdInHeader();\r\n this._contentServiceUrlBase = this.getContentServiceUrlBase();\r\n this._feedServiceUrlBase = this.getFeedServiceUrlBase();\r\n this._enterpriseServiceUrlBase = this.getEnterpriseServiceUrlBase();\r\n this._configRootUrl = this.getConfigRootUrl();\r\n this._latitude = this.getQueryParameter(\"lat\");\r\n this._longitude = this.getQueryParameter(\"long\");\r\n this._isMultiConfigRetrievalEnabled = this.useMultiConfigsRetrieval();\r\n this._configServiceBaseUrl = new URL(this.getConfigServiceBaseUrl(this._isMultiConfigRetrievalEnabled));\r\n this._cacheBustingIdentifier = this.getQueryParameter(\"cbid\");\r\n this._cacheBustingConfigUrl = new URL(this.getCacheBustingConfigUrl());\r\n this._cacheBypassValue = parseInt(this.getQueryParameter(\"cbypass\")) || 0;\r\n const mainTimeOrigin = parseInt(this.getQueryParameter(\"mainTimeOrigin\"));\r\n this._perfTimeOffset = !isNaN(mainTimeOrigin)\r\n ? performance.timeOrigin - mainTimeOrigin\r\n : 0;\r\n this._isEnterpriseCompliantNTP = this.checkEnterpriseCompliantNTP();\r\n this._buildVersion = this.getQueryParameter(\"buildVersion\");\r\n this._oneServiceApiKey = this.getOneServiceApiKey();\r\n }\r\n /**\r\n * Get the ApiKey that should be used by the current AppType\r\n * Please work OneService (aka: IDX) before updating it as this can break features\r\n * even if the call succeeds.\r\n */\r\n getOneServiceApiKey() {\r\n let apiKey;\r\n switch (this.apptype) {\r\n case AppType.WindowsShell:\r\n apiKey = \"pWw5OmQehOA0XNfgcgrTrwEJZJJJzE83ovtTQx6JRG\";\r\n break;\r\n case AppType.NewsAndInterests:\r\n case AppType.WindowsNewsPlus:\r\n apiKey = \"AEbyVYqTQAPvg4lWwMSFHaLkDzl3weRKKIDDInLQUj\";\r\n break;\r\n default:\r\n apiKey = \"0QfOX3Vn51YCzitbLaRkTTBadtWpgTN8NZLW0C1SEM\";\r\n }\r\n return apiKey;\r\n }\r\n /**\r\n * Set the domain and cdn urls.\r\n * @param domainEnvironment - The domain environment\r\n */\r\n setDomainEnvironment() {\r\n this._env = this.getQueryParameter(\"env\");\r\n const newEnvironment = allEnvironments[this._env];\r\n if (newEnvironment) {\r\n this._domain = newEnvironment.domain;\r\n }\r\n else {\r\n this._env = \"prod\";\r\n this._domain = allEnvironments.prod.domain;\r\n }\r\n }\r\n /** Set the user id. */\r\n setUserId() {\r\n const muid = this.getQueryParameter(\"muid\");\r\n if (muid) {\r\n this._userId = `m-${muid}`;\r\n }\r\n }\r\n /**\r\n * Set the app type.\r\n * @param apptype - The app type\r\n */\r\n setAppType() {\r\n let apptype = this.getQueryParameter(\"apptype\") || \"\";\r\n apptype = apptype.toLowerCase();\r\n switch (apptype) {\r\n case \"mmx\":\r\n this._apptype = AppType.MMX;\r\n break;\r\n case \"edge\":\r\n this._apptype = AppType.Edge;\r\n break;\r\n case \"edgechromium\":\r\n this._apptype = AppType.EdgeChromium;\r\n break;\r\n case \"microsoftnews\":\r\n this._apptype = AppType.MicrosoftNews;\r\n break;\r\n case \"firstparty\":\r\n this._apptype = AppType.FirstParty;\r\n break;\r\n case \"hub\":\r\n this._apptype = AppType.Hub;\r\n break;\r\n case \"office\":\r\n this._apptype = AppType.Office;\r\n break;\r\n case \"views\":\r\n this._apptype = AppType.Views;\r\n break;\r\n case \"superapp\":\r\n this._apptype = AppType.SuperApp;\r\n break;\r\n case \"windows\":\r\n this._apptype = AppType.Windows;\r\n break;\r\n case \"homepage\":\r\n this._apptype = AppType.Homepage;\r\n break;\r\n case \"windowsshell\":\r\n this._apptype = AppType.WindowsShell;\r\n break;\r\n case \"newsandinterests\":\r\n this._apptype = AppType.NewsAndInterests;\r\n break;\r\n case \"windowsnewsplus\":\r\n this._apptype = AppType.WindowsNewsPlus;\r\n break;\r\n default:\r\n this._apptype = AppType.Unknown;\r\n }\r\n }\r\n /**\r\n * Set the page type.\r\n * @param pagetype - The page type\r\n */\r\n setPageType() {\r\n let pagetype = this.getQueryParameter(\"pagetype\") || \"\";\r\n pagetype = pagetype.toLowerCase();\r\n switch (pagetype) {\r\n case \"mmx\":\r\n this._pagetype = PageType.MMX;\r\n break;\r\n case \"dhp\":\r\n this._pagetype = PageType.DHP;\r\n break;\r\n case \"ntp\":\r\n this._pagetype = PageType.NTP;\r\n break;\r\n case \"windowshp\":\r\n this._pagetype = PageType.WindowsHP;\r\n break;\r\n case \"newsbar\":\r\n this._pagetype = PageType.NewsBar;\r\n break;\r\n default:\r\n this._pagetype = PageType.Unknown;\r\n }\r\n }\r\n /**\r\n * Set the Audience mode type.\r\n */\r\n setAudienceModeType() {\r\n const audienceModeString = this.getQueryParameter(\"audienceMode\") || \"\";\r\n // Don't know if the previous logic is correct, keep it for now\r\n this._audienceMode = environment.signedIn && (this.getQueryParameter(\"child\") || this.getQueryParameter(\"query\") === AudienceModeType.Kids)\r\n ? AudienceModeType.Kids\r\n : audienceModeString.toLowerCase() || AudienceModeType.Adult;\r\n }\r\n /**\r\n * Attempts to parse a given string to a JSON object\r\n * @param {string} jsonString - The string to parse.\r\n * @returns {any} - the parsed object if successful, or null otherwise.\r\n */\r\n tryParseJson(jsonString) {\r\n try {\r\n return JSON.parse(jsonString);\r\n }\r\n catch (_a) {\r\n return undefined;\r\n }\r\n }\r\n /** Gets the FeedService base url */\r\n getFeedServiceUrlBase() {\r\n if (!this._feedServiceDomain) {\r\n return;\r\n }\r\n const url = new URL(\"/service/\", this._feedServiceDomain);\r\n if (location.host.includes(\"localhost.msn.com\") || this.getQueryParameter(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n const searchParam = this.getQueryParameter(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n return url;\r\n }\r\n /** Gets the Enterprise Service base url */\r\n getEnterpriseServiceUrlBase() {\r\n const enterpriseFeedServiceDomain = this._servicesEndpoints &&\r\n this._servicesEndpoints.enterpriseFeedService &&\r\n this._servicesEndpoints.enterpriseFeedService.domain;\r\n if (!enterpriseFeedServiceDomain) {\r\n return;\r\n }\r\n const url = new URL(\"\", enterpriseFeedServiceDomain);\r\n if (location.host.includes(\"localhost.msn.com\") || this.getQueryParameter(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n const searchParam = this.getQueryParameter(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n return url;\r\n }\r\n /** Gets the content service base url */\r\n getContentServiceUrlBase() {\r\n if (!this._feedServiceDomain) {\r\n return;\r\n }\r\n let url;\r\n // Temporarily hardcode endpoint for MMX flight, when flight is off, we want to use hardcoded value.\r\n // After the flight, we hope to start using the regular logic for MMX\r\n const isAppTypeMMX = this.apptype === AppType.MMX;\r\n if (isAppTypeMMX && (!this.currentFlights || this.currentFlights.indexOf(\"prg-mmxcontent-t\") === -1)) {\r\n url = new URL(\"./content/\", `https://assets.msn.${this.domainExt}`);\r\n }\r\n else {\r\n url = new URL(\"/content/\", this._feedServiceDomain);\r\n }\r\n if (location.host.includes(\"localhost.msn.com\") || this.getQueryParameter(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.content\", \"dev\");\r\n }\r\n const searchParam = this.getQueryParameter(\"env.content\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.content\", searchParam);\r\n }\r\n return url;\r\n }\r\n /** Gets the Config root url */\r\n getConfigRootUrl() {\r\n const url = new URL(\"\", this.getQueryParameter(\"configRootUrl\") || `https://assets.msn.${this.domainExt}/config/v1/`);\r\n if (location.host.includes(\"localhost.msn.com\") || this.getQueryParameter(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.config\", \"dev\");\r\n }\r\n const searchParam = this.getQueryParameter(\"env.config\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.config\", searchParam);\r\n }\r\n return url;\r\n }\r\n /**\r\n * Get cache busting config url.\r\n * @returns {string} - cache busting config url.\r\n */\r\n getCacheBustingConfigUrl() {\r\n const relativePath = `/resolver/api/cbid/${this.pcsApptype || \"NoAppType\"}`;\r\n // int and localhost to use int.msn.com for config service.\r\n if (this._env === \"int\") {\r\n return \"https://int.msn.com\" + relativePath;\r\n }\r\n return location.origin + relativePath;\r\n }\r\n /**\r\n * Get config service base url\r\n * @param {isMultiConfigRetrievalEnabled} - if multiple config retrieval is supported.\r\n * @returns {string} - config service base url.\r\n */\r\n getConfigServiceBaseUrl(isMultiConfigRetrievalEnabled = true) {\r\n const relativePath = this.isGitConfigs\r\n ? \"/resolver/api/resolve/v3/config/\"\r\n : `/resolver/api/resolve/${isMultiConfigRetrievalEnabled ? \"v2/\" : \"\"}configindex/`;\r\n // int and localhost to use int.msn.com for config service.\r\n if (this._env === \"int\") {\r\n return \"https://int.msn.com\" + relativePath;\r\n }\r\n return location.origin + relativePath;\r\n }\r\n /**\r\n * Function checks if ConfigService should return multiple configs\r\n * @returns true if supported else false.\r\n */\r\n useMultiConfigsRetrieval() {\r\n const param = this.getQueryParameter(\"isMultiConfigRetrievalEnabled\");\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n // PCS flag to turn on/off multi config retrieval.\r\n if (this.featureFlags\r\n && this.featureFlags.isMultiConfigRetrievalEnabled) {\r\n return this.featureFlags.isMultiConfigRetrievalEnabled === \"true\";\r\n }\r\n return true;\r\n }\r\n /**\r\n * Function checks if Git configs is enabled\r\n * @returns true if supported else false.\r\n */\r\n useGitConfigs() {\r\n const param = this.getQueryParameter(\"isGitConfig\");\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n const flights = this._currentFlights.split(\",\");\r\n return shouldUseGitConfigs(this._crsVersion, flights, this._configIndexDocId, this._pcsApptype);\r\n }\r\n /**\r\n * Function checks if we should send the activityID in the request header instead of sending it as a QSP in the URL.\r\n * @returns true if supported else false.\r\n */\r\n shouldSendFeedCallActivityIdInHeader() {\r\n // Use feature flag as a switch to disable the feature (will need a PCS deployment).\r\n if (this.featureFlags && this.featureFlags.disableActivityIdInHeader && this.featureFlags.disableActivityIdInHeader === \"true\") {\r\n return false;\r\n }\r\n return this.apptype === AppType.Edge || this.apptype === AppType.Hub;\r\n }\r\n /**\r\n * Checks if enterprise compliant NTP\r\n * This manual check is needed since we don't have configs at this point\r\n */\r\n checkEnterpriseCompliantNTP() {\r\n return this.apptype === AppType.EdgeChromium &&\r\n this.audienceMode === AudienceModeType.Enterprise &&\r\n !!this.browser &&\r\n this.browser.browserType === BrowserType.EdgeChromium &&\r\n parseInt(this.browser.version) >= 87;\r\n }\r\n /**\r\n * Indicates whether configs should be fetched from local repo based on conditions and overrides\r\n */\r\n setConfigOrigin() {\r\n // Default to production\r\n const configOrigins = { feature: ConfigOrigin.Production, loc: ConfigOrigin.Production };\r\n if (__WEBPACK_LOCAL_GITCONFIGS_LOC__) {\r\n configOrigins.feature = ConfigOrigin.Local;\r\n configOrigins.loc = ConfigOrigin.Local;\r\n }\r\n else if (__WEBPACK_LOCAL_GITCONFIGS__) {\r\n configOrigins.feature = ConfigOrigin.Local;\r\n configOrigins.loc = ConfigOrigin.Production;\r\n }\r\n // Override based on conditions\r\n if (!this._isGitConfigs || this.getEnableConfigService()) {\r\n configOrigins.feature = ConfigOrigin.Production;\r\n configOrigins.loc = ConfigOrigin.Production;\r\n }\r\n return configOrigins;\r\n }\r\n /**\r\n * This is the switch to turn on/off config service operation\r\n */\r\n getEnableConfigService() {\r\n const queryParamOverride = this.getQueryParameter(\"enableConfigService\") || undefined;\r\n if (queryParamOverride) {\r\n return queryParamOverride.toLocaleLowerCase() === \"true\";\r\n }\r\n return this._enableConfigService;\r\n }\r\n}\r\n/** Singleton class instance. */\r\nexport const environment = new Environment();\r\n//# sourceMappingURL=Environment.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { perfMarkerEndSuffix, perfMarkerStartSuffix } from \"../constants\";\r\n/** Start and end markers. */\r\nconst _perfMarkers = {};\r\n/** PageTimings. */\r\nexport const _pageTimings = {};\r\n/** PerfTimeline to use for recording the values. */\r\nlet _perfTimeline;\r\n/**\r\n * Returns the pageTimings.\r\n * @return The pageTimings.\r\n */\r\nexport function getPerfMarkerHelperPageTimings() {\r\n return _pageTimings;\r\n}\r\n/**\r\n * Sets the perf timeline and the pagetimings.\r\n * Defaults perfTimeline to undefined.\r\n * @param perfTimeline - The perf timeline object\r\n */\r\nexport function initializePerfMarkerHelper(perfTimeline) {\r\n _perfTimeline = perfTimeline;\r\n}\r\n/**\r\n * Records the time stamp of the given marker.\r\n * Perf marker with StartSuffix should be called first, otherwise it will not do anything.\r\n * @param name - The marker name\r\n * @return An object storing the perfMarker name and the total time taken (end - start).\r\n */\r\nexport function addPerfMarker(name) {\r\n if (name.endsWith(perfMarkerStartSuffix)) {\r\n name = name.slice(0, name.length - perfMarkerStartSuffix.length);\r\n const newMarker = {\r\n endMeasure: _perfTimeline && _perfTimeline.startMeasure(name).endMeasure,\r\n startTime: performance.now()\r\n };\r\n _perfMarkers[name] = newMarker;\r\n return;\r\n }\r\n if (name.endsWith(perfMarkerEndSuffix)) {\r\n name = name.slice(0, name.length - perfMarkerEndSuffix.length);\r\n if (_perfMarkers[name]) {\r\n const { endMeasure, startTime } = _perfMarkers[name];\r\n const timeTaken = Math.round(performance.now() - startTime);\r\n _pageTimings[name] = timeTaken;\r\n if (endMeasure) {\r\n endMeasure();\r\n }\r\n return {\r\n name,\r\n timeTaken\r\n };\r\n }\r\n return;\r\n }\r\n}\r\n//# sourceMappingURL=PerfMarkerHelper.js.map","// © Microsoft Corporation. All rights reserved.\r\nconst subscriptions = new Map();\r\n/**\r\n * Registers a subscription. Subscriptions are requests that get notified multiple times.\r\n * @param message - the message from main thread with subscription id\r\n */\r\nexport function registerSubscription(message) {\r\n subscriptions.set(message.id, message);\r\n}\r\n/**\r\n * Sends a message to the main thread\r\n * @param message the message to send\r\n */\r\nexport function sendMessage(message) {\r\n postMessage(message);\r\n}\r\n/**\r\n * Send a postMessage to the main thread\r\n * @param id message id\r\n * @param payload payload\r\n */\r\nexport function notifySubscription(id, payload) {\r\n if (!subscriptions.has(id)) {\r\n return;\r\n }\r\n sendMessage({ id, fetched: true, payload });\r\n}\r\n//# sourceMappingURL=PostMessage.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { WebWorkerMessageId } from \"./Constants\";\r\nimport { environment } from \"./Environment\";\r\nimport { notifySubscription } from \"./PostMessage\";\r\n/** The Logger class has methods to log info, error to console. */\r\nclass Logger {\r\n /**\r\n * When in debug mode, log message to console.\r\n * @param message - The message\r\n */\r\n info(message) {\r\n if (environment.isDebug) {\r\n console.log(message);\r\n }\r\n }\r\n /**\r\n * Logs message to error console.\r\n * @param message - The message\r\n */\r\n error(message) {\r\n notifySubscription(WebWorkerMessageId.WebWorkerError, message);\r\n // Avoid logging errors unless in debug mode.\r\n if (environment.isDebug) {\r\n console.error(message);\r\n }\r\n }\r\n}\r\n/** Singleton class instance. */\r\nexport const logger = new Logger();\r\n//# sourceMappingURL=Logger.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { MessageType } from \"./Constants\";\r\nimport { logger } from \"./Logger\";\r\nimport { registerSubscription } from \"./PostMessage\";\r\nconst commandMessageHandlers = new Map();\r\nconst dataMessageHandlers = new Map();\r\n/**\r\n * Initializes message handler\r\n */\r\nexport function initializeMessageHandler() {\r\n onmessage = (event) => {\r\n const { data: message } = event;\r\n logger.info(`WebWorker.onMessage: [type ${message.type}] [id ${message.id}]`);\r\n if (message.type === MessageType.Data) {\r\n const handler = dataMessageHandlers.get(message.id) || dataMessageHandlers.get(\"default\");\r\n if (handler) {\r\n handler(message);\r\n return;\r\n }\r\n }\r\n if (message.type === MessageType.Subscription) {\r\n registerSubscription(message);\r\n return;\r\n }\r\n if (message.type === MessageType.Command) {\r\n executeCommand(message);\r\n return;\r\n }\r\n logger.error(`WebWorker.onMessage: Cannot handle message. [type ${message.type}] [id ${message.id}]`);\r\n };\r\n}\r\n/**\r\n * Registers the action to be execute on receiving the message\r\n * @param messageId Message Id\r\n * @param action Action to execute\r\n */\r\nexport function registerCommandMessageHandler(messageId, action) {\r\n const handlers = commandMessageHandlers.get(messageId);\r\n commandMessageHandlers.set(messageId, [...(handlers || []), action]);\r\n}\r\n/**\r\n * Registers the action to be executed on receiving a message with the specific message id\r\n * @param messageId Message Id\r\n * @param handler Action to execute\r\n */\r\nexport function registerDataMessageHandler(messageId, handler) {\r\n dataMessageHandlers.set(messageId, handler);\r\n}\r\n/**\r\n * Execute actions for command type messages from main thread\r\n * @param message message\r\n */\r\nfunction executeCommand(message) {\r\n const commandHandlers = commandMessageHandlers.get(message.id);\r\n if (!commandHandlers || !commandHandlers.length) {\r\n logger.error(`WebWorker.onMessage: Cannot handle message. [type ${message.type}] [id ${message.id}]`);\r\n return;\r\n }\r\n commandHandlers.forEach((callback, index) => {\r\n try {\r\n if (callback) {\r\n callback(message.payload);\r\n }\r\n }\r\n catch (ex) {\r\n logger.error(`Error executing command handler for message id [${message.id}] at handler index [${index}] . Error: ${ex}`);\r\n }\r\n });\r\n}\r\n//# sourceMappingURL=MessageHandler.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { WebWorkerMessageId } from \"./Constants\";\r\nimport { addPerfMarker } from \"@msnews/web-worker-shared-utils\";\r\nimport { environment } from \"./Environment\";\r\nimport { registerDataMessageHandler } from \"./MessageHandler\";\r\nimport { sendMessage } from \"./PostMessage\";\r\n// Register perfMarker message handler\r\nregisterDataMessageHandler(WebWorkerMessageId.PerfMarkers, sendPerfMarkers);\r\n/** All markers. */\r\nexport const perfMarkers = {};\r\n/** The performance marker name prefix. */\r\nconst markerPrefix = \"WW.\";\r\n/**\r\n * Calls the addPerfMarker function from shared-utils with WW markerPrefix prefix.\r\n * If the start marker is already called and this call is for end marker, it'll get latency and record it.\r\n * @param name - The marker name\r\n */\r\nexport function addWWPerfMarker(name) {\r\n const perfMarker = addPerfMarker(`${markerPrefix}${name}`);\r\n if (perfMarker) {\r\n perfMarkers[perfMarker.name] = perfMarker.timeTaken;\r\n }\r\n}\r\n/**\r\n * Records the time stamp of the given marker.\r\n * @param markerName - The marker name\r\n * @param customTime - A previously recorded / custom timing value to use instead of performance.now()\r\n */\r\nexport function perfMarker(markerName = \"\", customTime) {\r\n const mark = `${markerPrefix}${markerName}`;\r\n if (!perfMarkers[mark]) {\r\n perfMarkers[mark] = Math.round((customTime || performance.now()) + environment.perfTimeOffset);\r\n }\r\n}\r\n/**\r\n * Removes recorded time stamp for the given marker.\r\n * @param markerName - The marker name\r\n */\r\nexport function removePerfMarker(markerName = \"\") {\r\n const mark = `${markerPrefix}${markerName}`;\r\n if (perfMarkers[mark]) {\r\n delete perfMarkers[mark];\r\n }\r\n}\r\n/** Sends web worker perf markers to main thread */\r\nfunction sendPerfMarkers() {\r\n sendMessage({ id: WebWorkerMessageId.PerfMarkers, fetched: true, payload: perfMarkers });\r\n}\r\n//# sourceMappingURL=PerfMarker.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * The start suffix for perf markings.\r\n */\r\nexport const perfMarkerStartSuffix = \"-start\";\r\n/**\r\n * The end suffix for perf markings.\r\n */\r\nexport const perfMarkerEndSuffix = \"-end\";\r\n/**\r\n * The perf marking name for crs initial merged config fetch.\r\n */\r\nexport const perfMarkerCrsConfigName = \"CrsConfig\";\r\n//# sourceMappingURL=PerfMarkerConstants.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { logger } from \"./Logger\";\r\n/**\r\n * Extension of Map with option to execute callbacks when a specific entry is added/updated\r\n * @class - SubscribableMap\r\n */\r\nexport class SubscribableMap extends Map {\r\n constructor() {\r\n super(...arguments);\r\n /** Subscription map */\r\n this.subscriptions = new Map();\r\n }\r\n /**\r\n * Set function that adds subscription info\r\n * @param key - the key\r\n * @param value - the value\r\n */\r\n set(key, value) {\r\n super.set(key, value);\r\n const subscriptionCallbacks = this.subscriptions.get(key) || [];\r\n if (!subscriptionCallbacks.length) {\r\n return this;\r\n }\r\n subscriptionCallbacks.forEach((callback, index) => {\r\n try {\r\n // Unsubscribe sets the callback to null, check before executing\r\n if (callback) {\r\n callback(value);\r\n }\r\n }\r\n catch (ex) {\r\n logger.error(`Error executing subscription callback for key [${key}] at handler index [${index}]. Error: ${ex}`);\r\n }\r\n });\r\n return this;\r\n }\r\n /**\r\n * Registers a function that executes when the map entry is already present, newly added or update.\r\n * @param key - the cache key\r\n * @param callback - the callback to execute when the cache entry is added/updated\r\n */\r\n subscribe(key, callback) {\r\n const subscription = this.subscribeInternal(key, callback);\r\n // If the value is already present, invoke the callback immediately\r\n if (this.has(key)) {\r\n // Wrapping in a setTimeout to return the subscription first and then start callback execution\r\n setTimeout(() => {\r\n this.tryExecuteSubscriptionCallback(key, subscription.index, this.get(key));\r\n });\r\n }\r\n return {\r\n unsubscribe: subscription.unsubscribe\r\n };\r\n }\r\n /**\r\n * Registers a function that executes when all keys are present in the map.\r\n * @param keys - array of cache keys\r\n * @param callback - the callback to execute when cache entries for all the keys are present\r\n */\r\n subscribeMultiple(keys, callback) {\r\n if (!keys || !keys.length) {\r\n return;\r\n }\r\n if (keys.length === 1) {\r\n return this.subscribe(keys[0], (data) => callback([data]));\r\n }\r\n const internalSubscriptions = keys.map(key => this.subscribeInternal(key, () => {\r\n const data = [];\r\n for (const key of keys) {\r\n if (!this.has(key)) {\r\n return;\r\n }\r\n data.push(this.get(key));\r\n }\r\n if (data.length === keys.length) {\r\n callback(data);\r\n }\r\n }));\r\n // Run the internal callback once to check if data is already present\r\n // Wrapping in a setTimeout to return the subscription first and then start callback execution\r\n setTimeout(() => {\r\n // Callback is the same for all keys, execute only the first\r\n if (internalSubscriptions && internalSubscriptions.length) {\r\n this.tryExecuteSubscriptionCallback(keys[0], internalSubscriptions[0].index);\r\n }\r\n });\r\n return {\r\n unsubscribe: () => {\r\n internalSubscriptions.forEach(subscription => subscription && subscription.unsubscribe && subscription.unsubscribe());\r\n }\r\n };\r\n }\r\n /**\r\n * Internal subscribe implementation\r\n * @param key - the cache key\r\n * @param callback - the callback to execute when the cache entry is added/updated\r\n * @returns object containing unsubscribe callback and index of the callback in the subscription array\r\n */\r\n subscribeInternal(key, callback) {\r\n const subscriptions = this.subscriptions.get(key) || [];\r\n this.subscriptions.set(key, [...subscriptions, callback]);\r\n const index = subscriptions.length;\r\n return {\r\n unsubscribe: () => {\r\n const callbacks = this.subscriptions.get(key) || [];\r\n if (callbacks[index]) {\r\n callbacks[index] = null;\r\n }\r\n this.subscriptions.set(key, callbacks);\r\n },\r\n index\r\n };\r\n }\r\n /**\r\n * Retrieves and executes the subscription callback if it exists\r\n * @param key subscription key\r\n * @param index index of the callback function in the subscriptions array\r\n * @param data optional data for the callback\r\n */\r\n tryExecuteSubscriptionCallback(key, index, data) {\r\n // Always read from subscriptions Map to make sure unsubscribed subscription callbacks are not executed\r\n const subscriptions = this.subscriptions.get(key);\r\n if (!subscriptions || !subscriptions.length) {\r\n return;\r\n }\r\n const callback = subscriptions[index];\r\n if (typeof callback === \"function\") {\r\n callback(data);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=SubscribableMap.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { SubscribableMap } from \"./SubscribableMap\";\r\nimport { registerDataMessageHandler } from \"./MessageHandler\";\r\nimport { sendMessage } from \"./PostMessage\";\r\nexport const webWorkerCache = new SubscribableMap();\r\n/**\r\n * Registers handler to return data from web worker cache.\r\n * This is the default data message handler unless a handler is registered for a specific message Id\r\n */\r\nfunction initialize() {\r\n registerDataMessageHandler(\"default\", returnCachedData);\r\n}\r\n/**\r\n * Web worker cache data message handler.\r\n * For the given id, returns the value in cache.\r\n * @param message - The message\r\n */\r\nfunction returnCachedData(message) {\r\n const { id } = message;\r\n const item = webWorkerCache.get(id);\r\n if (!item) {\r\n sendMessage({ id, fetched: false, payload: null });\r\n return;\r\n }\r\n sendMessage({ id, fetched: true, payload: item.payload });\r\n}\r\ninitialize();\r\n//# sourceMappingURL=WebWorkerCache.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * This will decide whether to create Alert for this app error or no alert. This can generate IcM ticket.\r\n * Alerts ones are tracked at http://aka.ms/AppErrors\r\n * NoAlerts will have separate tab just next to Errors aka Warnings. IcM ticket won't be generated when NoAlert is set.\r\n */\r\nexport var Severity;\r\n(function (Severity) {\r\n /**\r\n * This is app error with default severity\r\n */\r\n Severity[Severity[\"Alert\"] = 0] = \"Alert\";\r\n /**\r\n * This is app warning\r\n */\r\n Severity[Severity[\"NoAlert\"] = 1] = \"NoAlert\";\r\n /**\r\n * This app error has high user impact\r\n */\r\n Severity[Severity[\"HighImpact\"] = 2] = \"HighImpact\";\r\n /**\r\n * This is fatal app error\r\n */\r\n Severity[Severity[\"Critical\"] = 3] = \"Critical\";\r\n})(Severity || (Severity = {}));\r\n//# sourceMappingURL=wwAppErrorTracker.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { Severity } from \"./wwAppErrorTracker\";\r\n/**\r\n * This file contains the list of web worker app errors.\r\n * Refer: libs\\diagnostics\\src\\AppError\\AppErrorsCatalog.md for Catalog\r\n * After adding new app error in this file, also add to libs\\diagnostics\\src\\AppError\\AppErrors.ts\r\n * and make sure that Ids are not repeated.\r\n */\r\n/**\r\n * Set default severity\r\n */\r\nconst severity = Severity.Alert;\r\n/**\r\n * Set default property bag\r\n */\r\nconst pb = {\r\n build: \"\",\r\n customMessage: \"\"\r\n};\r\n/** App Anon cookies fetch call failed */\r\nexport const FetchAppAnonFailed = {\r\n id: 29005,\r\n source: \"AppAnonCookie.ts\",\r\n severity,\r\n pb\r\n};\r\nconst cacheBustingFileName = \"ConfigCacheBustHelper.ts\";\r\nconst wwResolverFile = \"WebWorkerResolver.ts\";\r\n/** Blank cache busting url */\r\nexport const BlankCacheBustingUrl = {\r\n id: 29011,\r\n source: cacheBustingFileName,\r\n severity,\r\n pb\r\n};\r\n/** CBID fetch response is invalid */\r\nexport const InvalidCbidResponse = {\r\n id: 29012,\r\n source: cacheBustingFileName,\r\n severity,\r\n pb\r\n};\r\n/** Uncaught exception during CBID */\r\nexport const CbidUncaughtErrors = {\r\n id: 29013,\r\n source: cacheBustingFileName,\r\n severity,\r\n pb\r\n};\r\n/** CBID change is detected */\r\nexport const RefreshConfigsCbidError = {\r\n id: 29014,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** New configs are not being populated after CBID wiped the configs */\r\nexport const RefreshConfigsNewConfigsFailed = {\r\n id: 29015,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Error parsing config tree */\r\nexport const ErrorParsingConfigTree = {\r\n id: 29020,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Given configIndexHref is not valid */\r\nexport const HrefNotValid = {\r\n id: 29021,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Error while parsing config tree */\r\nexport const GetConfigTreeError = {\r\n id: 29022,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** config tree is empty */\r\nexport const GetConfigTreeEmpty = {\r\n id: 29023,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** config is null */\r\nexport const GetConfigTreeNull = {\r\n id: 29024,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Page scope is not valid */\r\nexport const PageScopeInvalid = {\r\n id: 29025,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Error while fetching config from CRS */\r\nexport const CrsFetchError = {\r\n id: 29026,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Error while refreshing config tree */\r\nexport const RefreshConfigsError = {\r\n id: 29027,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** CRS sent non-200 response */\r\nexport const ConfigCrsFetchNon200Response = {\r\n id: 29028,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Cdn config fetch received non-200 response */\r\nexport const ConfigCdnFetchNon200Response = {\r\n id: 29029,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** configs indexedDB failed to init */\r\nexport const IdbConfigInitFailed = {\r\n id: 29030,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** configs indexedDB failed to read */\r\nexport const IdbConfigReadFailed = {\r\n id: 29031,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** configs indexedDB failed to write */\r\nexport const IdbConfigWriteFailed = {\r\n id: 29032,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** configs indexedDB failed to clear */\r\nexport const IdbConfigClearFailed = {\r\n id: 29033,\r\n source: wwResolverFile,\r\n severity,\r\n pb\r\n};\r\n/** Error Idb executing transaction */\r\nexport const IdbTransactionError = {\r\n id: 29034,\r\n source: \"IndexedDb.ts\",\r\n severity,\r\n pb\r\n};\r\nconst wwIndexedDBCacheFile = \"IndexedDBCache.ts\";\r\n/** Failed to initialize IndexedDB */\r\nexport const FailedToInitIdb = {\r\n id: 29035,\r\n source: wwIndexedDBCacheFile,\r\n severity,\r\n pb\r\n};\r\n/** Failed to save data in IndexedDB */\r\nexport const FailedToSaveIdb = {\r\n id: 29036,\r\n source: wwIndexedDBCacheFile,\r\n severity,\r\n pb\r\n};\r\n/** Failed to clear data in IndexedDB */\r\nexport const FailedToClearIdb = {\r\n id: 29037,\r\n source: wwIndexedDBCacheFile,\r\n severity,\r\n pb\r\n};\r\n/** Failed to hydrate from IndexedDB */\r\nexport const FailedToHydrateIdb = {\r\n id: 29038,\r\n source: wwIndexedDBCacheFile,\r\n severity,\r\n pb\r\n};\r\n/**\r\n * Configs served from CDN after CRS fetch failed\r\n */\r\nexport const ConfigsDownloadedByCdn = {\r\n id: 29039,\r\n source: wwResolverFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\nconst wwLocalNewsFile = \"LocalNews.ts\";\r\n/** Local news fetch failed */\r\nexport const LocalNewsFetchFailed = {\r\n id: 29040,\r\n source: wwLocalNewsFile,\r\n severity,\r\n pb\r\n};\r\n/** Local news fetch failed for location id */\r\nexport const LocalNewsLocationIdFetchFailed = {\r\n id: 29041,\r\n source: wwLocalNewsFile,\r\n severity,\r\n pb\r\n};\r\n/** Pdp card data fetch failed */\r\nexport const FetchPdpDataFailed = {\r\n id: 29042,\r\n source: \"PdpCardData.ts\",\r\n severity,\r\n pb\r\n};\r\n/** Content list fetch failed */\r\nexport const ContentListFetchFailed = {\r\n id: 29050,\r\n source: \"ContentList.ts\",\r\n severity,\r\n pb\r\n};\r\nconst wwContentPreviewFile = \"ContentPreview.ts\";\r\n/** Content preview fetch failed */\r\nexport const ContentPreviewFetchFailed = {\r\n id: 29051,\r\n source: wwContentPreviewFile,\r\n severity,\r\n pb\r\n};\r\n/** Unknown Infopane complex slide type */\r\nexport const UnknownComplexInfopaneSlide = {\r\n id: 29052,\r\n source: wwContentPreviewFile,\r\n severity,\r\n pb\r\n};\r\n/** fetch image failed */\r\nexport const ImageFetchFailed = {\r\n id: 29053,\r\n source: \"Image.ts\",\r\n severity,\r\n pb\r\n};\r\nconst wwOneServiceFeedFile = \"OneServiceFeed.ts\";\r\n/** River config is null */\r\nexport const RiverConfigIsNull = {\r\n id: 29054,\r\n source: wwOneServiceFeedFile,\r\n severity,\r\n pb\r\n};\r\n/** OneService MyFeed fetch failed */\r\nexport const FetchOneServiceMyFeedFailed = {\r\n id: 29055,\r\n source: wwOneServiceFeedFile,\r\n severity,\r\n pb\r\n};\r\n/** Windows feed fetch failure */\r\nexport const WindowsFeedFetchFailed = {\r\n id: 29056,\r\n source: \"WindowsFeed.ts\",\r\n severity,\r\n pb\r\n};\r\nexport const DesktopFeedEdgeNextConfigIsNull = {\r\n id: 29057,\r\n source: \"WpoFeed.ts\",\r\n severity,\r\n pb\r\n};\r\nexport const OneServiceFeedResponseEmpty = {\r\n id: 29058,\r\n source: wwOneServiceFeedFile,\r\n severity,\r\n pb\r\n};\r\n/** Error fetching views content */\r\nexport const FetchViewsContentFailed = {\r\n id: 29060,\r\n source: \"ViewsData.ts\",\r\n severity,\r\n pb\r\n};\r\n/** Industry News Article fetch call failed */\r\nexport const FetchIndustryNewsArticlesFailed = {\r\n id: 29070,\r\n source: \"IndustryNewsArticles.ts\",\r\n severity,\r\n pb\r\n};\r\n/** Error processing My Briefing response */\r\nexport const FetchMyBriefingFailed = {\r\n id: 29090,\r\n source: \"MyBriefing.ts\",\r\n severity,\r\n pb\r\n};\r\n/** Wpo MyFeed fetch failed */\r\nexport const WpoFeedFetchFailed = {\r\n id: 29091,\r\n source: \"WpoFeed.ts\",\r\n severity,\r\n pb\r\n};\r\n/** fetch wpo feed image failed */\r\nexport const WpoFeedImageFetchFailed = {\r\n id: 29092,\r\n source: \"WpoFeed.ts\",\r\n severity,\r\n pb\r\n};\r\n/** can not get MUID */\r\nexport const WpoFeedGetMuidFailure = {\r\n id: 29093,\r\n source: \"WpoFeed.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n//# sourceMappingURL=wwAppErrors.js.map","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","import isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nexport default isKey;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","import MapCache from './_MapCache.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nexport default memoize;\n","import memoize from './memoize.js';\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nexport default memoizeCapped;\n","import memoizeCapped from './_memoizeCapped.js';\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nexport default stringToPath;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nexport default arrayMap;\n","import Symbol from './_Symbol.js';\nimport arrayMap from './_arrayMap.js';\nimport isArray from './isArray.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default baseToString;\n","import baseToString from './_baseToString.js';\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nexport default toString;\n","import isArray from './isArray.js';\nimport isKey from './_isKey.js';\nimport stringToPath from './_stringToPath.js';\nimport toString from './toString.js';\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nexport default castPath;\n","import isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nexport default toKey;\n","import castPath from './_castPath.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nexport default baseGet;\n","import baseGet from './_baseGet.js';\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nexport default get;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Platform type\r\n */\r\nexport var PlatformType;\r\n(function (PlatformType) {\r\n PlatformType[\"App\"] = \"app\";\r\n PlatformType[\"Web\"] = \"web\";\r\n})(PlatformType || (PlatformType = {}));\r\n//# sourceMappingURL=PlatformType.js.map","// © Microsoft Corporation. All rights reserved.\r\nexport function stringHasData(value) {\r\n return (typeof value === \"string\" && (value.trim().length > 0));\r\n}\r\n//# sourceMappingURL=Utility.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { IdbTransactionError } from \"../AppErrors\";\r\nimport { environment } from \"./Environment\";\r\nimport { logger } from \"./Logger\";\r\n/**\r\n * Provides utility functions to get and set data from IndexedDB.\r\n * If dbName is not provied, this class creates a db with name MicrosoftNews.\r\n * If storeName is not provied, this class creates a table/store with name Default.\r\n * Recommended to create a new table for your feature to separate and iterate through entries quickly.\r\n * IndexedDB utility does not require stringify and json parsing so more efficient! Just store your object as value.\r\n */\r\nexport class IndexedDb {\r\n constructor() {\r\n /** IndexedDb object */\r\n this.idb = indexedDB;\r\n }\r\n /**\r\n * Returns if IndexedDb is supported.\r\n * @returns true if supported else false.\r\n */\r\n get supported() {\r\n if (!this.idb) {\r\n logger.info(\"indexedDB is not supported.\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Function looks at query string param and check if IndexedDb operation is allowed or not. By default it is allowed.\r\n * @returns true if supported else false.\r\n */\r\n get isCachingAllowed() {\r\n const param = environment.getQueryParameter(\"enableIndexedDbOperation\");\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n return true;\r\n }\r\n /**\r\n * Function looks at query string param and check if IndexedDb operation is allowed or not. By default it is allowed.\r\n * @returns true if supported else false.\r\n */\r\n get isGetAllAllowed() {\r\n const param = environment.getQueryParameter(\"allowGetAllOverCursor\");\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n if (IDBObjectStore.prototype && IDBObjectStore.prototype.getAll) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @param {IDBFactory} idb - IndexedDB object to override.\r\n */\r\n setIndexedDb(idb) {\r\n this.idb = idb;\r\n }\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @return {Promise} existing promise.\r\n */\r\n getIdbPromise() {\r\n return this.idbPromise;\r\n }\r\n /**\r\n * Returns object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @returns Promise\r\n */\r\n getObject(key) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let req;\r\n yield this.withIdbStore(\"readonly\", store => {\r\n req = store.get(key);\r\n });\r\n return req.result;\r\n });\r\n }\r\n /**\r\n * Return all objects from IndexedDB using getAll implementation.\r\n * @public\r\n * @returns Promise\r\n */\r\n getAll() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let req;\r\n yield this.withIdbStore(\"readonly\", store => {\r\n req = store.getAll();\r\n });\r\n return req.result;\r\n });\r\n }\r\n /**\r\n * Returns all objects from IndexedDB.\r\n * if getAll is supported, call it else fallback to Cursor implementation that exists on wide range of devices.\r\n * @public\r\n * @returns Promise\r\n */\r\n getAllObjects() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (this.isGetAllAllowed) {\r\n return this.getAll();\r\n }\r\n const data = [];\r\n yield this.withIdbStore(\"readonly\", store => {\r\n store.openCursor().onsuccess = function (event) {\r\n const cursor = event.target && event.target.result;\r\n if (cursor && cursor.value) {\r\n data.push(cursor.value);\r\n cursor.continue();\r\n }\r\n };\r\n });\r\n return data;\r\n });\r\n }\r\n /**\r\n * Sets object into IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @param {any} value - Any typed value you want to insert into IndexedDB.\r\n */\r\n setObject(key, value) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return yield this.withIdbStore(\"readwrite\", storeCallback => {\r\n storeCallback.put(value, key);\r\n });\r\n });\r\n }\r\n /**\r\n * Removes object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n */\r\n removeObject(key) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return yield this.withIdbStore(\"readwrite\", storeCallback => {\r\n storeCallback.delete(key);\r\n });\r\n });\r\n }\r\n /**\r\n * Removes all objects from IndexedDB\r\n * @public\r\n */\r\n clearObjects() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return yield this.withIdbStore(\"readwrite\", storeCallback => {\r\n storeCallback.clear();\r\n });\r\n });\r\n }\r\n /**\r\n * Initialize IndexedDb.\r\n * @param idbStoreName {string} - IndexedDB store name\r\n * @param dbName {string} - Database name\r\n */\r\n initializeIndexedDb(idbVersion = 1, idbStoreName = \"Default\", dbName = \"MicrosoftNews\") {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.storeName = idbStoreName;\r\n this.idbPromise = new Promise((resolve, reject) => {\r\n const openreq = this.idb.open(dbName, idbVersion);\r\n openreq.onerror = () => {\r\n reject(openreq.error);\r\n };\r\n openreq.onsuccess = () => {\r\n resolve(openreq.result);\r\n };\r\n openreq.onupgradeneeded = () => {\r\n openreq.result.createObjectStore(idbStoreName);\r\n };\r\n });\r\n });\r\n }\r\n /** Private function to set transaction. */\r\n withIdbStore(type, callback) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return this.idbPromise.then(db => new Promise((resolve, reject) => {\r\n try {\r\n const transaction = db.transaction(this.storeName, type);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onabort = transaction.onerror = () => reject(transaction.error);\r\n callback(transaction.objectStore(this.storeName));\r\n }\r\n catch (ex) {\r\n logger.error(`Error executing transaction: ${ex}`);\r\n }\r\n }));\r\n });\r\n }\r\n}\r\n/**\r\n * Deletes Indexed DB\r\n * @param dbName - data base name to delete\r\n */\r\nexport function deleteIndexedDB(dbName) {\r\n try {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n deleteRequest.onerror = function (event) {\r\n logger.error(`WebWorker.deleteIndexedDB: onerror invoked for [${dbName}]. Error event - ${JSON.stringify(event)}`);\r\n };\r\n deleteRequest.onsuccess = function (event) {\r\n // event.result is expected to be null/undefined, log error if it's not\r\n if (event.result) {\r\n logger.error(`WebWorker.deleteIndexedDB: onsuccess returned [${event.result}] for DB [${dbName}]`);\r\n }\r\n };\r\n }\r\n catch (ex) {\r\n logger.error(Object.assign(Object.assign({}, IdbTransactionError), { message: \"Error executing Idb transaction\", pb: Object.assign(Object.assign({}, IdbTransactionError.pb), { customMessage: `Error: ${ex}` }) }));\r\n }\r\n}\r\n//# sourceMappingURL=IndexedDb.js.map","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignMergeValue;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nexport default createBaseFor;\n","import createBaseFor from './_createBaseFor.js';\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nexport default baseFor;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nexport default copyArray;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","import isArrayLike from './isArrayLike.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nexport default isArrayLikeObject;\n","import baseGetTag from './_baseGetTag.js';\nimport getPrototype from './_getPrototype.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nexport default isPlainObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nexport default safeGet;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","import assignValue from './_assignValue.js';\nimport baseAssignValue from './_baseAssignValue.js';\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nexport default copyObject;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default nativeKeysIn;\n","import isObject from './isObject.js';\nimport isPrototype from './_isPrototype.js';\nimport nativeKeysIn from './_nativeKeysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeysIn;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeysIn from './_baseKeysIn.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nexport default keysIn;\n","import copyObject from './_copyObject.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nexport default toPlainObject;\n","import assignMergeValue from './_assignMergeValue.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\nimport copyArray from './_copyArray.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\nimport isBuffer from './isBuffer.js';\nimport isFunction from './isFunction.js';\nimport isObject from './isObject.js';\nimport isPlainObject from './isPlainObject.js';\nimport isTypedArray from './isTypedArray.js';\nimport safeGet from './_safeGet.js';\nimport toPlainObject from './toPlainObject.js';\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nexport default baseMergeDeep;\n","import Stack from './_Stack.js';\nimport assignMergeValue from './_assignMergeValue.js';\nimport baseFor from './_baseFor.js';\nimport baseMergeDeep from './_baseMergeDeep.js';\nimport isObject from './isObject.js';\nimport keysIn from './keysIn.js';\nimport safeGet from './_safeGet.js';\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nexport default baseMerge;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nexport default identity;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nexport default apply;\n","import apply from './_apply.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nexport default overRest;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nexport default constant;\n","import constant from './constant.js';\nimport defineProperty from './_defineProperty.js';\nimport identity from './identity.js';\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nexport default baseSetToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nexport default shortOut;\n","import baseSetToString from './_baseSetToString.js';\nimport shortOut from './_shortOut.js';\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nexport default setToString;\n","import identity from './identity.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nexport default baseRest;\n","import eq from './eq.js';\nimport isArrayLike from './isArrayLike.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nexport default isIterateeCall;\n","import baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nexport default createAssigner;\n","import baseMerge from './_baseMerge.js';\nimport createAssigner from './_createAssigner.js';\n\n/**\n * This method is like `_.merge` except that it accepts `customizer` which\n * is invoked to produce the merged values of the destination and source\n * properties. If `customizer` returns `undefined`, merging is handled by the\n * method instead. The `customizer` is invoked with six arguments:\n * (objValue, srcValue, key, object, source, stack).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} customizer The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function customizer(objValue, srcValue) {\n * if (_.isArray(objValue)) {\n * return objValue.concat(srcValue);\n * }\n * }\n *\n * var object = { 'a': [1], 'b': [2] };\n * var other = { 'a': [3], 'b': [4] };\n *\n * _.mergeWith(object, other, customizer);\n * // => { 'a': [1, 3], 'b': [2, 4] }\n */\nvar mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n baseMerge(object, source, srcIndex, customizer);\n});\n\nexport default mergeWith;\n","import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","import baseKeys from './_baseKeys.js';\nimport getTag from './_getTag.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isArrayLike from './isArrayLike.js';\nimport isBuffer from './isBuffer.js';\nimport isPrototype from './_isPrototype.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nexport default isEmpty;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nexport default setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nexport default setCacheHas;\n","import MapCache from './_MapCache.js';\nimport setCacheAdd from './_setCacheAdd.js';\nimport setCacheHas from './_setCacheHas.js';\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nexport default SetCache;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nexport default arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nexport default cacheHas;\n","import SetCache from './_SetCache.js';\nimport arraySome from './_arraySome.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nexport default equalArrays;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nexport default mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nexport default setToArray;\n","import Symbol from './_Symbol.js';\nimport Uint8Array from './_Uint8Array.js';\nimport eq from './eq.js';\nimport equalArrays from './_equalArrays.js';\nimport mapToArray from './_mapToArray.js';\nimport setToArray from './_setToArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nexport default equalByTag;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import getAllKeys from './_getAllKeys.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nexport default equalObjects;\n","import Stack from './_Stack.js';\nimport equalArrays from './_equalArrays.js';\nimport equalByTag from './_equalByTag.js';\nimport equalObjects from './_equalObjects.js';\nimport getTag from './_getTag.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nexport default baseIsEqualDeep;\n","import baseIsEqualDeep from './_baseIsEqualDeep.js';\nimport isObjectLike from './isObjectLike.js';\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nexport default baseIsEqual;\n","import baseIsEqual from './_baseIsEqual.js';\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\nexport default isEqual;\n","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { BlankCacheBustingUrl, CbidUncaughtErrors, InvalidCbidResponse } from \"../AppErrors\";\r\nimport { environment, logger } from \"../wwCommon\";\r\n/**\r\n * Get cache busting identifier from live CMS document\r\n * @returns number - cache busting identifier. Typical value would be 1, 2 etc.\r\n */\r\nexport function getLiveCacheBustingIdentifier() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const { cacheBustingConfigUrl } = environment;\r\n if (!cacheBustingConfigUrl) {\r\n logger.error(Object.assign(Object.assign({}, BlankCacheBustingUrl), { message: \"WebWorker.cbid environment.cacheBustingConfigUrl is not set.\" }));\r\n return undefined;\r\n }\r\n const response = yield downloadFile(cacheBustingConfigUrl.toString());\r\n const liveCbid = parseInt(response);\r\n // We are checking response length > 1 and liveCbid > 9 temporarily.\r\n // Since we are seeing CBID greater than actual value in prod.\r\n // This logger statement that sends app error in web worker will help us diagnose the issue.\r\n // Bug 26748636: Remove app error logging temporary code in ConfigCacheBustHelper.ts\r\n if (!response\r\n || response.length !== 1\r\n || !liveCbid\r\n || isNaN(liveCbid)\r\n || liveCbid > 9) {\r\n logger.error(Object.assign(Object.assign({}, InvalidCbidResponse), { message: \"WebWorker.cbid response length !== 1\", pb: Object.assign(Object.assign({}, InvalidCbidResponse.pb), { customMessage: `LiveCbid: ${liveCbid || \"\"}. Url: ${cacheBustingConfigUrl.toString()}. Response: ${response || \"\"}.` }) }));\r\n return undefined;\r\n }\r\n return liveCbid;\r\n }\r\n catch (error) {\r\n logger.error(Object.assign(Object.assign({}, CbidUncaughtErrors), { message: \"WebWorker.cbid network error. Refer customMessage\", pb: Object.assign(Object.assign({}, CbidUncaughtErrors.pb), { customMessage: `WebWorker.cbid: ${error}` }) }));\r\n return undefined;\r\n }\r\n });\r\n}\r\n/**\r\n * downloads file from given the url\r\n * @private\r\n * @param {string} url - url of the document\r\n * @return Promise returns response from cache busting document\r\n */\r\nfunction downloadFile(url) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return fetch(url)\r\n .then(response => {\r\n if (!response.ok) {\r\n throw new Error(`Error downloading file: ${url} with status code: ${response.statusText}.`);\r\n }\r\n return response.text();\r\n });\r\n });\r\n}\r\n//# sourceMappingURL=ConfigCacheBustHelper.js.map","// © Microsoft Corporation. All rights reserved.\r\n/** Git configs flight treatment t with IndexedDB */\r\nexport const gitConfigsTreatmentWithIdb = \"prg-gitconfigs-t\";\r\n/** Git configs flight treatment t1 without IndexedDB */\r\nexport const gitConfigsTreatmentWithoutIdb = \"prg-gitconfigs-t1\";\r\n/** Git configs flight treatment t11 without IndexedDB */\r\nexport const gitConfigsTreatment1WithoutIdb = \"prg-gitconfigs-t11\";\r\n/**\r\n * Constants used for client resolver\r\n */\r\n// fetch type constants\r\nexport const featureManifests = \"feature-manifests\";\r\nexport const localizationManifests = \"loc-manifests\";\r\nexport const featureConfigs = \"feature-configs\";\r\nexport const localizationConfigs = \"loc-configs\";\r\n// instance constants\r\nexport const defaultInstance = \"default\";\r\n/**\r\n * Constants used for config caching\r\n */\r\nexport var ConfigCachingConstants;\r\n(function (ConfigCachingConstants) {\r\n /** IndexedDB store */\r\n ConfigCachingConstants.idbStoreName = \"Configurations_12\";\r\n /** IndexedDB name */\r\n ConfigCachingConstants.idbName = \"wwConfigs\";\r\n /** Config staleness duration.\r\n * This is used by IndexedDB at client and ServerCache at SSR.\r\n * 604800000 = 7 days in milliseconds\r\n */\r\n ConfigCachingConstants.configStalenessDuration = 604800000;\r\n /**\r\n * Default max of server side resolver's in-memory config cache.\r\n */\r\n ConfigCachingConstants.serverLruConfigCacheMax = 10240;\r\n /** Idb config read promise name */\r\n ConfigCachingConstants.idbInitPromiseNameKey = \"initializeIdbKey\";\r\n /** Idb config read promise name */\r\n ConfigCachingConstants.idbReadPromiseNameKey = \"readConfigsFromIdbKey\";\r\n /** Idb config write promise name */\r\n ConfigCachingConstants.idbWritePromiseNameKey = \"writeConfigsToIndexedDbKey\";\r\n})(ConfigCachingConstants || (ConfigCachingConstants = {}));\r\n//# sourceMappingURL=Constants.js.map","/**\n * Checks if the DOM is available to access and use\n */\nexport function canUseDOM() {\n return !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\n}\n","import { canUseDOM } from \"exenv-es6\";\nexport const defaultBreakpoints = [0, 540, 768, 1084, 1400, 1779];\n/**\n * Identifies current breakpoint based on window width\n */\nexport function identifyBreakpoint(windowWidth, breakpoints = defaultBreakpoints) {\n for (let breakpoint = breakpoints.length - 1; breakpoint >= 0; breakpoint--) {\n if (windowWidth >= breakpoints[breakpoint]) {\n return breakpoint;\n }\n }\n}\n/**\n * Gets a value from an array where the index retrieved is either the current break-point\n * or the nearest preceding break-point if no entry exists for the current break-point\n */\nexport function getValueByBreakpoint(breakpointSet, breakpoints) {\n if (!canUseDOM()) {\n return breakpointSet[0];\n }\n const breakpoint = breakpoints\n ? identifyBreakpoint(window.innerWidth, breakpoints)\n : identifyBreakpoint(window.innerWidth);\n return breakpointSet.slice(0, breakpoint + 1).pop();\n}\n","import { canUseDOM } from \"exenv-es6\";\nimport { defaultBreakpoints, identifyBreakpoint, } from \"./breakpoints\";\nclass BreakpointTracker {\n /**\n * Constructor for the BreakpointTracker component.\n * @param defaultBreakpoint?: number - optional breakpoint that can be used instead of window.innerWidth\n */\n constructor() {\n /**\n * The default array of breakpoint values\n */\n this._breakpoints = defaultBreakpoints;\n /**\n * Default breakpoint that can be set, used when the DOM is unavailable (useful for server side rendering)\n */\n this._defaultBreakpoint = 0;\n /**\n * The subscriptions\n */\n this.subscriptions = [];\n /**\n * Notifies subscribes if a breakpoint threshold has been crossed\n */\n this.update = () => {\n const breakpoint = canUseDOM()\n ? identifyBreakpoint(window.innerWidth, this._breakpoints)\n : this.defaultBreakpoint;\n if (this.breakpoint !== breakpoint) {\n this.breakpoint = breakpoint;\n this.notifySubscribers(this.breakpoint);\n }\n this.openRequestAnimationFrame = false;\n };\n /**\n * Returns the current breakpoint\n */\n this.currentBreakpoint = () => {\n return this.breakpoint;\n };\n /**\n * Request's an animation frame if there are currently no open animation frame requests\n */\n this.requestFrame = () => {\n if (this.openRequestAnimationFrame) {\n return;\n }\n this.openRequestAnimationFrame = true;\n window.requestAnimationFrame(this.update);\n };\n if (canUseDOM()) {\n this.breakpoint = identifyBreakpoint(window.innerWidth, this._breakpoints);\n window.addEventListener(\"resize\", this.requestFrame);\n }\n else {\n this.breakpoint = this.defaultBreakpoint;\n }\n }\n /**\n * Gets breakpoint values\n */\n get breakpoints() {\n return this._breakpoints;\n }\n /**\n * Sets breakpoint values\n */\n set breakpoints(breakpointConfig) {\n this._breakpoints = breakpointConfig;\n this.update();\n }\n /**\n * Gets the default breakpoint value\n */\n get defaultBreakpoint() {\n return this._defaultBreakpoint;\n }\n /**\n * Sets the default breakpoint value\n */\n set defaultBreakpoint(breakpoint) {\n this._defaultBreakpoint = breakpoint;\n this.update();\n }\n /**\n * Subscribes a callback to be called when breakpoints change\n */\n subscribe(callback) {\n if (!this.subscriptions.includes(callback)) {\n this.subscriptions.push(callback);\n }\n }\n /**\n * Unsubscribes a callback from the breakpoint tracker\n */\n unsubscribe(callback) {\n this.subscriptions = this.subscriptions.filter((subscription) => callback !== subscription);\n }\n /**\n * Call all subscribed callbacks\n */\n notifySubscribers(breakpoint) {\n this.subscriptions.forEach((subscription) => {\n subscription(breakpoint);\n });\n }\n}\nexport default new BreakpointTracker();\n","// © Microsoft Corporation. All rights reserved.\r\n// Split from DOMHelper to aid treeshaking\r\n// which currently adds class definition dependency (eg. RequestData)\r\n// even if they aren't used by code that only uses canUseDOM\r\n//\r\n// This being used in PCS inline scripts so only add to here\r\n// if critically important and do not have any other dependencies;\r\n// otherwise add to DOMHelpers\r\n/**\r\n * Checks if the DOM is available to access and use.\r\n * @returns {boolean} - true if DOM is available, or false if it is not. This is typically true for\r\n * client side rendering and false for server side rendering.\r\n */\r\nexport function canUseDOM() {\r\n return !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\r\n}\r\n//# sourceMappingURL=DOMHelpersCore.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { identifyBreakpoint, BreakpointTracker } from \"@microsoft/fast-layouts-react\";\r\nimport { canUseDOM } from \"./DOMHelpersCore\";\r\nimport { getRequestData } from \"./requestData\";\r\n/**\r\n * Checks if a given JS media query matches in an isomorphic manner\r\n * NOTE: Only supports min/max-width queries outside of the web client\r\n * @param query The media query\r\n * @param breakpoint The current breakpoint, needed if SSR\r\n */\r\nexport function canMatchMedia(query, breakpoint) {\r\n if (canUseDOM()) {\r\n return window.matchMedia(query).matches;\r\n }\r\n if (breakpoint === undefined) {\r\n throw Error(\"Breakpoint must be supplied when server side rendering\");\r\n }\r\n const maxWidthValues = /max-width:\\s?(\\d+)/.exec(query);\r\n const minWidthValues = /min-width:\\s?(\\d+)/.exec(query);\r\n const minWidth = minWidthValues && minWidthValues.length ? minWidthValues[1] : 0;\r\n const maxWidth = maxWidthValues && maxWidthValues.length ? maxWidthValues[1] : Infinity;\r\n const minBreakpoint = identifyBreakpoint(parseInt(minWidth.toString()), BreakpointTracker.breakpoints);\r\n const maxBreakpoint = maxWidth === Infinity ?\r\n BreakpointTracker.breakpoints.length - 1 : identifyBreakpoint(parseInt(maxWidth.toString()), BreakpointTracker.breakpoints);\r\n return breakpoint >= minBreakpoint && breakpoint <= maxBreakpoint;\r\n}\r\n/**\r\n * Get window.location.href in an isomorphic manner.\r\n */\r\nexport function getLocationHref() {\r\n return canUseDOM() ? window.location.href : getRequestData().url.href;\r\n}\r\n/**\r\n * Get window.location.hostname in an isomorphic manner.\r\n */\r\nexport function getLocationHostname() {\r\n return canUseDOM() ? window.location.hostname : getRequestData().url.hostname;\r\n}\r\n/**\r\n * Get window.location.host in an isomorphic manner.\r\n */\r\nexport function getLocationHost() {\r\n return canUseDOM() ? window.location.host : getRequestData().url.host;\r\n}\r\n/**\r\n * Get window.location.origin in an isomorphic manner.\r\n */\r\nexport function getLocationOrigin() {\r\n return canUseDOM() ? window.location.origin : getRequestData().url.origin;\r\n}\r\n/**\r\n * Get window.location.search in an isomorphic manner.\r\n */\r\nexport function getLocationSearch() {\r\n return canUseDOM() ? window.location.search : getRequestData().url.search;\r\n}\r\n/**\r\n * Get window.location.pathname in an isomorphic manner.\r\n */\r\nexport function getLocationPathname() {\r\n return canUseDOM() ? window.location.pathname : getRequestData().url.pathname;\r\n}\r\n/**\r\n * Get window.location.protocol in an isomorphic manner.\r\n */\r\nexport function getLocationProtocol() {\r\n return canUseDOM() ? window.location.protocol : getRequestData().url.protocol;\r\n}\r\n/**\r\n * Get window.location.hash in an isomorphic manner.\r\n */\r\nexport function getLocationHash() {\r\n return canUseDOM() ? window.location.hash : getRequestData().url.hash;\r\n}\r\n/**\r\n * Get document.cookie in an isomorphic manner.\r\n */\r\nexport function getCookieString() {\r\n return canUseDOM() ? window.document.cookie : getRequestData().cookie;\r\n}\r\n/**\r\n * Get window.document.getElementById(elementId).\r\n */\r\nexport function getDocumentElementById(elementId) {\r\n if (!canUseDOM()) {\r\n throw new Error(\"getDocumentElementById is unsupported server side. This call should be wrapped in canUseDOM().\");\r\n }\r\n return window.document.getElementById(elementId);\r\n}\r\n/**\r\n * Get window.document.getDocumentElementsByTagName(elementId).\r\n */\r\nexport function getDocumentElementsByTagName(tagName) {\r\n if (!canUseDOM()) {\r\n throw new Error(\"getDocumentElementsByTagName is unsupported server side. This call should be wrapped in canUseDOM().\");\r\n }\r\n return window.document.getElementsByTagName(tagName);\r\n}\r\n/**\r\n * Get indexedDB in an isomorphic manner.\r\n * Todo (http://osgvsowi/23753462), provide actual functionality for indexedDB on the server side.\r\n */\r\nexport function getIndexedDB() {\r\n return canUseDOM() ? window.indexedDB : null;\r\n}\r\n/**\r\n * Get window.innerHeight in an isomorphic manner.\r\n * Todo (http://osgvsowi/23876778), remove the need for server to know about innerWidth by limiting layout options or use CSS based solution.\r\n */\r\nexport function getInnerHeight() {\r\n return canUseDOM() ? window.innerHeight : getRequestData().innerHeight;\r\n}\r\n/**\r\n * Get window.devicePixelRatio in an isomorphic manner.\r\n */\r\nexport function getDevicePixelRatio() {\r\n return canUseDOM() ? window.devicePixelRatio : getRequestData().devicePixelRatio;\r\n}\r\n/**\r\n * Get CSS Grid support in an isomorphic manner\r\n */\r\nexport function getCssGridSupport() {\r\n return !!(canUseDOM() ? (window.CSS && window.CSS.supports && CSS.supports(\"display\", \"grid\")) : getRequestData().canUseCssGrid);\r\n}\r\n/**\r\n * Get variable font support in an isomorphic manner\r\n * TODO: SSR currently does not support custom fonts.\r\n */\r\nexport function getVariableFontSupport() {\r\n if (!canUseDOM()) {\r\n throw new Error(\"SSR currently does not support custom fonts.\");\r\n }\r\n return !!(window.CSS && window.CSS.supports && CSS.supports(\"(font-variation-settings: normal)\"));\r\n}\r\n/**\r\n * Returns a script element using several default values.\r\n * Not supported server side.\r\n * @param src The absolute URL for the script src. Default is undefined, blank is okay.\r\n * @param id The id to assign the script element. default is \"\" so no id.\r\n * @param loadAsync Should the script load asynchronously. Default is true.\r\n * @param crossOrigin Set the script crossorigin attribute. Default is anonymous.\r\n * @returns {HTMLScriptElement} the script element. not using const so it can be overridden by caller.\r\n */\r\nexport function createScriptTag(src = undefined, id = undefined, loadAsync = true, crossOrigin = \"anonymous\") {\r\n if (!canUseDOM()) {\r\n throw new Error(\"createScriptTag is unsupported server side. This call should be wrapped in canUseDOM().\");\r\n }\r\n const scriptElement = document.createElement(\"script\");\r\n if (id) {\r\n scriptElement.id = id;\r\n }\r\n scriptElement.type = \"text/javascript\";\r\n if (src) {\r\n scriptElement.src = src;\r\n scriptElement.async = loadAsync;\r\n scriptElement.crossOrigin = crossOrigin;\r\n }\r\n // @ts-ignore\r\n if (window && window.NONCE_ID) {\r\n // @ts-ignore\r\n scriptElement.nonce = window.NONCE_ID;\r\n }\r\n return scriptElement;\r\n}\r\n//# sourceMappingURL=DOMHelpers.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { getLocationSearch } from \"@msnews/isomorphic-util\";\r\nexport class MockManager {\r\n /**\r\n * Initialize mock manager\r\n */\r\n constructor() {\r\n /** Indicates if mock is requested*/\r\n this._mocksEnabled = false;\r\n this._mockConfigDictionary = {};\r\n this._mockConfigDictionary = this.createMockDictionary();\r\n this._mocksEnabled = Object.keys(this._mockConfigDictionary).length !== 0;\r\n }\r\n /**\r\n * Returns the list of mocked config list\r\n */\r\n get mockConfigDictionary() {\r\n return this._mockConfigDictionary;\r\n }\r\n /**\r\n * Returns if mock was requested\r\n */\r\n get mocksEnabled() {\r\n return this._mocksEnabled;\r\n }\r\n /**\r\n * Gets the list of mocks from QSP\r\n * eg: item= mock:river/default|river/mockinst returns what to mock (river/default) with replacement sought (river/mockinst)\r\n * This is used only in local dev/TEST scenario. Please do not use this for PROD scenarios\r\n * @returns Dictionary of mock configs sought to be replaced\r\n */\r\n createMockDictionary() {\r\n // Get all parameters that begin with 'mock:'\r\n const itemParams = new URLSearchParams(getLocationSearch()).getAll(\"item\").filter(item => /^mock:/.test(item));\r\n const mockConfigDictionary = {};\r\n itemParams.forEach((param) => {\r\n const [_, mockParam] = param.split(\":\");\r\n const [mockFrom, mockWith] = mockParam.split(\"|\");\r\n mockConfigDictionary[mockFrom] = mockWith;\r\n });\r\n return mockConfigDictionary;\r\n }\r\n}\r\nexport const mockManager = new MockManager();\r\n//# sourceMappingURL=MockManager.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { ConfigOrigin } from \"@msnews/core-contracts\";\r\nimport { defaultInstance, featureConfigs, featureManifests, gitConfigsTreatmentWithIdb, localizationConfigs } from \"./Constants\";\r\nimport { getLocationSearch } from \"@msnews/isomorphic-util\";\r\nimport { mockManager } from \"@msnews/mock-config\";\r\nexport const buildNumberRegex = /^\\d{8}\\.\\d+$/;\r\n/**\r\n * Get the cache key based on configRef object\r\n * @param {ConfigReference} configRef object\r\n * @returns The unique cache key from configRef\r\n */\r\nexport function getCacheKeyFromConfigRef(configRef, appType) {\r\n if (!configRef) {\r\n return;\r\n }\r\n const { experienceType, instanceSrc, sharedNs } = configRef;\r\n const keys = [appType, experienceType, instanceSrc];\r\n if (sharedNs) {\r\n keys.push(sharedNs);\r\n }\r\n return keys.map(key => key || \"\").join(\"/\").toLowerCase();\r\n}\r\n/**\r\n * Map key received from CRS response to ConfigReference\r\n * @param key received in CRS response\r\n * @returns ConfigReference\r\n */\r\nexport function getConfigRefFromKey(key) {\r\n if (!key) {\r\n return null;\r\n }\r\n if (key.match(\"^shared/\")) {\r\n const [sharedPrefix, sharedNs, experienceType, instanceSrc] = key.split(\"/\");\r\n return { experienceType, instanceSrc, sharedNs };\r\n }\r\n else {\r\n const [experienceType, instanceSrc] = key.split(\"/\");\r\n return { experienceType, instanceSrc };\r\n }\r\n}\r\n/**\r\n * This function returns child configRefs\r\n * @param {ExperienceConfig} resolvedConfig: Experience resolved properties\r\n * @returns {Set} Array of Config Refs in the resolved config.\r\n */\r\nexport function getChildConfigRefs(resolvedConfig) {\r\n const configRefSet = new Set();\r\n if (resolvedConfig && resolvedConfig.properties) {\r\n try {\r\n addConfigRefFromObject(resolvedConfig.properties, configRefSet);\r\n }\r\n catch (error) {\r\n // Log Error\r\n }\r\n }\r\n return configRefSet;\r\n}\r\n/**\r\n * Adds all config ref found in the object to the given set.\r\n * @param obj The object to search in.\r\n * @param indicies The set of ConfigReference to add to.\r\n */\r\nfunction addConfigRefFromObject(obj, indicies) {\r\n const configRef = obj.configRef;\r\n if (configRef && configRef.experienceType) {\r\n indicies.add(configRef);\r\n }\r\n for (const value of Object.values(obj)) {\r\n if (typeof (value) === \"object\" && value) {\r\n addConfigRefFromObject(value, indicies);\r\n }\r\n }\r\n}\r\n/**\r\n * Gets Entity Reference string from entity object.\r\n * This is a combination of experienceType, instanceSrc and sharedNs (if exists), to access manifest hashes.\r\n * @param {ConfigReference} configReference config reference for the root config.\r\n * @param {boolean} isLocalizationConfig indicates if this is for localizationConfigs.\r\n * @returns {Map} returns the merged config map.\r\n */\r\nexport function getConfigReferencePath(configReference, isLocalizationConfig = false) {\r\n if (!configReference) {\r\n return;\r\n }\r\n // use default instance when it is localization configs or when instanceSrc isn't available.\r\n const instance = (isLocalizationConfig ? defaultInstance : configReference.instanceSrc) || defaultInstance;\r\n if (!configReference.sharedNs || isLocalizationConfig) {\r\n return `${configReference.experienceType}/${instance}`;\r\n }\r\n else {\r\n return `shared/${configReference.sharedNs}/${configReference.experienceType}/${instance}`;\r\n }\r\n}\r\n/**\r\n * Race between network and cache promise\r\n * Borrowed from https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook#cache-and-network-race\r\n * @param promises - Array of promises\r\n */\r\nexport function networkAndCacheRace(promises) {\r\n // return a new promise\r\n return new Promise((resolve, reject) => {\r\n // iterate over each promise, 'chain' is the previously\r\n // returned value, or Promise.reject() for the first\r\n // iteration\r\n promises.reduce((chain, promise) => {\r\n // cast \"promise\" to a promise as other promise methods do\r\n promise = Promise.resolve(promise);\r\n // if this promise resolves, resolve the promise\r\n // we originally returned from networkAndCacheRace\r\n // (the resolve function ignore additional calls,\r\n // so first call wins)\r\n // Do nothing at catch because we want to wait for all promises.\r\n promise.then(resolve).catch(reject => {\r\n // do nothing\r\n });\r\n // build a chain of promises, where each catches from\r\n // the previous\r\n return chain.catch(() => {\r\n return promise;\r\n });\r\n }, Promise.reject()).catch(() => {\r\n // if we got here, none of the promises fulfilled\r\n reject(Error(\"Unable get a response from network or cache.\"));\r\n });\r\n });\r\n}\r\n/**\r\n * Return true if bundle, config and loc hash of current page is same as last page\r\n */\r\nexport function isConfigBundleLocHashSameAsLastPage(configCacheProperties) {\r\n if (!configCacheProperties) {\r\n return false;\r\n }\r\n const { bundleHash, lastBundleHash, configHash, lastConfigHash, locHash, lastLocHash } = configCacheProperties;\r\n if (lastBundleHash && lastBundleHash === bundleHash\r\n && lastConfigHash && lastConfigHash === configHash\r\n && lastLocHash && lastLocHash === locHash) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Send this app error\r\n * @param appError AppError to send to telemetry\r\n */\r\nexport function sendAppError(appErrorCallback, appError) {\r\n if (appErrorCallback) {\r\n appErrorCallback(appError);\r\n }\r\n}\r\n/**\r\n * Check if IndexedDB caching is enabled based on the flight treatment\r\n * @param flights Array of flights\r\n * @returns true if this is git configs treatment with indexedDB caching enabled\r\n */\r\nexport function enableIdbCaching(flights) {\r\n return flights && flights.indexOf(gitConfigsTreatmentWithIdb) > -1;\r\n}\r\n/**\r\n * Get build number given associated app-type from published bundle info\r\n * eg: https://assets.msn.com/bundles/v1/edgeChromium/20210112.159/v, https://assets.msn.com/bundles/v1/edgeChromium/latest/v)\r\n * This is used only in local dev/TEST scenario. Please do not use this for PROD scenarios\r\n * @param buildVersion Build version\r\n * @param appType associated app type for that build\r\n * @returns Associated build number\r\n */\r\nexport function getBuildNumberAsync(buildVersion, appType) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n // Provide QSP build number override to buildVersion specified in bundleInfo\r\n let buildNumber;\r\n const itemParams = new URLSearchParams(getLocationSearch()).getAll(\"item\");\r\n const itemSpalink = itemParams ?\r\n itemParams.find((param) => (param && param.indexOf(\"spalink:\") === 0)) :\r\n undefined;\r\n if (itemSpalink) {\r\n buildNumber = itemSpalink.replace(\"spalink:\", \"\").replace(\"/debug\", \"\");\r\n }\r\n const build = buildNumber || buildVersion;\r\n if (!build || !appType || (build !== \"latest\" && build !== \"rolling\" &&\r\n // Check if build number doesn't look legit (eg: 20210112.159)\r\n !buildNumberRegex.test(build))) {\r\n throw new Error(`Arguments are incorrect. Check buildVersion: ${build} appType: ${appType}`);\r\n }\r\n // Adding a datetime qsp to ensure we don't get cached results for assets.msn.com/bundles/v1/rolling\r\n const fetchUrl = `https://assets.msn.com/bundles/v1/${appType}/${build}/v?${(new Date()).getTime()}`;\r\n let response;\r\n try {\r\n response = yield fetch(fetchUrl);\r\n if (!response || !response.ok) {\r\n throw new Error(`Response not OK, Status: ${response.status}, StatusText: ${response.statusText}`);\r\n }\r\n return (yield response.text()).trim();\r\n }\r\n catch (error) {\r\n throw new Error(`getBuildNumberAsync Fetch Url: ${fetchUrl}, ${error}`);\r\n }\r\n });\r\n}\r\n/**\r\n * Helper method that indicates whether configs matching the right config-type are from local\r\n * @param configType\r\n * @param configOrigins\r\n */\r\nexport function useLocalConfigs(configType, configOrigins) {\r\n return isFeatureConfigType(configType)\r\n ? isLocalOrigin(configOrigins && configOrigins.feature)\r\n : isLocalOrigin(configOrigins && configOrigins.loc);\r\n}\r\n/**\r\n * Helper method to indicate if config type is feature config related\r\n * @param configType\r\n */\r\nfunction isFeatureConfigType(configType) {\r\n return configType === featureConfigs || configType === featureManifests;\r\n}\r\n/**\r\n * Helper method to indicate if a specific config type (feature or loc) is local\r\n * @param configOrigin\r\n */\r\nfunction isLocalOrigin(configOrigin) {\r\n return configOrigin === ConfigOrigin.Local;\r\n}\r\n/**\r\n * Helper method to set the right path to local file system in local dev work flow\r\n * @param configType loc-configs or feature-configs\r\n * @param configReference combination of experienceType, instance source and shared namespace\r\n * @param appType\r\n */\r\nexport function getLocalDevPrefix(configType, configReference, appType) {\r\n let hasMockReplacement = false;\r\n const mockReplacement = mockManager.mocksEnabled\r\n && mockManager.mockConfigDictionary\r\n && mockManager.mockConfigDictionary[configReference];\r\n if (mockReplacement) {\r\n configReference = mockReplacement;\r\n hasMockReplacement = true;\r\n }\r\n let prependConfigType;\r\n if (hasMockReplacement) {\r\n prependConfigType = \"mock\";\r\n }\r\n else if (configType === localizationConfigs) {\r\n prependConfigType = \"dev/loc\";\r\n }\r\n else {\r\n prependConfigType = \"prod\";\r\n }\r\n const prependConfigLocation = /^shared/.test(configReference) ? configReference : `${appType}/${configReference}`;\r\n return `${prependConfigType}/${prependConfigLocation}`;\r\n}\r\n//# sourceMappingURL=Utilities.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { memoize } from \"lodash-es\";\r\nimport { useLocalConfigs } from \"../../../utilities\";\r\n/**\r\n * BlobFetcher\r\n * This is for downloading the blob according to the url.\r\n */\r\n// todo: use PCS headdata response here for the assets.msn.com hardcoded part?\r\nconst gitConfigBaseUrl = \"https://assets.msn.com/periconfigs/\";\r\n// todo: Figure out how to not specify the port\r\nconst gitLocalConfigBaseUrl = \"https://localhost.msn.com:9000/\";\r\n// Memoize the fetchAsyncNotMemoized function to return promises when it is continuing to fetch.\r\nexport const fetchAsync = memoize(fetchAsyncNotMemoized);\r\n/**\r\n * This function fetches the file from a combination of provided relative url and the const GIT config base url.\r\n * @param relativeUrl to be used to fetch the blob\r\n * @param configType featureConfigs | featureManifests | localizationConfigs | localizationManifests configType\r\n * @param configOrigins Indicates if configs should be served from local repo\r\n */\r\nexport function fetchAsyncNotMemoized(relativeUrl, configType, configOrigins) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!relativeUrl) {\r\n // Logs error later in ClientResolver.ts\r\n throw new Error(\"BlobFetcher.ts: Fetch Error: Relative Url is null or undefined.\");\r\n }\r\n const fetchUrl = useLocalConfigs(configType, configOrigins)\r\n ? gitLocalConfigBaseUrl + relativeUrl // File names are case sensitive for local look up but not for Azure Blob Storage\r\n : gitConfigBaseUrl + relativeUrl.toLowerCase();\r\n const fetchPromise = fetch(fetchUrl).then(response => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n // Logs error later in ClientResolver.ts\r\n throw new Error(`Non-200 response, Status: ${response.status}, StatusText: ${response.statusText}, fetch url: ${fetchUrl}`);\r\n }).catch(error => {\r\n // Catches json parsing and fetch errors.\r\n throw new Error(`BlobFetcher.ts: Fetch Error: fetch url: ${fetchUrl}, error: ${error}.`);\r\n });\r\n return fetchPromise;\r\n });\r\n}\r\n//# sourceMappingURL=BlobFetcher.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { getLocalDevPrefix, useLocalConfigs } from \"../../../utilities\";\r\nimport { fetchAsync } from \"./BlobFetcher\";\r\nimport { memoize } from \"lodash-es\";\r\n/**\r\n * ConfigIndexService class\r\n * This is for fetching and parsing the Config Index into an easily consumable form.\r\n */\r\nexport class ClientConfigIndexService {\r\n /**\r\n * Initialize client config index service.\r\n * @param {appType} appType\r\n * @param {ConfigOrigins } Indicates if configs should be served from local repo\r\n */\r\n constructor(appType, configOrigins) {\r\n /** null config index fetches to note as error later */\r\n this.failedConfigIndexFetches = [];\r\n this.appType = appType;\r\n this.configOrigins = configOrigins;\r\n this.fetchAndParseConfigIndex = memoize(this.fetchAndParseConfigIndex, (...args) => args.join(\"/\"));\r\n }\r\n /**\r\n * This function fetches and parses config index file from azure blob storage.\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} configReference config reference: combination of experienceType, instance source and shared namespace.\r\n * @param {string} hashedFileName config index hashed file name from the manifest file.\r\n */\r\n fetchAndParseConfigIndex(configType, configReference, hashedFileName) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n // In prod scenario, we don't proceed if hashedFileName is empty\r\n // In local scenario, hashed name could be empty\r\n // If hashed file name is null/undefined AND it's not local scenario, return undefined\r\n const isLocalConfigs = useLocalConfigs(configType, this.configOrigins);\r\n if (!hashedFileName && !isLocalConfigs) {\r\n return undefined;\r\n }\r\n const relativeUrl = isLocalConfigs\r\n ? `${getLocalDevPrefix(configType, configReference, this.appType)}/index.json`\r\n : `${configType}/${configReference}/index.json/${hashedFileName}`;\r\n try {\r\n return yield fetchAsync(relativeUrl, configType, this.configOrigins);\r\n }\r\n catch (error) {\r\n if (!isLocalConfigs) {\r\n this.failedConfigIndexFetches.push(error);\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Returns the list of failed config index fetches\r\n */\r\n getFailedConfigIndexFetches() {\r\n return this.failedConfigIndexFetches;\r\n }\r\n}\r\n//# sourceMappingURL=ClientConfigIndexService.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { getLocalDevPrefix, useLocalConfigs } from \"../../../utilities\";\r\nimport { fetchAsync } from \"./BlobFetcher\";\r\nimport { memoize } from \"lodash-es\";\r\n/**\r\n * ClientConfigService class\r\n * This is for fetching and parsing the Config into an easily consumable form.\r\n */\r\nexport class ClientConfigService {\r\n /**\r\n * Initialize client config service.\r\n * @param {appType} appType\r\n * @param {ConfigOrigins} Indicates if configs should be served from local repo\r\n */\r\n constructor(appType, configOrigins) {\r\n /** Array for keeping track of the null fetches */\r\n this.failedConfigFetches = [];\r\n this.appType = appType;\r\n this.configOrigins = configOrigins;\r\n this.fetchAndParseConfig = memoize(this.fetchAndParseConfig, (...args) => args.join(\"/\"));\r\n }\r\n /**\r\n * This function fetches and parses config file from azure blob storage.\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} configReference config reference: combination of experienceType, instance source and shared namespace.\r\n * @param {string} configFileName config src file name.\r\n * @param {string} hashedFileName config hashed file name from the manifest file.\r\n */\r\n fetchAndParseConfig(configType, configReference, configFileName, hashedFileName) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n // In prod scenario, we don't proceed if hashedFileName is empty\r\n // In local scenario, hashed name could be empty\r\n // If hashed file name is null/undefined AND it's not local scenario, return undefined\r\n const isLocalConfigs = useLocalConfigs(configType, this.configOrigins);\r\n if (!hashedFileName && !isLocalConfigs) {\r\n return undefined;\r\n }\r\n const relativeUrl = isLocalConfigs\r\n ? `${getLocalDevPrefix(configType, configReference, this.appType)}/${configFileName}`\r\n : `${configType}/${configReference}/${configFileName}/${hashedFileName}`;\r\n try {\r\n return yield fetchAsync(relativeUrl, configType, this.configOrigins);\r\n }\r\n catch (error) {\r\n if (!isLocalConfigs) {\r\n this.failedConfigFetches.push(error);\r\n }\r\n }\r\n });\r\n }\r\n /**\r\n * Returns the list of failed config fetches.\r\n */\r\n getFailedConfigFetches() {\r\n return this.failedConfigFetches;\r\n }\r\n}\r\n//# sourceMappingURL=ClientConfigService.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { fetchAsync } from \"./BlobFetcher\";\r\nimport { isEmpty } from \"lodash-es\";\r\nimport { useLocalConfigs } from \"../../../utilities\";\r\n/**\r\n * Manifest Service class\r\n * This is for fetching and parsing the Manifest into an easily consumable form.\r\n */\r\nexport class ClientManifestService {\r\n /**\r\n * Initialize client manifest service based on app type and if configs should be served from local repo\r\n * @param appType\r\n * @param ConfigOrigins Indicates if configs should be served from local repo\r\n */\r\n constructor(appType, configOrigins) {\r\n /** Manifest map to quickly return already fetched manifests. */\r\n this.manifestsMap = new Map();\r\n this.appType = appType;\r\n this.configOrigins = configOrigins;\r\n }\r\n /**\r\n * This function fetches and parses manifest file from azure blob storage.\r\n * @param {string} manifestType config type, loc-manifests or feature-manifests\r\n * @param {string} version build version\r\n */\r\n fetchAndParseManifest(manifestType, version) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (useLocalConfigs(manifestType, this.configOrigins)) {\r\n return undefined;\r\n }\r\n const relativeUrl = `${manifestType}/${this.appType}/${version}.json`;\r\n // We don't need a promise map check because it's done in BlobFetcher.\r\n if (!this.manifestsMap.has(manifestType)) {\r\n try {\r\n const manifestBlobResult = yield fetchAsync(relativeUrl);\r\n this.manifestsMap.set(manifestType, manifestBlobResult);\r\n if (isEmpty(manifestBlobResult)) {\r\n throw new Error(`Manifest response is ok but empty or undefined, relative url: ${relativeUrl}`);\r\n }\r\n }\r\n catch (error) {\r\n // Update the value to null no matter what the error is.\r\n this.manifestsMap.set(manifestType, null);\r\n throw new Error(`ClientManifestService.ts: ${error}`);\r\n }\r\n }\r\n // Return for easy testing\r\n // todo: would this cause perf problem since feature manifest is huge?\r\n return this.manifestsMap.get(manifestType);\r\n });\r\n }\r\n /**\r\n * Gets the hashed file name from the manifest by creating config index map key.\r\n * @param {string} configReference config reference: combination of experienceType, instance source and shared namespace.\r\n * @param {string} manifestType manifest type, feature-manifests vs localization-manifests\r\n */\r\n getConfigIndexHashedFileName(configReference, manifestType) {\r\n if (useLocalConfigs(manifestType, this.configOrigins)) {\r\n return undefined;\r\n }\r\n const configIndexKey = `${configReference}/index.json`;\r\n return this.getFromManifest(configIndexKey, manifestType);\r\n }\r\n /**\r\n * Gets the hashed file name from the manifest by creating config map key.\r\n * @param {string} configReference config reference made from entity information.\r\n * @param {string} configFileName config src file name.\r\n * @param {string} manifestType manifest type, feature-manifests vs localization-manifests\r\n */\r\n getConfigHashedFileName(configReference, configFileName, manifestType) {\r\n if (useLocalConfigs(manifestType, this.configOrigins)) {\r\n return undefined;\r\n }\r\n const configKey = `${configReference}/${configFileName}`;\r\n return this.getFromManifest(configKey, manifestType);\r\n }\r\n /**\r\n * Gets the value according to cache key from the local map cache.\r\n * @param {string} cacheKey cache key to read from the map, either for index or config.\r\n * @param {string} manifestType manifest type, feature-manifests vs localization-manifests\r\n */\r\n getFromManifest(cacheKey, manifestType) {\r\n if (!this.manifestsMap || !this.manifestsMap.get(manifestType)) {\r\n return undefined;\r\n }\r\n const manifest = this.manifestsMap.get(manifestType);\r\n if (manifest && manifest.fileHashes) {\r\n return manifest.fileHashes[cacheKey.toLowerCase()];\r\n }\r\n throw new Error(`ClientManifestService.ts: Manifest is defined but does not have fileHashes: ${cacheKey}: cacheKey snippet of manifest: ${JSON.stringify(manifest).substr(0, 100)}`);\r\n }\r\n}\r\n//# sourceMappingURL=ClientManifestService.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { isArray, mergeWith } from \"lodash-es\";\r\n/**\r\n * Manifest Service class\r\n * This is for fetching and parsing the Manifest into an easily consumable form.\r\n */\r\n/**\r\n * Merges config objects.\r\n * @private\r\n * @param {ExperienceConfigWrapper[]} configs - an array of config documents\r\n * @param {string} experienceType - experienceType\r\n * @return ExperienceConfig - returns merged config based on a set of rules\r\n */\r\nexport function mergeConfigs(configs) {\r\n if (!configs || configs.length < 1) {\r\n return null;\r\n }\r\n const result = configs[0];\r\n // skip the 0th item as it is assigned to result above, only merge properties section\r\n for (let count = 1; count < configs.length; count++) {\r\n result.properties = mergeWith(result.properties, configs[count].properties, configMergeCustomizer);\r\n }\r\n return result;\r\n}\r\n/**\r\n * Customizer for merge. We are explcitly overriding the array from taget to source. No array elements from source are preserved.\r\n * @private\r\n * @param {any} srcValue - source object to merge. Can be of type any\r\n * @param {any} objValue - target object to merge. Can be of type any\r\n * @return target Object when the type is array. Otherwise uses default behavior of merge.\r\n */\r\nfunction configMergeCustomizer(srcValue, objValue) {\r\n if (isArray(srcValue)) {\r\n return objValue;\r\n }\r\n}\r\n//# sourceMappingURL=ClientConfigMerger.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Browser version operators enum\r\n */\r\nexport var BrowserVersionOperator;\r\n(function (BrowserVersionOperator) {\r\n BrowserVersionOperator[\"Equals\"] = \"equals\";\r\n BrowserVersionOperator[\"GreaterThan\"] = \"greaterThan\";\r\n BrowserVersionOperator[\"LessThan\"] = \"lessThan\";\r\n BrowserVersionOperator[\"NotEquals\"] = \"notEquals\";\r\n BrowserVersionOperator[\"OneOf\"] = \"oneOf\";\r\n})(BrowserVersionOperator || (BrowserVersionOperator = {}));\r\n//# sourceMappingURL=BrowserVersionOperator.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * This will decide whether to create Alert for this app error or no alert. This can generate IcM ticket.\r\n * Alerts ones are tracked at http://aka.ms/AppErrors\r\n * NoAlerts will have separate tab just next to Errors aka Warnings. IcM ticket won't be generated when NoAlert is set.\r\n */\r\nexport var Severity;\r\n(function (Severity) {\r\n /**\r\n * This is app error with default severity\r\n */\r\n Severity[Severity[\"Alert\"] = 0] = \"Alert\";\r\n /**\r\n * This is app warning\r\n */\r\n Severity[Severity[\"NoAlert\"] = 1] = \"NoAlert\";\r\n /**\r\n * This app error has high user impact\r\n */\r\n Severity[Severity[\"HighImpact\"] = 2] = \"HighImpact\";\r\n /**\r\n * This is fatal app error\r\n */\r\n Severity[Severity[\"Critical\"] = 3] = \"Critical\";\r\n})(Severity || (Severity = {}));\r\n//# sourceMappingURL=Severity.js.map","// © Microsoft Corporation. All rights reserved.\r\nexport var ErrorBehavior;\r\n(function (ErrorBehavior) {\r\n /** This app error can trigger exceptional behavior */\r\n ErrorBehavior[ErrorBehavior[\"Exceptional\"] = 0] = \"Exceptional\";\r\n /** This app error can trigger fallback behavior */\r\n ErrorBehavior[ErrorBehavior[\"Fallback\"] = 1] = \"Fallback\";\r\n})(ErrorBehavior || (ErrorBehavior = {}));\r\n//# sourceMappingURL=ErrorBehavior.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { BrowserVersionOperator } from \"@msnews/config-data-types\";\r\n/**\r\n * TargetScopeMatcher\r\n * This is for comparing targetscope from the config with targetscope from the page.\r\n */\r\n/**\r\n * basic version of target scope that only checks market currently.\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope matches with config target scope, otherwise false\r\n */\r\nexport function targetScopeMatched(configTargetScope, pageTargetScope) {\r\n // if target scope is undefined for a config entry, we treat that as default config and apply it\r\n if (!configTargetScope) {\r\n return true;\r\n }\r\n return (audienceModeMatched(configTargetScope, pageTargetScope)\r\n && browserTypeMatched(configTargetScope, pageTargetScope)\r\n && deviceTypeMatched(configTargetScope, pageTargetScope)\r\n && domainMatched(configTargetScope, pageTargetScope)\r\n && experimentMatched(configTargetScope, pageTargetScope)\r\n && marketMatched(configTargetScope, pageTargetScope)\r\n && ocidMatched(configTargetScope, pageTargetScope)\r\n && osMatched(configTargetScope, pageTargetScope)\r\n && pageTypeMatched(configTargetScope, pageTargetScope)\r\n && platformMatched(configTargetScope, pageTargetScope));\r\n}\r\n/**\r\n * function to check if current audienceMode type matches target audienceMode type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope audienceMode matches with config target scope audienceMode, otherwise false\r\n */\r\nfunction audienceModeMatched(configTargetScope, pageTargetScope) {\r\n return !configTargetScope.audienceMode || pageTargetScope.audienceMode === configTargetScope.audienceMode;\r\n}\r\n/**\r\n * function to check if current browser type matches target browser type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope browser type matches with config target scope browser type, otherwise false\r\n */\r\nfunction browserTypeMatched(configTargetScope, pageTargetScope) {\r\n if (!configTargetScope.browser\r\n || !configTargetScope.browser.version\r\n || !configTargetScope.browser.browserType) {\r\n return true;\r\n }\r\n // Proceed if browserType exists and it matches\r\n if (pageTargetScope.browser\r\n && pageTargetScope.browser.browserType\r\n && pageTargetScope.browser.browserType === configTargetScope.browser.browserType) {\r\n const pcsBrowserVersion = pageTargetScope.browser.version;\r\n if (!pcsBrowserVersion) {\r\n return true;\r\n }\r\n const configBrowserVersion = configTargetScope.browser.version;\r\n // If browser version in config index scope is \"87\", match with \"87\" from browser version in page target scope\r\n if (typeof configBrowserVersion === \"string\"\r\n && pcsBrowserVersion === configBrowserVersion) {\r\n return true;\r\n }\r\n // If browser version is object, check if matches.\r\n if (typeof configBrowserVersion === \"object\") {\r\n const pcsIntBrowserVersion = parseInt(pcsBrowserVersion);\r\n for (const operator in configBrowserVersion) {\r\n const value = configBrowserVersion[operator];\r\n // value is of type number so it can be 0. Hence check for undefined or null explicitly\r\n if (value !== undefined && value !== null) {\r\n switch (operator) {\r\n case BrowserVersionOperator.Equals:\r\n if (pcsIntBrowserVersion !== value) {\r\n return false;\r\n }\r\n break;\r\n case BrowserVersionOperator.GreaterThan:\r\n if (!(pcsIntBrowserVersion > value)) {\r\n return false;\r\n }\r\n break;\r\n case BrowserVersionOperator.LessThan:\r\n if (!(pcsIntBrowserVersion < value)) {\r\n return false;\r\n }\r\n break;\r\n case BrowserVersionOperator.NotEquals:\r\n if (pcsIntBrowserVersion === value) {\r\n return false;\r\n }\r\n break;\r\n case BrowserVersionOperator.OneOf:\r\n if (value.indexOf(pcsIntBrowserVersion) === -1) {\r\n return false;\r\n }\r\n break;\r\n default: return false;\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current device type matches target device type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope device type matches with config target scope device type, otherwise false\r\n */\r\nfunction deviceTypeMatched(configTargetScope, pageTargetScope) {\r\n return !configTargetScope.deviceFormFactor || pageTargetScope.deviceFormFactor === configTargetScope.deviceFormFactor;\r\n}\r\n/**\r\n * Check if current domain matches target domain\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return Whether the current target scope domain matches with config target scope domain\r\n */\r\nfunction domainMatched(configTargetScope, pageTargetScope) {\r\n return !configTargetScope.domain || pageTargetScope.domain === configTargetScope.domain;\r\n}\r\n/**\r\n * function to check if current experiment id matches with the requested scope experiment id.\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope experiment matches with config target scope experiment, otherwise false\r\n */\r\nfunction experimentMatched(configTargetScope, pageTargetScope) {\r\n pageTargetScope.pageExperiments = pageTargetScope.pageExperiments || [];\r\n if (typeof configTargetScope.experimentId != \"string\" || Object.keys(configTargetScope.experimentId).length === 0\r\n || pageTargetScope.pageExperiments.indexOf(configTargetScope.experimentId) >= 0) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Compare the strings case insensitive.\r\n * @private\r\n * @param {string} lhs The string to compare.\r\n * @param {string} rhs The string to compare against.\r\n * @return {number} - true if the strings equal case insensitive.\r\n */\r\nfunction stringsEqualCaseInsensitive(lhs, rhs) {\r\n return (lhs || \"\").localeCompare(rhs || \"\", undefined, { sensitivity: \"accent\" }) === 0;\r\n}\r\n/**\r\n * function to check if current market scope match with target scope market.\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope market matches with config target scope market, otherwise false\r\n */\r\nfunction marketMatched(configTargetScope, pageTargetScope) {\r\n // if locale is not part of target scope, we assume it is applicable for all locale.\r\n // Separated out this if condition to have clarity about this behavior.\r\n if (!configTargetScope.locale) {\r\n return true;\r\n }\r\n const targetLocale = configTargetScope.locale;\r\n const currentLocale = pageTargetScope.locale;\r\n if ((!targetLocale.language || stringsEqualCaseInsensitive(targetLocale.language, currentLocale.language)) &&\r\n (!targetLocale.market || stringsEqualCaseInsensitive(targetLocale.market, currentLocale.market)) &&\r\n (!targetLocale.script || stringsEqualCaseInsensitive(targetLocale.script, currentLocale.script))) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current ocid matches target scope ocid\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope ocid matches with config target scope ocid, otherwise false\r\n */\r\nfunction ocidMatched(configTargetScope, pageTargetScope) {\r\n return stringTargetScopeTypeMatched(configTargetScope.ocid, pageTargetScope.ocid);\r\n}\r\n/**\r\n * function to check if current operating system type matches target operating system type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope operating system type matches with config target scope operating system type, otherwise false\r\n */\r\nfunction osMatched(configTargetScope, pageTargetScope) {\r\n return !configTargetScope.os || pageTargetScope.os === configTargetScope.os;\r\n}\r\n/**\r\n * function to check if current pagetype matches target scope\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope pagetype matches with config target scope pagetype, otherwise false\r\n */\r\nfunction pageTypeMatched(configTargetScope, pageTargetScope) {\r\n // If there is no pageType in config scope, meaning it should match.\r\n if (!configTargetScope.pageType) {\r\n return true;\r\n }\r\n // If there is pageType in config scope but no pageType in pageTargetScope, it's not matching\r\n if (!pageTargetScope.pageType) {\r\n return false;\r\n }\r\n const pcsPageType = pageTargetScope.pageType;\r\n const configPageType = configTargetScope.pageType;\r\n // Check if page type in config and pcs matches\r\n if (typeof configPageType === \"string\"\r\n && configPageType === pcsPageType) {\r\n return true;\r\n }\r\n if (!configPageType\r\n || typeof configPageType !== \"object\") {\r\n return false;\r\n }\r\n // If pageType is exact\r\n // Example: exact: \"dhp\"\r\n if (configPageType.exact\r\n && configPageType.exact.toUpperCase() === pcsPageType.toUpperCase()) {\r\n return true;\r\n }\r\n // Example:\r\n // config scope segments: { “0”: “news”, “1”: “politics” }\r\n // Does not match for above config scope when pcs pagetype: \"news\"\r\n // Does not match for above config scope when pcs pagetype: \"news::coronavirus\"\r\n // Match for above config scope when pcs pagetype: \"news::politics\"\r\n // Match for above config scope when pcs pagetype: \"news::politics::election\"\r\n if (configPageType.segments) {\r\n const segments = configPageType.segments;\r\n const pcsPageTypeSegments = pcsPageType.split(\"::\");\r\n if (pcsPageTypeSegments && pcsPageTypeSegments.length > 0) {\r\n let index = 0;\r\n for (const key in segments) {\r\n const value = segments[key];\r\n if (!value\r\n || typeof value !== \"string\"\r\n // If a segment match is needed for an index where we don't have a segment, then we return false.\r\n || index >= pcsPageTypeSegments.length\r\n // See if the segment values match, if they don't then we return false.\r\n || value.toUpperCase() !== pcsPageTypeSegments[index].toUpperCase()) {\r\n return false;\r\n }\r\n index++;\r\n }\r\n // Make sure that config scope pagetype segments are traversed and return true.\r\n return Object.keys(segments).length === index;\r\n }\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current scope platform type matches target scope platform type\r\n * @private\r\n * @param {PageRequestTargetScope} configTargetScope - experience config reference that has targetscope as child property\r\n * @param {PageRequestTargetScope} pageTargetScope - page target scope, this is the targetscope from the page HTML\r\n * @return boolean - true if current target scope platform matches with config target scope platform, otherwise false\r\n */\r\nfunction platformMatched(configTargetScope, pageTargetScope) {\r\n return !configTargetScope.platform || pageTargetScope.platform === configTargetScope.platform;\r\n}\r\n/**\r\n * function to check if string target scope matches the page value.\r\n * @param configStringValue - string or IStringTargetScopeType value from the config.\r\n * @param pageStringValue - page target string value, cannot be an object.\r\n * @return boolean - true if current target scope platform matches with config target scope platform, otherwise false\r\n */\r\nexport function stringTargetScopeTypeMatched(configStringValue, pageStringValue) {\r\n if (!configStringValue) {\r\n return true;\r\n }\r\n if (!pageStringValue) {\r\n return false;\r\n }\r\n // Check if string typed ocid in config and PCS matches\r\n if (typeof configStringValue === \"string\" && stringsEqualCaseInsensitive(configStringValue, pageStringValue)) {\r\n return true;\r\n }\r\n // if its not an object, then return false.\r\n if (typeof configStringValue !== \"object\") {\r\n return false;\r\n }\r\n const lowerCasePageStringValue = pageStringValue.toLowerCase();\r\n if (configStringValue.startsWith && !lowerCasePageStringValue.startsWith(configStringValue.startsWith.toLowerCase())) {\r\n return false;\r\n }\r\n if (configStringValue.endsWith && !lowerCasePageStringValue.endsWith(configStringValue.endsWith.toLowerCase())) {\r\n return false;\r\n }\r\n if (configStringValue.equals && !stringsEqualCaseInsensitive(configStringValue.equals, pageStringValue)) {\r\n return false;\r\n }\r\n if (configStringValue.notEquals && stringsEqualCaseInsensitive(configStringValue.notEquals, pageStringValue)) {\r\n return false;\r\n }\r\n if (configStringValue.contains && !lowerCasePageStringValue.includes(configStringValue.contains.toLowerCase())) {\r\n return false;\r\n }\r\n if (configStringValue.oneOf && configStringValue.oneOf.indexOf(pageStringValue) === -1) {\r\n return false;\r\n }\r\n return true;\r\n}\r\n//# sourceMappingURL=TargetScopeMatcher.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { ConfigOrigin } from \"@msnews/core-contracts\";\r\nimport { featureConfigs, featureManifests, localizationConfigs, localizationManifests } from \"../../../utilities/Constants\";\r\nimport { getBuildNumberAsync, getConfigReferencePath } from \"../../../utilities/Utilities\";\r\nimport { ClientConfigIndexService } from \"./ClientConfigIndexService\";\r\nimport { ClientConfigService } from \"./ClientConfigService\";\r\nimport { ClientManifestService } from \"./ClientManifestService\";\r\nimport { mergeConfigs } from \"./ClientConfigMerger\";\r\nimport { targetScopeMatched } from \"./TargetScopeMatcher\";\r\n/**\r\n * Manifest Service class\r\n * This is for fetching and parsing the Manifest into an easily consumable form.\r\n */\r\nexport class ClientSingleConfigResolver {\r\n /**\r\n * Initialize single config client resolver based on fetching parameters.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(resolverEnvironment) {\r\n if (!resolverEnvironment\r\n || !resolverEnvironment.configServiceParameters\r\n || !resolverEnvironment.appType\r\n || !resolverEnvironment.configServiceParameters.configServiceBaseUrl\r\n || !resolverEnvironment.targetScope) {\r\n throw new Error(\"ClientSingleConfigResolver.ts: ResolverEnvironment or configServiceParameters or targetScope does not exist.\");\r\n }\r\n this.appType = resolverEnvironment.appType;\r\n this.targetScope = resolverEnvironment.targetScope;\r\n this.buildVersion = resolverEnvironment.configServiceParameters.buildVersion;\r\n this.configOrigins = resolverEnvironment.configOrigins;\r\n this.clientManifestService = new ClientManifestService(this.appType, this.configOrigins);\r\n this.clientConfigIndexService = new ClientConfigIndexService(this.appType, this.configOrigins);\r\n this.clientConfigService = new ClientConfigService(this.appType, this.configOrigins);\r\n }\r\n /**\r\n * This function fetches and parses manifest file from azure blob storage.\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} appType application type\r\n * @param {string} version build version\r\n */\r\n resolveConfigAsync(entity) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n // todo: consider using promise.then.then train to avoid awaiting for individual steps.\r\n const featureEntityReference = getConfigReferencePath(entity);\r\n const localizationEntityReference = getConfigReferencePath(entity, true);\r\n this.buildNumber = this.tryGetBuildNumber() || (yield getBuildNumberAsync(this.buildVersion, this.appType));\r\n // fetch the manifest files\r\n const featureManifestTask = this.clientManifestService.fetchAndParseManifest(featureManifests, this.buildNumber);\r\n const localizationManifestTask = this.clientManifestService.fetchAndParseManifest(localizationManifests, this.buildNumber);\r\n // wait for manifest fetches, they are used within ClientManifestService so no return\r\n yield Promise.all([featureManifestTask, localizationManifestTask]);\r\n // try to find configIndexReference in manifest file\r\n const featureIndexHashedFileName = this.clientManifestService.getConfigIndexHashedFileName(featureEntityReference, featureManifests);\r\n const localizationIndexHashedFileName = this.clientManifestService.getConfigIndexHashedFileName(localizationEntityReference, localizationManifests);\r\n // try to get config index files\r\n const featureConfigIndexTask = this.clientConfigIndexService.fetchAndParseConfigIndex(featureConfigs, featureEntityReference, featureIndexHashedFileName);\r\n const localizationConfigIndexTask = this.clientConfigIndexService.fetchAndParseConfigIndex(localizationConfigs, localizationEntityReference, localizationIndexHashedFileName);\r\n const indexResults = yield Promise.all([featureConfigIndexTask, localizationConfigIndexTask]).then((results) => {\r\n return {\r\n featureIndex: results[0],\r\n localizationIndex: results[1]\r\n };\r\n });\r\n // maybe skip these just by returning .configs of index, since its default\r\n const featureConfigPaths = indexResults.featureIndex && indexResults.featureIndex.configs || undefined;\r\n const localizationConfigPaths = indexResults.localizationIndex && indexResults.localizationIndex.configs || undefined;\r\n const configTasks = [];\r\n // get the config tasks according to list of config paths from the index\r\n this.fetchMathingConfigs(configTasks, featureConfigPaths, featureManifests, featureConfigs, featureEntityReference);\r\n this.fetchMathingConfigs(configTasks, localizationConfigPaths, localizationManifests, localizationConfigs, localizationEntityReference);\r\n if (configTasks.length == 0) {\r\n return undefined;\r\n }\r\n // await all the configs and merge them\r\n const configsToMerge = yield Promise.all(configTasks).then(results => results);\r\n const filteredConfigs = configsToMerge.filter(config => config != null); // Remove null or undefined configs\r\n const mergedConfig = mergeConfigs(filteredConfigs);\r\n return mergedConfig;\r\n });\r\n }\r\n /**\r\n * Checks if the config paths match the targetscope of the page.\r\n * If it matches, starts config fetch task and adds it to the configTasks input parameter.\r\n * @param {Promise[]} configTasks array consisting of config fetching tasks, will be updated in this function\r\n * @param {ExperienceConfigLink[]} configPaths config paths from the config index file\r\n * @param {string} manifestType config type, loc-manifests or feature-manifests\r\n * @param {string} configType config type, loc-configs or feature-configs\r\n * @param {string} configReference configReference to use when getting the hashed file name\r\n */\r\n fetchMathingConfigs(configTasks, configPaths, manifestType, configType, configReference) {\r\n if (!configPaths || configPaths.length == 0) {\r\n return;\r\n }\r\n configPaths.forEach(configPath => {\r\n if (targetScopeMatched(configPath.targetScope, this.targetScope)) {\r\n const configFileName = configPath.src;\r\n const hashedFileName = this.clientManifestService.getConfigHashedFileName(configReference, configFileName, manifestType);\r\n configTasks.push(this.clientConfigService.fetchAndParseConfig(configType, configReference, configFileName, hashedFileName));\r\n }\r\n });\r\n }\r\n /**\r\n * Returns all failed fetches for throwing errors.\r\n */\r\n getFailedFetches() {\r\n const allNullFetches = [];\r\n const configNullFetches = this.clientConfigService.getFailedConfigFetches();\r\n if (configNullFetches.length > 0) {\r\n allNullFetches.push(...configNullFetches);\r\n }\r\n const configIndexNullFetches = this.clientConfigIndexService.getFailedConfigIndexFetches();\r\n if (configIndexNullFetches.length > 0) {\r\n allNullFetches.push(...configIndexNullFetches);\r\n }\r\n return allNullFetches;\r\n }\r\n get buildNumber() { return this._buildNumber; }\r\n set buildNumber(value) { this._buildNumber = value; }\r\n /**\r\n * Returns build number if already stored or in prod scenario and returns null for local dev scenario\r\n * (where feature configs are from local repo but localized configs are from PROD (blob storage)\r\n * so that it can be fetched asynchronously later on\r\n */\r\n tryGetBuildNumber() {\r\n if (this.buildNumber) {\r\n return this.buildNumber; // If it has already been set, return it\r\n }\r\n else if (this.configOrigins.feature === ConfigOrigin.Local && this.configOrigins.loc === ConfigOrigin.Production) {\r\n // Return null so build number can be fetched asynchronously later\r\n // Fetch build number look up *only* for feature configs local and localized configs from PROD blob storage\r\n return null;\r\n }\r\n else { // PROD scenario\r\n return this.buildVersion; // First time look up for prod scenario. After this first lookup, stored in buildNumber\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ClientSingleConfigResolver.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { ErrorBehavior, Severity } from \"@msnews/core-contracts\";\r\n/**\r\n * All app errors are set to create IcM ticket by default unless specified in individual error code otherwise.\r\n */\r\nconst severity = Severity.Alert;\r\n/**\r\n * Build number is only passed in from updateResolverAppErrorsPropertyBag on page initialization\r\n */\r\nconst pb = {\r\n build: \"\"\r\n};\r\n/**\r\n * Append or update property bag properties. At page level intialization, this should be called to update the build number.\r\n * Since all app error objects has reference to this base property bag, calling this method will in fact update for all app errors.\r\n * @param newPbInfo Additional information needed for app error property bag\r\n */\r\nexport function updateResolverAppErrorsPropertyBag(newPbInfo) {\r\n Object.assign(pb, newPbInfo);\r\n}\r\n/**\r\n * Getter for the base app error property bag. Currently only used in unit test\r\n */\r\nexport function getResolverAppErrorsPropertyBag() {\r\n return pb;\r\n}\r\nconst resolverSourceFile = \"ConfigService.ts\";\r\nexport const ResolverAppErrors = {\r\n /**\r\n * IndexedDb write failed in resolver.\r\n */\r\n IndexedDbWriteFailed: {\r\n id: 22010,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * IndexedDb read failed in resolver.\r\n */\r\n IndexedDbReadFailed: {\r\n id: 22011,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Config Service Resolver fetch errors.\r\n */\r\n CrsFetchError: {\r\n id: 22012,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Config Service Resolver was enabled but we still went to Assets to getConfig and merge configs at client (classic resolver).\r\n */\r\n ReceivedConfigFromCdnAsCrsFetchFailed: {\r\n id: 22013,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Exception In GetConfig function.\r\n */\r\n GetConfigException: {\r\n id: 22014,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb\r\n },\r\n /**\r\n * IndexedDb bulk read failed in resolver.\r\n */\r\n IndexedDbBulkReadFailed: {\r\n id: 22015,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * IndexedDb failed to remove cached config\r\n */\r\n IndexedDbFailedToRemoveCachedConfig: {\r\n id: 22016,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * IndexedDb failed to clear all configs\r\n */\r\n IndexedDbFailedToClearAllCachedConfigs: {\r\n id: 22017,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Render cache is purged due to changes in config\r\n */\r\n RenderCachePurgedDueToChangesInConfig: {\r\n id: 22018,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * Render cache failed purge even though config changes were detected.\r\n */\r\n FailedToPurgeRenderCache: {\r\n id: 22019,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Failed to refresh config cache\r\n */\r\n RefreshConfigCacheFailed: {\r\n id: 22020,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Failed to initialize indexedDb\r\n */\r\n IndexedDbInitFailed: {\r\n id: 22021,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * Different cache busting identifier\r\n */\r\n DifferentCbid: {\r\n id: 22022,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * Error writing prg flights to localStorage\r\n */\r\n PrgFlightLsWriteError: {\r\n id: 22023,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * Error reading prg flights to localStorage\r\n */\r\n PrgFlightLsReadError: {\r\n id: 22024,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n/**\r\n * Configs served from CDN after CRS fetch failed\r\n */\r\nexport const ResolverErrorConfigsDownloadedByCdn = {\r\n id: 22025,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n/**\r\n * Cached configs are for different flight\r\n */\r\nexport const CachedConfigsForDifferentFlight = {\r\n id: 22026,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n/**\r\n * CRS sent non-200 response\r\n */\r\nexport const ConfigCrsFetchNon200Response = {\r\n id: 22027,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true,\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n/**\r\n * Cdn config fetch received non-200 response\r\n */\r\nexport const ConfigCdnFetchNon200Response = {\r\n id: 22028,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n};\r\n/**\r\n * Invalid config ref received to resolve configs when Git configs is enabled\r\n */\r\nexport const GitConfigsInvalidConfigRef = {\r\n id: 22029,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n/**\r\n * Invalid configResolver object for Git configs flight\r\n */\r\nexport const GitConfigsInvalidConfigResolver = {\r\n id: 22030,\r\n source: resolverSourceFile,\r\n severity: Severity.Critical,\r\n pb: {\r\n userImpacting: true\r\n }\r\n};\r\n/**\r\n * Config Service Resolver timeout.\r\n */\r\nexport const CrsFetchTimeout = {\r\n id: 22031,\r\n source: resolverSourceFile,\r\n severity,\r\n pb: {\r\n errorBehavior: ErrorBehavior.Fallback\r\n }\r\n};\r\n/** Starts from 22050 */\r\nexport const FallbackResolverAppErrors = {\r\n /**\r\n * getConfigRecursive function try catch failed.\r\n */\r\n RecursiveGetFailed: {\r\n id: 22050,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * BlobFetcher fetch failed for configs or config index.\r\n */\r\n BlobFetchReturnedNull: {\r\n id: 22051,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n/**\r\n * Error that when Server Cache config refresh failed\r\n */\r\nexport const ServerCacheRefreshFailed = {\r\n id: 34009,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n/**\r\n * Error that when SSR failed to getConfig.\r\n */\r\nexport const ServerCacheFetchFailed = {\r\n id: 34005,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n};\r\n/**\r\n * SSR config resolver returned null config\r\n */\r\nexport const SsrResolverReturnedNullConfig = {\r\n id: 34011,\r\n source: \"SsrResolver.ts\",\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n//# sourceMappingURL=ResolverAppErrors.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { getCacheKeyFromConfigRef, getChildConfigRefs, sendAppError } from \"../../../utilities/Utilities\";\r\nimport { ClientSingleConfigResolver } from \"./ClientSingleConfigResolver\";\r\nimport { FallbackResolverAppErrors } from \"../../../utilities/ResolverAppErrors\";\r\n/**\r\n * Client resolver class\r\n * This is a fallback scenarion when CRS is not available.\r\n */\r\nexport class ClientResolver {\r\n /**\r\n * Initialize client resolver based on fetching parameters.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(resolverEnvironment) {\r\n /**\r\n * Dictionary to maintain all resolved config for internal state management\r\n * @type {Map}\r\n */\r\n this.mergedConfigMap = new Map();\r\n if (!resolverEnvironment\r\n || !resolverEnvironment.configServiceParameters\r\n || !resolverEnvironment.appType\r\n || !resolverEnvironment.configServiceParameters.configServiceBaseUrl\r\n || !resolverEnvironment.targetScope) {\r\n throw new Error(\"ClientResolver.ts: ResolverEnvironment or configServiceParameters or targetScope does not exist.\");\r\n }\r\n this.resolverEnvironment = resolverEnvironment;\r\n this.appType = resolverEnvironment.appType;\r\n this.clientSingleConfigResolver = new ClientSingleConfigResolver(resolverEnvironment);\r\n }\r\n /**\r\n * Gets all the config in the config tree in a recursive manner.\r\n * @param {ConfigReference} entity entity for the root config.\r\n * @param {boolean} getFullTree indicate whether we want to load entire tree at once.\r\n * @returns {Map} returns the merged config map.\r\n */\r\n getConfig(entity, getFullTree = false) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const cacheKey = getCacheKeyFromConfigRef(entity, this.appType);\r\n // If this is not in the map, get the tree recursively and add all child configs to map\r\n if (!this.mergedConfigMap.has(cacheKey)) {\r\n yield this.getConfigRecursive(entity, getFullTree);\r\n const allNullFetches = this.clientSingleConfigResolver.getFailedFetches();\r\n if (allNullFetches.length > 0) {\r\n allNullFetches.forEach((nullFetchUrl) => {\r\n sendAppError(this.resolverEnvironment.appErrorCallback, Object.assign(Object.assign({}, FallbackResolverAppErrors.BlobFetchReturnedNull), { message: \"Fetch failed for a config\", pb: Object.assign(Object.assign({}, FallbackResolverAppErrors.BlobFetchReturnedNull.pb), { customMessage: `Failed fetch url: ${nullFetchUrl}` }) }));\r\n });\r\n }\r\n }\r\n return this.mergedConfigMap.get(cacheKey);\r\n });\r\n }\r\n /**\r\n * Get configMap downloaded by fallback resolver.\r\n */\r\n getConfigMap() {\r\n return this.mergedConfigMap;\r\n }\r\n /**\r\n * Helper function for getConfig. Gets all the config in the config tree in a recursive manner.\r\n * @param {ConfigReference} entity entity for the root config.\r\n * @param {boolean} getFullTree indicate whether we want to load entire tree at once.\r\n */\r\n getConfigRecursive(entity, getFullTree = false) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const cacheKey = getCacheKeyFromConfigRef(entity, this.appType);\r\n if (!cacheKey || this.mergedConfigMap.has(cacheKey)) {\r\n return;\r\n }\r\n try {\r\n // root of specific sub tree\r\n const mergedConfig = yield this.clientSingleConfigResolver.resolveConfigAsync(entity);\r\n // add to memory even if it is undefined because we don't want to fetch fail states multiple times\r\n this.mergedConfigMap.set(cacheKey, mergedConfig);\r\n // Only fetch rest of the tree if requested.\r\n if (getFullTree) {\r\n const unresolvedConfigRefs = getChildConfigRefs(mergedConfig);\r\n if (unresolvedConfigRefs.size == 0) {\r\n return;\r\n }\r\n const configTasks = [];\r\n unresolvedConfigRefs.forEach(entity => {\r\n configTasks.push(this.getConfigRecursive(entity, getFullTree));\r\n });\r\n // if a single config fails, it fails all, exists today as well\r\n yield Promise.all(configTasks);\r\n }\r\n }\r\n catch (error) {\r\n sendAppError(this.resolverEnvironment.appErrorCallback, Object.assign(Object.assign({}, FallbackResolverAppErrors.RecursiveGetFailed), { message: \"Exception in getConfig.\", pb: Object.assign(Object.assign({}, FallbackResolverAppErrors.RecursiveGetFailed.pb), { customMessage: `CacheKey: ${cacheKey} / Error: ${error}` }) }));\r\n }\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=ClientResolver.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\n/**\r\n * Provides utility functions to get and set data from IndexedDB.\r\n * If dbName is not provied, this class creates a db with name MicrosoftNews.\r\n * If storeName is not provied, this class creates a table/store with name Default.\r\n * Recommended to create a new table for your feature to separate and iterate through entries quickly.\r\n * IndexedDB utility does not require stringify and json parsing so more efficient! Just store your object as value.\r\n */\r\nexport class IndexedDb {\r\n constructor() {\r\n /** IndexedDb object */\r\n this.idb = indexedDB;\r\n }\r\n /**\r\n * Returns if IndexedDb is supported.\r\n * @returns true if supported else false.\r\n */\r\n get supported() {\r\n if (!this.idb) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * Function looks at query string param and check if IndexedDb operation is allowed or not. By default it is allowed.\r\n * @returns true if supported else false.\r\n */\r\n get isGetAllAllowed() {\r\n if (IDBObjectStore.prototype && IDBObjectStore.prototype.getAll) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @param {IDBFactory} idb - IndexedDB object to override.\r\n */\r\n _setIndexedDb(idb) {\r\n this.idb = idb;\r\n }\r\n /**\r\n * This should be used for unit testing only.\r\n * @public\r\n * @return {Promise} existing promise.\r\n */\r\n _getIdbPromise() {\r\n return this.idbPromise;\r\n }\r\n /**\r\n * Returns object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @returns Promise\r\n */\r\n getObject(key) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let req;\r\n yield this.withIdbStore(\"readonly\", \"getObject\", storeCallback => {\r\n req = storeCallback.get(key);\r\n });\r\n return req.result;\r\n });\r\n }\r\n /**\r\n * Return all objects from IndexedDB using getAll implementation.\r\n * @public\r\n * @returns Promise\r\n */\r\n getAll() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let req;\r\n yield this.withIdbStore(\"readonly\", \"getAll\", storeCallback => {\r\n req = storeCallback.getAll();\r\n });\r\n return req.result;\r\n });\r\n }\r\n /**\r\n * Returns all objects from IndexedDB.\r\n * if getAll is supported, call it else fallback to Cursor implementation that exists on wide range of devices.\r\n * @public\r\n * @returns Promise\r\n */\r\n getAllObjects() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (this.isGetAllAllowed) {\r\n return this.getAll();\r\n }\r\n const returnArray = [];\r\n yield this.withIdbStore(\"readonly\", \"getAllObjects\", storeCallback => {\r\n storeCallback.openCursor().onsuccess = function (event) {\r\n const cursor = event.target && event.target.result ? event.target.result : undefined;\r\n if (cursor && cursor.value) {\r\n returnArray.push(cursor.value);\r\n cursor.continue();\r\n }\r\n };\r\n });\r\n return returnArray;\r\n });\r\n }\r\n /**\r\n * Sets object into IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n * @param {any} value - Any typed value you want to insert into IndexedDB.\r\n */\r\n setObject(key, value) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return yield this.withIdbStore(\"readwrite\", \"setObject\", storeCallback => {\r\n storeCallback.put(value, key);\r\n });\r\n });\r\n }\r\n /**\r\n * Removes object from IndexedDB\r\n * @public\r\n * @param {IDBValidKey} key - IndexedDB key. Typically it can be string or any supported type.\r\n */\r\n removeObject(key) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return yield this.withIdbStore(\"readwrite\", \"removeObject\", storeCallback => {\r\n storeCallback.delete(key);\r\n });\r\n });\r\n }\r\n /**\r\n * Removes all objects from IndexedDB\r\n * @public\r\n */\r\n clearObjects() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return yield this.withIdbStore(\"readwrite\", \"clearObjects\", storeCallback => {\r\n storeCallback.clear();\r\n });\r\n });\r\n }\r\n /**\r\n * Initialize IndexedDb.\r\n * @param idbStoreName {string} - IndexedDB store name\r\n * @param dbName {string} - Database name\r\n * @param preInitializedIdbPromise {Promise} - Optional pre-initialized promise that is fetching the {IDBDatabase} object.\r\n * Used to optimize/prime the IDB connection cost so it can be started as early as possible in the page without incurring additional cost\r\n * later when lot more things are happening on the page.\r\n */\r\n initializeIndexedDb(idbVersion = 1, idbStoreName = \"Default\", dbName = \"MicrosoftNews\", preInitializedIdbPromise = null) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.storeName = idbStoreName;\r\n this.idbPromise = preInitializedIdbPromise || new Promise((resolve, reject) => {\r\n const openreq = this.idb.open(dbName, idbVersion);\r\n openreq.onerror = () => {\r\n reject(openreq.error);\r\n };\r\n openreq.onsuccess = () => {\r\n resolve(openreq.result);\r\n };\r\n openreq.onupgradeneeded = () => {\r\n openreq.result.createObjectStore(idbStoreName);\r\n };\r\n });\r\n });\r\n }\r\n /**\r\n * Private function to set transaction.\r\n * @param type - IDB read/write mode\r\n * @param operationName - readable name to use in the app trace logging\r\n * @param callback - the callback to invoke with the IDB objectStore.\r\n * @returns {Promise} async operation that ends when the IDB transaction is complete.\r\n */\r\n withIdbStore(type, operationName, callback) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return this.idbPromise.then(db => new Promise((resolve, reject) => {\r\n const transaction = db.transaction(this.storeName, type);\r\n transaction.oncomplete = () => {\r\n resolve();\r\n };\r\n transaction.onabort = transaction.onerror = () => reject(transaction.error);\r\n callback(transaction.objectStore(this.storeName));\r\n }));\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=IndexedDb.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Helper to create an error for logging with message and customMessage properties without having\r\n * to go manually clone the error object, or property bag, etc.\r\n * @param baseError - The base error object to use as prototype for creating the error\r\n * @param message - The custom message to use for the error\r\n * @param customMessage - The custom message that may contain strings that do not aggregate well (i.e., unique / per request data)\r\n */\r\nexport function createError(baseError, message, customMessage) {\r\n return Object.assign(Object.assign({}, baseError), { message: message || baseError.message, pb: customMessage\r\n ? Object.assign(Object.assign({}, baseError.pb), { customMessage }) : baseError.pb });\r\n}\r\n//# sourceMappingURL=AppErrorHelper.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { ConfigCachingConstants, ResolverAppErrors, getCacheKeyFromConfigRef } from \"../../utilities\";\r\nimport { IndexedDb, createError } from \"@msnews/web-worker-shared-utils\";\r\nimport { memoize } from \"lodash-es\";\r\n/**\r\n * Config cache class\r\n * This interacts with browser's storage and get/set resolved and merged config(s).\r\n */\r\nexport class ConfigCache {\r\n /**\r\n * Config resolver constructor to initialize child classes.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(environment, enableIdbCaching = false) {\r\n this.environment = environment;\r\n /**\r\n * True if config caching is enabled else false.\r\n */\r\n this.enableConfigCaching = this.useConfigCaching();\r\n /**\r\n * Current Timestamp for config staleness check\r\n */\r\n this.stalenessCheckTimestamp = new Date().getTime();\r\n /**\r\n * In-memory map storing configs before read/write to cache.\r\n */\r\n this.indexedDbMap = new Map();\r\n /**\r\n * Read indexedDb for configs.\r\n */\r\n this.readConfigsFromIdb = memoize(this._readConfigsFromIdb);\r\n if (!environment\r\n || !environment.targetScope\r\n || !environment.appType) {\r\n throw new Error(\"ResolverEnvironment or targetScope or appType does not exist.\");\r\n }\r\n // Memoize the indexedDB function to protect from being called again\r\n this.initializeIdb = memoize(this.initializeIdb);\r\n this.resolverEnvironment = environment;\r\n this.indexedDb = new IndexedDb();\r\n // Do not need to init IDB if IDB caching is disabled\r\n if (enableIdbCaching) {\r\n this.initializeIdb();\r\n }\r\n }\r\n /**\r\n * Function checks if ConfigCaching is enabled.\r\n * @returns true if supported else false.\r\n */\r\n useConfigCaching() {\r\n // Dev scenario to enable/disable config service\r\n const queryParams = this.resolverEnvironment\r\n && this.resolverEnvironment.configServiceParameters\r\n && this.resolverEnvironment.queryParams;\r\n if (queryParams && queryParams[\"enableConfigCaching\"]) {\r\n return queryParams[\"enableConfigCaching\"] === \"true\";\r\n }\r\n // Enable config caching by default\r\n return true;\r\n }\r\n /**\r\n * Fast helper to try to get it directly from cache so callers do not have to go through\r\n * additional async layers to get to the result if we've already loaded up the memory map.\r\n * @param configRef - The config ref to get from memory cache.\r\n */\r\n tryGetConfigSync(configRef) {\r\n if (configRef) {\r\n const cacheKey = getCacheKeyFromConfigRef(configRef, this.resolverEnvironment.appType);\r\n return this.indexedDbMap.get(cacheKey);\r\n }\r\n }\r\n /**\r\n * This function returns resolve and merge config from browser cache.\r\n * @param {ConfigReference} configRef: The identity structure that uniquely identifies a single instance of an experience\r\n * @returns {Promise} experienceConfig from cache\r\n */\r\n getConfig(configRef) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!configRef) {\r\n return;\r\n }\r\n const cacheKey = getCacheKeyFromConfigRef(configRef, this.resolverEnvironment.appType);\r\n // If this config exist in memory, return else read from cache.\r\n if (!this.indexedDbMap.has(cacheKey)) {\r\n yield this.readConfigsFromIdb();\r\n }\r\n return this.indexedDbMap.get(cacheKey);\r\n });\r\n }\r\n /**\r\n * Update IndexedDB configs from network configs.\r\n * @param configMap\r\n */\r\n updateCache(configMap) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!configMap) {\r\n return;\r\n }\r\n configMap.forEach((experienceConfig, cacheKey) => {\r\n if (experienceConfig) {\r\n const config = {\r\n storageTimestamp: this.stalenessCheckTimestamp,\r\n configRefCacheKey: cacheKey,\r\n properties: experienceConfig.properties\r\n };\r\n this.indexedDbMap.set(cacheKey, config);\r\n }\r\n });\r\n yield this.writeConfigMapToIdb();\r\n });\r\n }\r\n /**\r\n * Init indexedDb.\r\n */\r\n initializeIdb() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!this.enableConfigCaching) {\r\n return;\r\n }\r\n try {\r\n const idbConfigOpenPromise = this.resolverEnvironment.configCacheProperties && this.resolverEnvironment.configCacheProperties.idbConfigOpenPromise;\r\n yield this.indexedDb.initializeIndexedDb(1, ConfigCachingConstants.idbStoreName, ConfigCachingConstants.idbName, idbConfigOpenPromise);\r\n this.indexedDbInitialized = true;\r\n this.logMessage(\"IndexedDB initialized.\");\r\n }\r\n catch (e) {\r\n this.enableConfigCaching = false;\r\n this.sendAppError(createError(ResolverAppErrors.IndexedDbInitFailed, \"Failed to init configs IndexedDB\", e));\r\n }\r\n });\r\n }\r\n /**\r\n * Get cached Configs from IndexedDb and populate configMap based on target scope key.\r\n */\r\n _readConfigsFromIdb() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!this.enableConfigCaching) {\r\n return;\r\n }\r\n // Check if IndexedDB was initialized\r\n if (!this.indexedDbInitialized) {\r\n yield this.initializeIdb();\r\n }\r\n try {\r\n // This is indexedDB cache key and all configs are stored as a value with this key.\r\n const indexedDbKey = this.generateIdbKey();\r\n let cachedConfigs;\r\n let cacheSource;\r\n const { idbConfigLookup = null, idbConfigReadPromise = null } = this.resolverEnvironment.configCacheProperties || {};\r\n // Check if we have a top page-level initialized IDB read config lookup populated\r\n // with the specific entry we need, and if so use it. Otherwise proceed to load from indexDB\r\n cachedConfigs = (idbConfigLookup || {})[indexedDbKey];\r\n if (cachedConfigs) {\r\n cacheSource = \"pre-initialized config cache\";\r\n }\r\n else if (idbConfigReadPromise) {\r\n // see if we have the pre-initialized config read promise from IDB, and if so\r\n // await on that instead of starting our own duplicate IDB init/read.\r\n cacheSource = \"pre-initialized IndexedDb read\";\r\n yield idbConfigReadPromise;\r\n cachedConfigs = (idbConfigLookup || {})[indexedDbKey];\r\n }\r\n else {\r\n // start our own IDB read.\r\n cacheSource = \"IndexedDb bulk read\";\r\n cachedConfigs = yield this.indexedDb.getObject(indexedDbKey);\r\n }\r\n if (!cachedConfigs) {\r\n this.logMessage(`readConfigsFromIdb: Didn't find any config in IndexedDB. CacheSource: ${cacheSource}`);\r\n }\r\n else {\r\n // targetScopeKey is inserted into IndexedDb along with configIndexHref.\r\n // Although there can be more than type of keys being formed since DHP and NTP will have different ones due to pageType in targetScope.\r\n cachedConfigs.forEach(cachedConfig => {\r\n if (cachedConfig.configRefCacheKey\r\n && !this.isConfigStale(cachedConfig.storageTimestamp)) {\r\n this.indexedDbMap.set(cachedConfig.configRefCacheKey, cachedConfig);\r\n }\r\n });\r\n this.logMessage(`readConfigsFromIdb: Configs in IndexedDB: ${cachedConfigs.size}. Configs in memory: ${this.indexedDbMap.size}. CacheSource: ${cacheSource}.`);\r\n }\r\n }\r\n catch (e) {\r\n this.sendAppError(createError(ResolverAppErrors.IndexedDbReadFailed, \"IndexedDb Configs read failed\", e));\r\n }\r\n });\r\n }\r\n /**\r\n * Write in-memory configs to indexedDb.\r\n */\r\n writeConfigMapToIdb() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!this.enableConfigCaching || !this.indexedDbMap) {\r\n return;\r\n }\r\n // Check if IndexedDB was initialized\r\n if (!this.indexedDbInitialized) {\r\n yield this.initializeIdb();\r\n }\r\n try {\r\n // This is indexedDB cache key and all configs are stored as a value with this key.\r\n const indexedDbKey = this.generateIdbKey();\r\n yield this.indexedDb.setObject(indexedDbKey, this.indexedDbMap);\r\n this.logMessage(\"writeConfigMapToIdb: completed\");\r\n }\r\n catch (e) {\r\n this.sendAppError(createError(ResolverAppErrors.IndexedDbWriteFailed, \"Failed to write configMap to indexedDb\", e));\r\n }\r\n });\r\n }\r\n /**\r\n * This function generates a key that is used to write/read configurations to/from storage.\r\n * example key: \"kids|ja|jp|testPage|mmx\"\r\n * @private\r\n * @return string\r\n */\r\n generateIdbKey() {\r\n const { audienceMode = \"\", locale = {}, pageType = \"\" } = this.resolverEnvironment.targetScope || {};\r\n const { language, market } = locale;\r\n const keys = [audienceMode, language, market, pageType, this.resolverEnvironment.appType || \"\"];\r\n return keys.map(key => key || \"\").join(\"|\").toLowerCase();\r\n }\r\n /**\r\n * Function to check config is stale.\r\n * @returns true if stale else false.\r\n */\r\n isConfigStale(storageTimestamp) {\r\n return !storageTimestamp || (this.stalenessCheckTimestamp - storageTimestamp) > ConfigCachingConstants.configStalenessDuration;\r\n }\r\n /**\r\n * Send this app error\r\n * @param appError AppError to send to telemetry\r\n */\r\n sendAppError(appError) {\r\n if (this.resolverEnvironment.appErrorCallback) {\r\n this.resolverEnvironment.appErrorCallback(appError);\r\n }\r\n }\r\n /**\r\n * Log message if debug is chosen\r\n * @param message to log\r\n */\r\n logMessage(message) {\r\n if (this.resolverEnvironment.loggerCallback) {\r\n this.resolverEnvironment.loggerCallback(message);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ConfigCache.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { ConfigCrsFetchNon200Response, CrsFetchTimeout, ResolverAppErrors, buildNumberRegex, getBuildNumberAsync, getCacheKeyFromConfigRef, getConfigRefFromKey } from \"../utilities\";\r\nimport { createError } from \"@msnews/web-worker-shared-utils\";\r\nimport { isEmpty } from \"lodash-es\";\r\n/**\r\n * Config service class\r\n * This interacts with CRS and gets resolved and merged config\r\n */\r\nexport class ConfigService {\r\n /**\r\n * Create config service based on ResolverEnvironment\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(resolverEnvironment) {\r\n this.resolverEnvironment = resolverEnvironment;\r\n /**\r\n * Dictionary to maintain all resolved config for internal state management\r\n * @type {Map}\r\n */\r\n this.configMap = new Map();\r\n /**\r\n * True if config service is enabled else false.\r\n */\r\n this.enableConfigService = true;\r\n /**\r\n * Dictionary to maintain all promise objects which are not resolved/rejected. Once promise object is resolved/rejected,\r\n * it gets deleted from this dictionary and put in the configMap.\r\n * @type {Map>}\r\n */\r\n this.configPromiseMap = new Map();\r\n /**\r\n * If config service returns specific error code, then try fallback resolver.\r\n */\r\n this._shouldTryFallbackResolver = false;\r\n /**\r\n * If CRS fetch had network error\r\n */\r\n this._hadNetworkError = false;\r\n /**\r\n * Helper to avoid get cache key for the given configRef and the current resolver environment\r\n * @param configRef The config reference for which to get the cache key\r\n * @returns {string} The cache key that uniquely represents the given config reference object.\r\n */\r\n this.getCacheKeyFromConfigRef = (configRef) => getCacheKeyFromConfigRef(configRef, this.resolverEnvironment.appType);\r\n if (!resolverEnvironment\r\n || !resolverEnvironment.configServiceParameters\r\n || !resolverEnvironment.appType\r\n || !resolverEnvironment.configServiceParameters.configServiceBaseUrl\r\n || !resolverEnvironment.targetScope) {\r\n this.enableConfigService = false;\r\n throw new Error(\"ResolverEnvironment or configServiceParameters or targetScope does not exist.\");\r\n }\r\n }\r\n /**\r\n * If CRS fetch had network error\r\n */\r\n get hadNetworkError() {\r\n return this._hadNetworkError;\r\n }\r\n /**\r\n * If config service returns specific error code, then try fallback resolver.\r\n */\r\n get shouldTryFallbackResolver() {\r\n return this._shouldTryFallbackResolver;\r\n }\r\n /**\r\n * Returns true if config service is enabled\r\n */\r\n get configServiceEnabled() {\r\n return this.enableConfigService;\r\n }\r\n /**\r\n * Returns config service query params\r\n */\r\n get configServiceQueryParams() {\r\n return this.configServiceParams;\r\n }\r\n /**\r\n * Initialize config service\r\n */\r\n initialize() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.shouldUseConfigService();\r\n yield this.setConfigServiceParams();\r\n });\r\n }\r\n /**\r\n * Set query param from CRS request configurations\r\n */\r\n setConfigServiceParams() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const { appType, configServiceParameters, targetScope } = this.resolverEnvironment;\r\n const { maxDepth } = configServiceParameters;\r\n let { buildVersion } = configServiceParameters;\r\n // Send PCS apptype to CRS so we can build CRS Jarvis dashboards per apptype.\r\n let configServiceParams = `apptype=${appType}`;\r\n // Use regex to text whether \"spalink\" QSP is an actual build number (with the format YYYYMMDD.) or an alias (for local scenario only).\r\n // If it is an alias, convert that to a corresponding build number (using the /v endpoint), because CRS can't handle aliases.\r\n if (__WEBPACK_LOCAL_GITCONFIGS__ && !buildNumberRegex.test(buildVersion)) {\r\n buildVersion = yield getBuildNumberAsync(buildVersion, appType);\r\n }\r\n // Add client build version\r\n configServiceParams += `&v=${buildVersion}`;\r\n // Query string parameter from target scope.\r\n configServiceParams += \"&targetScope=\" + JSON.stringify(targetScope);\r\n // Add maxDepth if exist. Mostly for dev scenario\r\n if (maxDepth) {\r\n configServiceParams += `&maxDepth=${maxDepth}`;\r\n }\r\n // If url has dev only query string params, inform CRS so it can exclude from availability and will help debugging on Jarvis.\r\n if (this.containsDevOnlyQueryParameters()) {\r\n configServiceParams += \"&citem=dev:true\";\r\n }\r\n this.configServiceParams = configServiceParams;\r\n });\r\n }\r\n /**\r\n * Function checks if ConfigService is enabled.\r\n * @returns true if supported else false.\r\n */\r\n shouldUseConfigService() {\r\n // Dev scenario to enable/disable config service\r\n const queryParams = this.resolverEnvironment\r\n && this.resolverEnvironment.configServiceParameters\r\n && this.resolverEnvironment.queryParams;\r\n if (queryParams && queryParams[\"enableConfigService\"]) {\r\n this.enableConfigService = queryParams[\"enableConfigService\"] === \"true\";\r\n }\r\n }\r\n /**\r\n * Function checks if url has any dev only query string param\r\n * @returns true if exist else false.\r\n */\r\n containsDevOnlyQueryParameters() {\r\n const queryParams = this.resolverEnvironment.queryParams;\r\n if (!queryParams) {\r\n return false;\r\n }\r\n const item = queryParams[\"item\"];\r\n if (item && item.length > 0) {\r\n return true;\r\n }\r\n const citem = queryParams[\"citem\"];\r\n if (citem) {\r\n return true;\r\n }\r\n const segment = queryParams[\"pcsonly\"];\r\n if (segment) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * Returns in-memory configs\r\n * @returns Map\r\n */\r\n getConfigMap() {\r\n return this.configMap;\r\n }\r\n /**\r\n * Fast helper to try to get it directly from cache so callers do not have to go through\r\n * additional async layers to get to the result if we've already loaded up the memory map.\r\n * @param configRef - The config ref to get from memory cache.\r\n */\r\n tryGetConfigSync(configRef) {\r\n if (configRef) {\r\n const cacheKey = this.getCacheKeyFromConfigRef(configRef);\r\n return this.configMap.get(cacheKey);\r\n }\r\n }\r\n /**\r\n * Returns the resolved merged Experience config from CRS.\r\n * @param {ConfigReference} configRef object\r\n * @return Promise\r\n */\r\n getConfig(configRef) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n // If request configurations aren't available, throw error.\r\n if (!this.resolverEnvironment.configServiceParameters || !this.resolverEnvironment.targetScope || !configRef) {\r\n return Promise.reject(Error(\"Either of configServiceParameters, targetScope or configRef is not set correctly.\"));\r\n }\r\n // Return if config service is not enabled.\r\n if (!this.enableConfigService) {\r\n this._shouldTryFallbackResolver = true;\r\n return;\r\n }\r\n // Get cache key from experience type and other meta data.\r\n const cacheKey = this.getCacheKeyFromConfigRef(configRef);\r\n // Return config is already present in the memory cache.\r\n if (this.configMap.has(cacheKey)) {\r\n return this.configMap.get(cacheKey);\r\n }\r\n // if configPromiseMap has the item, we already have an active promise which is not yet resolved/rejected. Return this promise\r\n if (this.configPromiseMap.has(cacheKey)) {\r\n return this.configPromiseMap.get(cacheKey);\r\n }\r\n // Process config from network\r\n const configPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n yield this.getConfigTreeFromCrs(configRef);\r\n resolve(this.configMap.get(cacheKey));\r\n }\r\n catch (error) {\r\n this.sendAppError(createError(ResolverAppErrors.GetConfigException, `Exception in getConfig for ${cacheKey}`, error));\r\n // If we don't explicitly catch the error, then the promise never gets rejected which might cause issues during experience load time.\r\n reject(error);\r\n }\r\n finally {\r\n this.configPromiseMap.delete(cacheKey);\r\n }\r\n }));\r\n // if caller is using await then this request has been processed and we should not add it to configPromiseMap.\r\n // if caller is trying to download multiple configs in parallel, then processed should be false.\r\n this.configPromiseMap.set(cacheKey, configPromise);\r\n return configPromise;\r\n });\r\n }\r\n /**\r\n * Fetch configs from CRS and add them to in-memory cache.\r\n * @param {ConfigReference} configRef object\r\n */\r\n getConfigTreeFromCrs(configRef) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n // Set a 5-second timeout for CRS call\r\n let timer;\r\n const timeoutInMs = 5000;\r\n const timeoutPromise = new Promise((resolve) => {\r\n timer = setTimeout(() => {\r\n // Log an app error if CRS call timed out\r\n const appError = Object.assign(Object.assign({}, CrsFetchTimeout), { pb: Object.assign(Object.assign({}, CrsFetchTimeout.pb), { isWebWorker: this.resolverEnvironment.isThisWebWorkerThread }) });\r\n this.sendAppError(createError(appError, \"CRS fetch timeout\", `ConfigRef: ${this.getCacheKeyFromConfigRef(configRef)}.`));\r\n // Return null response so that fallback resolver is automatically invoked\r\n return resolve(null);\r\n }, timeoutInMs);\r\n });\r\n const crsFetchPromise = this.downloadFromCrs(configRef).then((crsResponse) => {\r\n if (timer) {\r\n clearTimeout(timer);\r\n }\r\n return crsResponse;\r\n });\r\n // Race between CRS and a timeout based promise\r\n const response = yield Promise.race([crsFetchPromise, timeoutPromise]);\r\n const configs = response && response.configs;\r\n if (!configs || isEmpty(configs)) {\r\n // If CRS failed to return a valid response, try using the fallback resolver.\r\n this._shouldTryFallbackResolver = true;\r\n return;\r\n }\r\n // Set shouldRetry to false when CRS response is valid\r\n this._shouldTryFallbackResolver = false;\r\n for (const configKey in configs) {\r\n const config = configs[configKey];\r\n if (config && config.properties) {\r\n const cacheKey = this.getCacheKeyFromConfigRef(getConfigRefFromKey(configKey));\r\n this.configMap.set(cacheKey, config);\r\n }\r\n }\r\n }\r\n catch (error) {\r\n this.sendAppError(createError(ResolverAppErrors.CrsFetchError, \"CRS fetch network error\", `ConfigRef: ${this.getCacheKeyFromConfigRef(configRef)}. CrsFetchNetworkError: ${this._hadNetworkError}. Error: ${error}`));\r\n }\r\n });\r\n }\r\n /**\r\n * Download config(s) from CRS\r\n * @param {ConfigReference} configRef object\r\n * @return Promise returns config service response\r\n */\r\n downloadFromCrs(configRef) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const fetchUrl = this.generateCrsUrl(configRef);\r\n return fetch(fetchUrl)\r\n .then(response => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n // Get appropriate CRS headers and instrument in the app error customMessage\r\n const crsVersion = response.headers.get(\"X-Crs-BuildVersion\") || \"\";\r\n const msedgeRef = response.headers.get(\"x-msedge-ref\") || \"\";\r\n const errorMessage = `Url: ${fetchUrl} and CRS Version: ${crsVersion} and isWebWorkerPresent ${this.resolverEnvironment.isWebWorkerPresent}`;\r\n const appError = Object.assign(Object.assign({}, ConfigCrsFetchNon200Response), { pb: Object.assign(Object.assign({}, ConfigCrsFetchNon200Response.pb), { isWebWorker: this.resolverEnvironment.isThisWebWorkerThread, fetchNetworkResponse: {\r\n activityId: msedgeRef,\r\n statusCode: response.status\r\n } }) });\r\n this.sendAppError(createError(appError, \"CRS returned non-200 response\", errorMessage));\r\n return Promise.resolve();\r\n })\r\n .catch(error => {\r\n // If fetch fails to make request or cancelled by the browser, do not make call to fallback resolver.\r\n this._shouldTryFallbackResolver = false;\r\n // If CRS fetch had network error\r\n this._hadNetworkError = true;\r\n // This throw is required so that parent function can send appropriate app error.\r\n throw error;\r\n });\r\n });\r\n }\r\n /**\r\n * Generate CRS fetch url based on configRef, configServiceParams and configServiceBaseUrl.\r\n * @param {ConfigReference} configRef object\r\n * @returns {URL} CRS fetch url\r\n */\r\n generateCrsUrl(configRef) {\r\n const sharedNsQsp = configRef.sharedNs ? `&sharedNs=${configRef.sharedNs}` : \"\";\r\n const configRefQsp = `expType=${configRef.experienceType}&expInstance=${configRef.instanceSrc}${sharedNsQsp}`;\r\n const configServiceRelativeUrl = `?${configRefQsp}&${this.configServiceParams}`;\r\n const fetchUrl = new URL(configServiceRelativeUrl, this.resolverEnvironment.configServiceParameters.configServiceBaseUrl);\r\n return fetchUrl.toString();\r\n }\r\n /**\r\n * Send this app error\r\n * @param appError AppError to send to telemetry\r\n */\r\n sendAppError(appError) {\r\n if (this.resolverEnvironment.appErrorCallback) {\r\n this.resolverEnvironment.appErrorCallback(appError);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ConfigService.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { ConfigOrigin } from \"@msnews/core-contracts\";\r\nimport { enableIdbCaching, getCacheKeyFromConfigRef, isConfigBundleLocHashSameAsLastPage } from \"../../utilities\";\r\nimport { getRootConfigRef, perfMarkerCrsConfigName, perfMarkerEndSuffix, perfMarkerStartSuffix } from \"@msnews/web-worker-shared-utils\";\r\nimport { ClientResolver } from \"./client-fallback-resolver/ClientResolver\";\r\nimport { ConfigCache } from \"./ConfigCache\";\r\nimport { ConfigService } from \"../ConfigService\";\r\n/**\r\n * Git config resolver class\r\n */\r\nexport class ConfigResolver {\r\n /**\r\n * Config resolver constructor to initialize child classes.\r\n * @param {ResolverEnvironment} resolverEnvironment\r\n */\r\n constructor(resolverEnvironment) {\r\n this.resolverEnvironment = resolverEnvironment;\r\n /**\r\n * Set to true when fallback client side resolver is called\r\n */\r\n this.fallbackResolverCalled = false;\r\n /**\r\n * Flag to indicate if the initial CRS bulk fetch call has finished fetching.\r\n * This flag is used to avoid extra awaiting on completed Promises for new getConfig calls.\r\n */\r\n this.crsInitComplete = false;\r\n /**\r\n * If this is treatment, use IndexedDB cache else do not.\r\n */\r\n this.enableIdbCaching = false;\r\n if (!resolverEnvironment || !resolverEnvironment.targetScope) {\r\n throw new Error(\"ResolverEnvironment or targetScope does not exist.\");\r\n }\r\n // Initialize configService object\r\n this.configService = new ConfigService(resolverEnvironment);\r\n // True if bundle, config and loc hash of current page is same as last page\r\n this.configsEqual = isConfigBundleLocHashSameAsLastPage(resolverEnvironment.configCacheProperties);\r\n // True if this belong to idb caching of Git configs\r\n this.enableIdbCaching = enableIdbCaching(resolverEnvironment.targetScope.pageExperiments);\r\n // Initialize configCache object\r\n this.configCache = new ConfigCache(resolverEnvironment, this.enableIdbCaching);\r\n // Initialize fallback resolver\r\n this.clientResolver = new ClientResolver(resolverEnvironment);\r\n }\r\n /**\r\n * True if CRS fetch had network errors, else false\r\n */\r\n get crsHadNetworkError() {\r\n return this.configService.hadNetworkError;\r\n }\r\n /**\r\n * Fast helper to try to get it directly from cache so callers do not have to go through\r\n * additional async layers to get to the result if we've already loaded up the memory map.\r\n * @param configRef - The config ref to get from memory cache.\r\n */\r\n tryGetConfigSync(configRef) {\r\n if (configRef) {\r\n // try to do a fast synchronous get from the in-memory caches from each of the layers we have\r\n return this.configService.tryGetConfigSync(configRef)\r\n || this.configCache.tryGetConfigSync(configRef);\r\n }\r\n }\r\n /**\r\n * Returns the resolved merged Experience config from CRS.\r\n * @param {ConfigReference} configRef: The identity structure that uniquely identifies a single instance of an experience\r\n * @returns {Promise} ExperienceConfig\r\n */\r\n getConfig(configRef) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (this.resolverEnvironment.configOrigins.feature === ConfigOrigin.Local\r\n || this.resolverEnvironment.mockManager.mocksEnabled) {\r\n const isLoggerCallbackAvailable = typeof this.resolverEnvironment.loggerCallback === \"function\";\r\n try {\r\n const localConfigs = yield this.clientResolver.getConfig(configRef);\r\n if (localConfigs) {\r\n return Promise.resolve(localConfigs);\r\n }\r\n else {\r\n isLoggerCallbackAvailable && this.resolverEnvironment.loggerCallback(`ConfigResolver: Failed to fetch configs from local configs. Config: ${getCacheKeyFromConfigRef(configRef)}`);\r\n return Promise.resolve(null);\r\n }\r\n }\r\n catch (error) {\r\n isLoggerCallbackAvailable && this.resolverEnvironment.loggerCallback(`${error.message}`);\r\n return Promise.reject(error);\r\n }\r\n }\r\n if (!this.crsInitComplete) {\r\n this.sendPerfMarker(`${perfMarkerCrsConfigName}${perfMarkerStartSuffix}`);\r\n yield this.initiateConfigService();\r\n this.crsInitComplete = true;\r\n this.sendPerfMarker(`${perfMarkerCrsConfigName}${perfMarkerEndSuffix}`);\r\n }\r\n // try to do a fast synchronous get from the in-memory caches from each of the layers we have\r\n const fromMemoryConfig = this.tryGetConfigSync(configRef);\r\n if (fromMemoryConfig) {\r\n return fromMemoryConfig;\r\n }\r\n const networkReadPromise = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\r\n if (!this.configService.shouldTryFallbackResolver) {\r\n const crsConfig = yield this.configService.getConfig(configRef);\r\n if (crsConfig) {\r\n return resolve(crsConfig);\r\n }\r\n }\r\n else {\r\n // Try fallback client resolver when CRS returns a non-200 response.\r\n this.fallbackResolverCalled = true;\r\n const cdnConfig = yield this.clientResolver.getConfig(configRef);\r\n if (cdnConfig) {\r\n return resolve(cdnConfig);\r\n }\r\n }\r\n return resolve(null);\r\n }));\r\n const cacheReadPromise = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\r\n // Fetch configs from cache only if configs are equal\r\n if (this.configsEqual && this.enableIdbCaching) {\r\n const cachedConfig = yield this.configCache.getConfig(configRef);\r\n if (cachedConfig) {\r\n return resolve(cachedConfig);\r\n }\r\n }\r\n // If config hashes are not same, do not resolve cacheReadPromise promise!\r\n // Just so that the networkReadPromise wins when we race between networkReadPromise and cacheReadPromise\r\n }));\r\n // start the race between network and IDB cache read\r\n return Promise.race([cacheReadPromise, networkReadPromise]);\r\n });\r\n }\r\n /**\r\n * This overwrite (update) / write configs into cache\r\n * This is typically called after TTVR in web worker context\r\n * @returns true if configs are equal\r\n */\r\n updateConfigsCache() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n // We store CMS configs in IndexedDB at client since caching header for CRS call is 15 minutes for DRI scenarios.\r\n // Git configs have 7 days of caching header, so we want to skip IndexedDB read/write/udpate layer of config caching.\r\n // At this point, client is set to make a network call and will find network response in the disk cache.\r\n // If there is a config update, it has new build version number that gets passed to the client and\r\n // client uses this build version to query CRS and thus that breaks disk cache automatically.\r\n if (!this.enableIdbCaching) {\r\n return this.configsEqual;\r\n }\r\n // If configs from this page and last page are same, we want to skip writing to cache\r\n // When configs are equal, we return true. This should not update cache as cache update is not required.\r\n // If configs are not equal, we return false. This should update cache with new configs\r\n if (this.configsEqual) {\r\n return this.configsEqual;\r\n }\r\n // Make sure that CRS getConfig is called.\r\n // So that configMap will be populated in order to write to Cache.\r\n yield this.initiateConfigService();\r\n // Get configMap downloaded from CRS.\r\n const crsConfigMap = this.configService.getConfigMap();\r\n if (crsConfigMap) {\r\n // Write this CRS downloaded map to Cache.\r\n this.configCache.updateCache(crsConfigMap);\r\n return this.configsEqual;\r\n }\r\n // Try fallback client resolver when CRS returns a non-200 response.\r\n if (!this.configService.shouldTryFallbackResolver) {\r\n return this.configsEqual;\r\n }\r\n // Make sure that fallback resolver getConfig is called.\r\n // So that configMap will be populated in order to write to Cache.\r\n if (!this.fallbackResolverCalled) {\r\n yield this.clientResolver.getConfig(getRootConfigRef());\r\n }\r\n // Get configMap downloaded from fallback resolver.\r\n const clientResolverConfigMap = this.clientResolver.getConfigMap();\r\n if (clientResolverConfigMap) {\r\n // Write this network downloaded map to Cache.\r\n this.configCache.updateCache(clientResolverConfigMap);\r\n }\r\n return this.configsEqual;\r\n });\r\n }\r\n /**\r\n * To be used by the unit tests\r\n */\r\n getConfigServiceObject() {\r\n return this.configService;\r\n }\r\n /**\r\n * Initialize config service call\r\n */\r\n initiateConfigService() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n yield this.configService.initialize();\r\n yield this.configService.getConfig(getRootConfigRef());\r\n });\r\n }\r\n /**\r\n * Send this perf marker.\r\n * @param name perf marker name.\r\n */\r\n sendPerfMarker(name) {\r\n if (this.resolverEnvironment.perfMarkerCallback) {\r\n this.resolverEnvironment.perfMarkerCallback(name);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ConfigResolver.js.map","// © Microsoft Corporation. All rights reserved.\r\nexport function getRootConfigRef() {\r\n return { experienceType: \"AppConfig\", instanceSrc: \"default\" };\r\n}\r\n//# sourceMappingURL=getRootConfigRef.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { ConfigResolver, getCacheKeyFromConfigRef } from \"@msnews/config-resolver\";\r\nimport { GetConfigTreeEmpty, GetConfigTreeError, GetConfigTreeNull, HrefNotValid } from \"../AppErrors\";\r\nimport { addWWPerfMarker, environment, logger } from \"../wwCommon\";\r\nimport { mockManager } from \"@msnews/mock-config\";\r\n/**\r\n * Git config resolver class\r\n */\r\nlet configResolver;\r\n/**\r\n * Dictionary of config index hrefs those are already visited.\r\n */\r\nlet visitedHrefs;\r\n/**\r\n * Dictionary to store configs needed per experience type\r\n */\r\nexport const experienceGitConfigMap = new Map();\r\n/**\r\n * Initialize Git config resolver environment.\r\n * @param {PageRequestTargetScope} currentTargetScope - Target scope with peregrine specific flights in pageExperiments\r\n * @param {ConfigResolver} resolver - ConfigResolver object to be used by unit tests.\r\n */\r\nexport function initializeGitResolverEnvironment(currentTargetScope, resolver) {\r\n visitedHrefs = {};\r\n if (resolver) {\r\n configResolver = resolver;\r\n return;\r\n }\r\n const configCacheProperties = {\r\n bundleHash: environment.getQueryParameter(\"bundleHash\"),\r\n configHash: environment.getQueryParameter(\"configHash\"),\r\n locHash: environment.getQueryParameter(\"locHash\"),\r\n lastBundleHash: environment.getQueryParameter(\"lastBundleHash\"),\r\n lastConfigHash: environment.getQueryParameter(\"lastConfigHash\"),\r\n lastLocHash: environment.getQueryParameter(\"lastLocHash\")\r\n };\r\n // Set up config service param contract\r\n const configServiceParameters = {\r\n buildVersion: environment.buildVersion,\r\n configServiceBaseUrl: environment.configServiceBaseUrl.toString()\r\n };\r\n // Set up Git config resolver contract\r\n const resolverEnvironment = {\r\n appType: environment.pcsApptype,\r\n configServiceParameters,\r\n targetScope: currentTargetScope,\r\n env: environment.env,\r\n featureFlags: environment.featureFlags,\r\n isThisWebWorkerThread: true,\r\n isWebWorkerPresent: true,\r\n queryParams: environment.getSearchParams(),\r\n appErrorCallback: logger.error.bind(logger),\r\n perfMarkerCallback: addWWPerfMarker,\r\n loggerCallback: logger.info.bind(logger),\r\n configCacheProperties,\r\n configOrigins: environment.configOrigins,\r\n mockManager: mockManager\r\n };\r\n // Initialize Git configs resolver with resolver environment\r\n configResolver = new ConfigResolver(resolverEnvironment);\r\n}\r\n/**\r\n * This is a recursive function to parse and download config tree.\r\n * @param configIndexHref: Relative Url of config Index href\r\n */\r\nexport function getGitConfigTree(configRef) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!configRef) {\r\n logger.error(Object.assign(Object.assign({}, HrefNotValid), { message: \"Null ConfigRef in web worker resolver\" }));\r\n return;\r\n }\r\n const mergedConfigsMap = new Map();\r\n try {\r\n const cacheKey = getCacheKeyFromConfigRef(configRef, environment.pcsApptype);\r\n if (visitedHrefs[cacheKey]) {\r\n return;\r\n }\r\n visitedHrefs[cacheKey] = true;\r\n // Load config from config-resolver package\r\n const mergedConfig = yield configResolver.getConfig(configRef);\r\n if (mergedConfig) {\r\n // Add this to internal map\r\n mergedConfigsMap.set(cacheKey, mergedConfig);\r\n // This map is used for as subscribable map by other files\r\n const experienceTypeKey = configRef.experienceType.toLowerCase();\r\n // form the dictionary using the experience type as key and list of configs as value,\r\n // for fast lookup when trying to find configs that match type + other criteria for\r\n // various WW prefetch operations.\r\n let configsOfThisType = experienceGitConfigMap.get(experienceTypeKey);\r\n if (!configsOfThisType) {\r\n experienceGitConfigMap.set(experienceTypeKey, configsOfThisType = []);\r\n }\r\n configsOfThisType.push(mergedConfig);\r\n }\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, GetConfigTreeError), { message: \"getConfigTree threw error while getting Git config tree\", pb: Object.assign(Object.assign({}, GetConfigTreeError.pb), { customMessage: `${JSON.stringify(configRef)}. Error: ${e}` }) }));\r\n return;\r\n }\r\n if (mergedConfigsMap.size === 0) {\r\n logger.error(Object.assign(Object.assign({}, GetConfigTreeEmpty), { message: \"Didn't return config\", pb: Object.assign(Object.assign({}, GetConfigTreeEmpty.pb), { customMessage: JSON.stringify(configRef) }) }));\r\n return;\r\n }\r\n const promises = [];\r\n mergedConfigsMap.forEach(resolvedConfig => {\r\n if (!resolvedConfig || !resolvedConfig.properties) {\r\n logger.error(Object.assign(Object.assign({}, GetConfigTreeNull), { message: \"Returned null config\", pb: Object.assign(Object.assign({}, GetConfigTreeNull.pb), { customMessage: JSON.stringify(configRef) }) }));\r\n }\r\n else {\r\n const configRefs = getChildConfigRefs(resolvedConfig);\r\n for (const childConfigRef of configRefs) {\r\n // Recursive call to traverse the tree.\r\n promises.push(getGitConfigTree(childConfigRef));\r\n }\r\n }\r\n });\r\n yield Promise.all(promises);\r\n });\r\n}\r\n/**\r\n * This function returns child configRefs\r\n * @param {ExperienceConfig} resolvedConfig: Experience resolved properties\r\n * @returns {Set} Array of Config Refs in the resolved config.\r\n */\r\nexport function getChildConfigRefs(resolvedConfig) {\r\n const configRefSet = new Set();\r\n if (resolvedConfig && resolvedConfig.properties) {\r\n try {\r\n addConfigRefFromObject(resolvedConfig.properties, configRefSet);\r\n }\r\n catch (error) {\r\n // No action!\r\n logger.info(\"WebWorker.getChildrenConfigIndexes config failed\");\r\n }\r\n }\r\n return configRefSet;\r\n}\r\n/**\r\n * Adds all config ref found in the object to the given set.\r\n * @param obj The object to search in.\r\n * @param indicies The set of ConfigReference to add to.\r\n */\r\nfunction addConfigRefFromObject(obj, indicies) {\r\n const { configRef } = obj;\r\n if (configRef && configRef.experienceType && configRef.instanceSrc) {\r\n indicies.add(configRef);\r\n // configRefs are usually immediately enclosed by a dedicated parent object\r\n // so further traversal of this immediate parent is not going to be fruitful.\r\n return;\r\n }\r\n for (const value of Object.values(obj)) {\r\n if (value && typeof (value) === \"object\") {\r\n addConfigRefFromObject(value, indicies);\r\n }\r\n }\r\n}\r\n/**\r\n * This overwrite (update) / write configs into cache\r\n * @returns true if configs are equal\r\n */\r\nexport function updateConfigsCache() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n return configResolver.updateConfigsCache();\r\n });\r\n}\r\n/**\r\n * To be called by unit tests in order to reset the state\r\n */\r\nexport function resetGitConfigResolver() {\r\n configResolver = null;\r\n visitedHrefs = null;\r\n}\r\n//# sourceMappingURL=wwGitConfigResolver.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { getTargetScope } from \"./Variables\";\r\nimport { environment, logger, perfMarker, ExperienceTypes, IndexedDb, RiverConfigType, registerCommandMessageHandler, WebWorkerMessageId, registerDataMessageHandler, sendMessage } from \"../wwCommon\";\r\nimport { get, isArray, isEmpty, isString, mergeWith, isEqual } from \"lodash-es\";\r\nimport { stringHasData } from \"./Utility\";\r\nimport { getPeregrineFlights } from \"@msnews/experimentation-helpers\";\r\nimport { getLiveCacheBustingIdentifier } from \"./ConfigCacheBustHelper\";\r\nimport { initializeGitResolverEnvironment, getGitConfigTree, updateConfigsCache, experienceGitConfigMap } from \"./wwGitConfigResolver\";\r\nimport { HrefNotValid, GetConfigTreeError, GetConfigTreeEmpty, GetConfigTreeNull, PageScopeInvalid, CrsFetchError, ErrorParsingConfigTree, IdbConfigReadFailed, IdbConfigWriteFailed, IdbConfigInitFailed, IdbConfigClearFailed, RefreshConfigsNewConfigsFailed, RefreshConfigsCbidError, RefreshConfigsError, ConfigCrsFetchNon200Response, ConfigCdnFetchNon200Response, ConfigsDownloadedByCdn } from \"../AppErrors\";\r\nimport { SubscribableMap } from \"../wwCommon/SubscribableMap\";\r\n/** Dictionary to store configs needed per experience type */\r\nexport const experienceConfigMap = new SubscribableMap();\r\n/** Registers config resolver realted tasks */\r\nexport function registerConfigResolverTasks() {\r\n if (environment.disableWWConfigPreload) {\r\n return;\r\n }\r\n // initialize config resolver base URL & params\r\n initializeWwResolver();\r\n registerCommandMessageHandler(WebWorkerMessageId.ClearConfigCache, clearConfigCache);\r\n registerDataMessageHandler(WebWorkerMessageId.RefreshConfigs, () => {\r\n RefreshConfigs().then((response) => {\r\n sendMessage({ id: WebWorkerMessageId.RefreshConfigs, fetched: true, payload: response });\r\n });\r\n });\r\n}\r\n/**\r\n * Target scope of the current page request\r\n * @type {PageRequestTargetScope}\r\n */\r\nlet currentTargetScope;\r\n/**\r\n * Target scope of the current page request with only Peregrine scoped flights\r\n * @type {PageRequestTargetScope}\r\n */\r\nlet scopeWithPeregrineFlights;\r\n/**\r\n * Dictionary to maintain all resolved config for internal state management\r\n * @type {Map}\r\n */\r\nconst configMap = new Map();\r\n// set fallback env to prod to avoid any live site issues\r\n/**\r\n * Config base url used during cms config resolution.\r\n * @type {string}\r\n */\r\nlet cdnConfigBaseUrl;\r\n/**\r\n * Config base url for Config Service\r\n * @type {string}\r\n */\r\nlet configServiceBaseUrl;\r\n/**\r\n * Promise map of all file download promises, so that we don't accidentally make duplicate calls\r\n */\r\nconst donwloadPromiseMap = new Map();\r\nconst downloadMap = new Map();\r\n/**\r\n * Dictionary of config index hrefs those are already visited.\r\n */\r\nlet visitedHrefs = {};\r\n/* Check if ConfigService operation is allowed or not.\r\n* @type {boolean}\r\n*/\r\nlet enableConfigService = false;\r\n/* Get config service parameters from currentTargetScope\r\n* @type {string}\r\n*/\r\nlet configServiceParameters = \"\";\r\n/**\r\n * Instance of IndexedDb class\r\n */\r\nlet indexedDb;\r\n/* Check if IndexedDb operation is allowed or not.\r\n* @type {boolean}\r\n*/\r\nlet useIndexedDb;\r\n/**\r\n * Current Timestamp for config staleness check\r\n */\r\nconst stalenessCheckTimestamp = new Date().getTime();\r\n/** Set to true when configs started to write to indexedDb. */\r\nlet writeConfigsToIndexedDbCalled;\r\n/** Promise map of config tree download promise. */\r\nconst configTreePromiseMap = new Map();\r\n/**\r\n * Check if config service should return more than 1 config\r\n * @type {boolean}\r\n */\r\nlet isMultiConfigRetrievalEnabled = false;\r\n/**\r\n * Experience configs needed as soon as possible\r\n */\r\nconst experienceConfigsNeeded = [\r\n // DO NOT change the order of entrypoint configs, they should added to the Map first\r\n ExperienceTypes.EntryPointEdgeNext,\r\n ExperienceTypes.EntryPoint,\r\n // Order doesn't matter for the below configs\r\n ExperienceTypes.River,\r\n ExperienceTypes.WeatherCard,\r\n ExperienceTypes.PlacementManager,\r\n ExperienceTypes.MyBriefing,\r\n ExperienceTypes.NewsbarFeed,\r\n ExperienceTypes.DesktopFeed,\r\n ExperienceTypes.DesktopFeedEdgeNext,\r\n ExperienceTypes.DesktopFeedSingleColumn,\r\n ExperienceTypes.IndustryNewsCard\r\n];\r\n/**\r\n * Initialize web worker resolver.\r\n * Export is for test purposes only.\r\n */\r\nexport function initializeWwResolver(idb) {\r\n if (!environment.env) {\r\n return;\r\n }\r\n cdnConfigBaseUrl = environment.configRootUrl;\r\n currentTargetScope = getTargetScope();\r\n if (currentTargetScope) {\r\n scopeWithPeregrineFlights = Object.assign(Object.assign({}, currentTargetScope), { pageExperiments: getPeregrineFlights(currentTargetScope.pageExperiments) });\r\n }\r\n indexedDb = idb ? idb : new IndexedDb();\r\n // Check if IndexedDb is supported\r\n useIndexedDb = indexedDb.supported\r\n // PCS flag to turn on/off IndexedDb caching of configs.\r\n // Flag to turn on/off IndexedDb caching for debugging purposes\r\n && indexedDb.isCachingAllowed\r\n // Use case is simple config tests, we do not want to cache\r\n // Also not caching in server-side in this scenario\r\n && !environment.enableCMSPPEConfigs\r\n // TODO: If this is GitConfigs flight, do not use indexedDB for now to avoid getting unnecessary bugs.\r\n // Once IndexedDB is fixed for Git configs, this line will be removed\r\n && !environment.isGitConfigs;\r\n enableConfigService = useConfigService();\r\n if (enableConfigService) {\r\n formConfigServiceUrl(environment.cacheBustingIdentifier);\r\n }\r\n if (environment.isGitConfigs) {\r\n initializeGitResolverEnvironment(scopeWithPeregrineFlights);\r\n }\r\n}\r\n/**\r\n * Form config service url\r\n * @param cacheBustingIdentifier cbid to append in query parameter.\r\n */\r\nfunction formConfigServiceUrl(cacheBustingIdentifier) {\r\n configServiceBaseUrl = environment.configServiceBaseUrl;\r\n // Query string parameter from target scope.\r\n configServiceParameters = \"?targetScope=\" + JSON.stringify(scopeWithPeregrineFlights);\r\n // Send PCS apptype to CRS so we can build CRS Jarvis dashboards per apptype.\r\n configServiceParameters += `&apptype=${environment.pcsApptype}`;\r\n // Check if CRS should fetch multiple configs and its depth.\r\n isMultiConfigRetrievalEnabled = environment.multiConfigRetrievalEnabled;\r\n if (isMultiConfigRetrievalEnabled) {\r\n configServiceParameters += `&maxDepth=${getConfigRetrievalMaxDepth()}`;\r\n }\r\n // Send cacheBustingIdentifier to CRS\r\n if (cacheBustingIdentifier) {\r\n configServiceParameters += `&cbid=${cacheBustingIdentifier}`;\r\n }\r\n // If url has dev only query string params, inform CRS so it can exclude from availability and will help debugging on Jarvis.\r\n if (containsDevOnlyQueryParameters()) {\r\n configServiceParameters += \"&item=dev:true\";\r\n }\r\n if (environment.enableCMSPPEConfigs) {\r\n configServiceParameters += \"&item=cms:ppe\";\r\n }\r\n}\r\n/**\r\n * This function generates a key that is used to write/read configurations to/from storage.\r\n * example key: \"kids|ja|jp|testPage|mmx\"\r\n * @private\r\n * @return string\r\n */\r\nexport function generateKey() {\r\n const { audienceMode = \"\", locale = {}, pageType = \"\" } = currentTargetScope || {};\r\n const { language, market } = locale;\r\n const keys = [audienceMode, language, market, pageType, environment.pcsApptype || \"\"];\r\n return keys.map(key => key || \"\").join(\"|\").toLowerCase();\r\n}\r\n/**\r\n * Start downloading Config tree.\r\n * @param: cache busting identifier to be used in CRS network call as query string param.\r\n */\r\nexport function loadConfigTree(liveCacheBustingIdentifier) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const cbid = liveCacheBustingIdentifier || environment.cacheBustingIdentifier || \"\";\r\n const configTreeTraversalPromiseKey = `loadConfigTreeCbid-${(cbid)}`;\r\n // if configTreePromiseMap already has this item, we have config tree download in progress, return this promise.\r\n if (configTreePromiseMap.has(configTreeTraversalPromiseKey)) {\r\n logger.info(`WebWorker.loadConfigs: promise was already resolved and configMap has ${configMap.size} configs.`);\r\n return configTreePromiseMap.get(configTreeTraversalPromiseKey);\r\n }\r\n perfMarker(\"loadConfigs-start\");\r\n const configTreePromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n perfMarker(`getConfigTree-${(cbid)}-start`);\r\n logger.info(`WebWorker.loadConfigs: loading configs over the network for cbid: ${cbid}.`);\r\n if (environment.isGitConfigs) {\r\n const configRef = {\r\n experienceType: \"AppConfig\",\r\n instanceSrc: \"default\"\r\n };\r\n yield getGitConfigTree(configRef);\r\n addConfigToExperienceConfigMap();\r\n }\r\n else {\r\n yield getConfigTree(environment.configIndexDocId);\r\n }\r\n logger.info(`WebWorker.loadConfigs: completed fetching ${configMap.size} configs over the network.`);\r\n resolve();\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, ErrorParsingConfigTree), { message: \"Error parsing config tree\", pb: Object.assign(Object.assign({}, ErrorParsingConfigTree.pb), { customMessage: `Error: ${e}` }) }));\r\n reject(e);\r\n }\r\n finally {\r\n perfMarker(`getConfigTree-${(cbid)}-end`);\r\n }\r\n }));\r\n configTreePromiseMap.set(configTreeTraversalPromiseKey, configTreePromise);\r\n perfMarker(\"loadConfigs-end\");\r\n return configTreePromise;\r\n });\r\n}\r\n/**\r\n * Get cached Configs from IndexedDb and populate configMap based on target scope key.\r\n */\r\nfunction populateConfigsFromIndexedDb(indexedDbMap) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!useIndexedDb) {\r\n return;\r\n }\r\n try {\r\n const cachedConfigs = yield indexedDb.getObject(generateKey());\r\n if (!cachedConfigs) {\r\n logger.info(\"WebWorker.populateConfigsFromIndexedDb: Bulk read of configs didn't find any config.\");\r\n return;\r\n }\r\n // targetScopeKey is inserted into IndexedDb along with configIndexHref.\r\n // Although there can be more than type of keys being formed since DHP and NTP will have different ones due to pageType in targetScope.\r\n cachedConfigs.forEach(cachedConfig => {\r\n if (cachedConfig.configIndexHref\r\n && !isConfigStale(cachedConfig.storageTimestamp)) {\r\n indexedDbMap.set(cachedConfig.configIndexHref, cachedConfig);\r\n }\r\n });\r\n logger.info(`WebWorker.populateConfigsFromIndexedDb completed. Found ${cachedConfigs.size} configs in Idb.`);\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, IdbConfigReadFailed), { message: \"IndexedDb Configs read failed\", pb: Object.assign(Object.assign({}, IdbConfigReadFailed.pb), { customMessage: `Error: ${e}` }) }));\r\n // Once we get an exception using IndexedDb, stop trying to use it.\r\n useIndexedDb = false;\r\n }\r\n });\r\n}\r\n/**\r\n * Write configMap to indexedDb.\r\n */\r\nfunction writeConfigMapToIndexedDb() {\r\n if (!useIndexedDb) {\r\n return;\r\n }\r\n try {\r\n // Write config tree to indexedDb as a single row.\r\n indexedDb.setObject(generateKey(), configMap).then(() => {\r\n logger.info(\"WebWorker.writeConfigMapToIndexedDb: completed\");\r\n });\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, IdbConfigWriteFailed), { message: \"Failed to write configMap to indexedDb\", pb: Object.assign(Object.assign({}, IdbConfigWriteFailed.pb), { customMessage: `Error: ${e}` }) }));\r\n // Once we get an exception using IndexedDb, stop trying to use it.\r\n useIndexedDb = false;\r\n }\r\n}\r\n/**\r\n * Read configs from IndexedDb as indexedDbMap\r\n * Compare indexedDbMap again configs received through network call aka configMap\r\n * Write configMap to indexedDb.\r\n * @returns RefreshConfigsResponse\r\n */\r\nexport function RefreshConfigs() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const configsRefreshResponse = {\r\n configsEqual: true,\r\n liveCbId: undefined\r\n };\r\n if (environment.isGitConfigs) {\r\n configsRefreshResponse.configsEqual = yield updateConfigsCache();\r\n return configsRefreshResponse;\r\n }\r\n if (!useIndexedDb) {\r\n return configsRefreshResponse;\r\n }\r\n try {\r\n // If config tree wasn't loaded from network or still loading, let it complete first.\r\n yield loadConfigTree();\r\n // Check configMap size after loading config tree.\r\n // if configMap does not contain any config, do not proceed.\r\n if (configMap.size === 0) {\r\n return configsRefreshResponse;\r\n }\r\n // Populate configs from indexedDB.\r\n const indexedDbMap = new Map();\r\n const indexedDbPromise = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\r\n // Initialize indexedDb.\r\n yield initializeIndexedDb();\r\n // Populate configs from indexedDb to indexedDbMap.\r\n yield populateConfigsFromIndexedDb(indexedDbMap);\r\n resolve();\r\n }));\r\n // Get live cache busting identifier\r\n let liveCacheBustingIdentifier;\r\n const cbIdPromise = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {\r\n liveCacheBustingIdentifier = yield getLiveCacheBustingIdentifier();\r\n resolve();\r\n }));\r\n // Make parallel calls read all configs from indexedDb and to read CBID from CRS.\r\n yield Promise.all([cbIdPromise, indexedDbPromise]);\r\n configsRefreshResponse.liveCbId = liveCacheBustingIdentifier;\r\n // If indexedDb has entrypoint config cached, get cbId from entrypoint config.\r\n // If either entrypoint config is not present in cache or cbId is not yet present in this config, no action.\r\n // CBID is a number starting from 1. It would not be less than 1 ever since we always increase it when required.\r\n // If live CBID <= cached CBID, no action!\r\n // If live CBID > cached CBID, clear all cached configs and refill indexedDB with new set of configs.\r\n if (liveCacheBustingIdentifier\r\n && indexedDbMap.size > 0\r\n && indexedDbMap.has(environment.configIndexDocId)) {\r\n const cachedEntrypointConfig = indexedDbMap.get(environment.configIndexDocId);\r\n const indexedDbCbid = cachedEntrypointConfig ? cachedEntrypointConfig.cbId : undefined;\r\n if (indexedDbCbid) {\r\n if (!environment.isGitConfigs\r\n && (indexedDbCbid !== liveCacheBustingIdentifier\r\n || environment.cacheBustingIdentifier !== indexedDbCbid.toString())) {\r\n logger.error(Object.assign(Object.assign({}, RefreshConfigsCbidError), { message: \"CBID change detected\", pb: Object.assign(Object.assign({}, RefreshConfigsCbidError.pb), { customMessage: `HighestCbid = ${environment.cacheBustingIdentifier || \"\"}. IndexedDbCbid = ${indexedDbCbid}. LiveCbid = ${liveCacheBustingIdentifier}` }) }));\r\n }\r\n if (liveCacheBustingIdentifier > indexedDbCbid) {\r\n // Clear all entry from this indexedDb.\r\n yield clearIndexedDb();\r\n logger.info(`WebWorker.refreshConfigs: LiveCBID = ${liveCacheBustingIdentifier} > indexedDB CBID = ${indexedDbCbid} so IndexedDb configs are purged and starting to download fresh configs.`);\r\n // Clear maps to make sure next set of config calls call pass through.\r\n configMap.clear();\r\n indexedDbMap.clear();\r\n donwloadPromiseMap.clear();\r\n downloadMap.clear();\r\n visitedHrefs = {};\r\n // Change CRS url to include new CBID and load config tree with this CRS url.\r\n formConfigServiceUrl(liveCacheBustingIdentifier.toString());\r\n yield loadConfigTree(liveCacheBustingIdentifier.toString());\r\n if (configMap.size > 0) {\r\n logger.info(`WebWorker.refreshConfigs: New configs are downloaded for CBID:${liveCacheBustingIdentifier}.`);\r\n }\r\n else {\r\n if (!environment.isGitConfigs) {\r\n logger.error(Object.assign(Object.assign({}, RefreshConfigsNewConfigsFailed), { message: \"New configs were not downloaded for a CBID\", pb: Object.assign(Object.assign({}, RefreshConfigsNewConfigsFailed.pb), { customMessage: liveCacheBustingIdentifier.toString() }) }));\r\n }\r\n }\r\n // When CBID change is detected and we purged configs in indexedDb, set configsEqual to false\r\n // So render cache can be purged as well in main thread.\r\n configsRefreshResponse.configsEqual = false;\r\n }\r\n }\r\n }\r\n // This comparison of indexedDb config and network config is for Render Cache feature.\r\n // IndexedDbMap is typically empty in FRE.\r\n // no need to proceed if empty.\r\n if (indexedDbMap.size > 0) {\r\n configMap.forEach(networkConfig => {\r\n if (configsRefreshResponse.configsEqual && indexedDbMap.has(networkConfig.configIndexHref)) {\r\n const cachedConfig = indexedDbMap.get(networkConfig.configIndexHref);\r\n // For render cache\r\n // Check if cached config and network configs are same\r\n if (!areConfigsEqual(cachedConfig, networkConfig)) {\r\n logger.info(`WebWorker.compareConfigs: ${networkConfig.experienceType || \"\"} config changed with configIndexHref: ${networkConfig.configIndexHref || \"\"}.`);\r\n configsRefreshResponse.configsEqual = false;\r\n }\r\n }\r\n });\r\n logger.info(`WebWorker.refreshConfigs: Network configs and cached configs same: ${configsRefreshResponse.configsEqual}`);\r\n }\r\n // Write CBID to Entrypoint config object.\r\n // This way new CBID will be present in indexedDB for next time!\r\n if (liveCacheBustingIdentifier\r\n && configMap.has(environment.configIndexDocId)) {\r\n const entrypointConfig = configMap.get(environment.configIndexDocId);\r\n entrypointConfig.cbId = liveCacheBustingIdentifier;\r\n }\r\n // Write network configs to indexedDb.\r\n writeConfigMapToIndexedDb();\r\n writeConfigsToIndexedDbCalled = true;\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, RefreshConfigsError), { message: \"RefreshConfigs uncaught error\", pb: Object.assign(Object.assign({}, RefreshConfigsError.pb), { customMessage: `Error: ${e}` }) }));\r\n useIndexedDb = false;\r\n }\r\n return configsRefreshResponse;\r\n });\r\n}\r\n/**\r\n * Write configMap to indexedDb.\r\n */\r\nfunction initializeIndexedDb() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!useIndexedDb) {\r\n return;\r\n }\r\n const initializeIndexedDbPromise = \"initializeIndexedDb\";\r\n if (configTreePromiseMap.has(initializeIndexedDbPromise)) {\r\n logger.info(\"WebWorker.initializeIndexedDb: promise was already resolved.\");\r\n return configTreePromiseMap.get(initializeIndexedDbPromise);\r\n }\r\n const initializeIdbPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n yield indexedDb.initializeIndexedDb(1, \"Configurations_12\", \"wwConfigs\");\r\n logger.info(\"WebWorker.initializeIndexedDb: completed\");\r\n resolve();\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, IdbConfigInitFailed), { message: \"Failed to init configs IndexedDB\", pb: Object.assign(Object.assign({}, IdbConfigInitFailed.pb), { customMessage: `Error: ${e}` }) }));\r\n useIndexedDb = false;\r\n reject(e);\r\n }\r\n }));\r\n configTreePromiseMap.set(initializeIndexedDbPromise, initializeIdbPromise);\r\n });\r\n}\r\n/**\r\n * Clear configs from IndexedDb.\r\n * @param: configIndexHref to delete config.\r\n */\r\nexport function clearConfigCache(configIndexHref) {\r\n if (!useIndexedDb) {\r\n return;\r\n }\r\n // when config index href exists\r\n if (configIndexHref\r\n // Configs are not written to indexedDb yet.\r\n && !writeConfigsToIndexedDbCalled\r\n // ConfigMap has this config index href\r\n && configMap.has(configIndexHref)) {\r\n configMap.delete(configIndexHref);\r\n logger.info(`WebWorker.clearConfigCache: removed config ${configIndexHref} from configMap.`);\r\n return;\r\n }\r\n // If confixIndexHref is undefined or writeConfigsToIndexedDbCalled was true, clear configs in indexedDb.\r\n clearIndexedDb();\r\n}\r\n/**\r\n * Clear all configs from IndexedDb.\r\n */\r\nfunction clearIndexedDb() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!useIndexedDb) {\r\n return;\r\n }\r\n try {\r\n yield initializeIndexedDb();\r\n yield indexedDb.clearObjects();\r\n logger.info(\"WebWorker.clearIndexedDb: done.\");\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, IdbConfigClearFailed), { message: \"Failed to clear configs indexedDb\", pb: Object.assign(Object.assign({}, IdbConfigClearFailed.pb), { customMessage: `Error: ${e}` }) }));\r\n // Once we get an exception using IndexedDb, stop trying to use it.\r\n useIndexedDb = false;\r\n }\r\n });\r\n}\r\n/**\r\n * Function to check config is stale.\r\n * @returns true if stale else false.\r\n */\r\nfunction isConfigStale(storageTimestamp) {\r\n if (!storageTimestamp) {\r\n return true;\r\n }\r\n // 259200000 = 3 days in milliseconds\r\n if ((stalenessCheckTimestamp - storageTimestamp) > 259200000) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * This is a recursive function to parse and download config tree.\r\n * @param configIndexHref: Relative Url of config Index href\r\n */\r\nfunction getConfigTree(configIndexHref) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!stringHasData(configIndexHref)) {\r\n logger.error(Object.assign(Object.assign({}, HrefNotValid), { message: \"ConfigIndexHref is invalid\" }));\r\n return;\r\n }\r\n let mergedConfigsMap;\r\n try {\r\n // Force to load config from network.\r\n mergedConfigsMap = yield getConfigFromNetwork(configIndexHref);\r\n }\r\n catch (e) {\r\n logger.error(Object.assign(Object.assign({}, GetConfigTreeError), { message: \"getConfigTree threw error\", pb: Object.assign(Object.assign({}, GetConfigTreeError.pb), { customMessage: `${configIndexHref}. Error: ${e}` }) }));\r\n return;\r\n }\r\n if (!mergedConfigsMap || mergedConfigsMap.size === 0) {\r\n logger.error(Object.assign(Object.assign({}, GetConfigTreeEmpty), { message: \"Didn't return config\", pb: Object.assign(Object.assign({}, GetConfigTreeEmpty.pb), { customMessage: configIndexHref }) }));\r\n return;\r\n }\r\n const promises = [];\r\n mergedConfigsMap.forEach((resolvedConfig, configIndexKey) => {\r\n visitedHrefs[configIndexKey] = true;\r\n if (!resolvedConfig) {\r\n logger.error(Object.assign(Object.assign({}, GetConfigTreeNull), { message: \"Returned null config\", pb: Object.assign(Object.assign({}, GetConfigTreeNull.pb), { customMessage: configIndexKey }) }));\r\n }\r\n else {\r\n checkForExperienceConfigs(experienceConfigsNeeded, resolvedConfig);\r\n const configIndexHrefSet = getChildrenConfigIndexes(resolvedConfig);\r\n if (!configIndexHrefSet || configIndexHrefSet.size === 0) {\r\n // This is a leaf node and no more child configs are linked.\r\n return;\r\n }\r\n else {\r\n for (const configIndexDocId of configIndexHrefSet) {\r\n if (stringHasData(configIndexDocId)\r\n && !visitedHrefs[configIndexDocId]\r\n && !mergedConfigsMap.has(configIndexDocId)) {\r\n // Recursive call to traverse the tree.\r\n promises.push(getConfigTree(configIndexDocId));\r\n }\r\n }\r\n }\r\n }\r\n });\r\n yield Promise.all(promises);\r\n });\r\n}\r\n/**\r\n * This function accepts config properties and returns href of config idnexs present in the properties.\r\n * IMPORTANT: When change is made in this function, similar change is required in CRS to get max perf benefits.\r\n * @param resolvedConfig: Experience resolved properties\r\n * @returns Array of config index found in the resolved config.\r\n */\r\nexport function getChildrenConfigIndexes(resolvedConfig) {\r\n const config = resolvedConfig.properties;\r\n if (!config) {\r\n return;\r\n }\r\n const configIndexHrefSet = new Set();\r\n try {\r\n // First look for anything that has an \"href\" property to see if it's a reference to a config index\r\n addConfigIndiciesInObject(config, configIndexHrefSet);\r\n // Get from dynamic PivotsNav\r\n const dynamicPivots = config.dynamicPivots;\r\n if (dynamicPivots) {\r\n addUniqueConfigIndexHrefInArray(dynamicPivots.configIndexHref, configIndexHrefSet);\r\n }\r\n // Get from static PivotsNav\r\n addConfigIndexHrefsFromPivots(config.staticPivots, configIndexHrefSet);\r\n // Get from pivots in Layout data connector\r\n addConfigIndexHrefsFromPivots(config.pivots, configIndexHrefSet);\r\n // Get from xfeedConfigIndexHref\r\n if (config.xfeedConfigIndexHref) {\r\n addUniqueConfigIndexHrefInArray(config.xfeedConfigIndexHref, configIndexHrefSet);\r\n }\r\n }\r\n catch (error) {\r\n // No action!\r\n logger.info(`WebWorker.getChildrenConfigIndexes config failed for: ${resolvedConfig._id}`);\r\n }\r\n return configIndexHrefSet;\r\n}\r\n/**\r\n * Iterates through a list of pivots and adds any config index hrefs to the set of config index hrefs\r\n * @param pivots List of pivots\r\n * @param configIndexHrefSet Set of config index hrefs\r\n */\r\nfunction addConfigIndexHrefsFromPivots(pivots, configIndexHrefSet) {\r\n if (!pivots || !pivots.length) {\r\n return;\r\n }\r\n pivots.forEach(pivot => {\r\n if (pivot && pivot.configIndexHref) {\r\n addUniqueConfigIndexHrefInArray(pivot.configIndexHref, configIndexHrefSet);\r\n }\r\n });\r\n}\r\n/**\r\n * Adds all config indicies found in the object to the given set, that are found under \"href\" properties.\r\n * @param obj The object to search in.\r\n * @param indicies The set of indicies to add to.\r\n */\r\nfunction addConfigIndiciesInObject(obj, indicies) {\r\n const href = obj.href;\r\n if (typeof (href) === \"string\" && href.indexOf(\"cms/api/amp/experienceConfigIndex/\") === 0 && !indicies.has(href)) {\r\n indicies.add(href);\r\n }\r\n for (const value of Object.values(obj)) {\r\n if (typeof (value) === \"object\" && value) {\r\n addConfigIndiciesInObject(value, indicies);\r\n }\r\n }\r\n}\r\n/**\r\n * Helper function to add unique keys in the config tree download process.\r\n * @param configIndexHref: configIndexHref\r\n * @param configIndexHrefArray: array of config index href.\r\n */\r\nfunction addUniqueConfigIndexHrefInArray(configIndexHref, configIndexHrefSet) {\r\n if (configIndexHref && !configIndexHrefSet.has(configIndexHref)) {\r\n configIndexHrefSet.add(configIndexHref);\r\n }\r\n}\r\n/**\r\n * Merges config objects.\r\n * @private\r\n * @param {ExperienceConfigWrapper[]} configs - an array of config documents\r\n * @param {string} experienceType - experienceType\r\n * @return ExperienceConfig - returns merged config based on a set of rules\r\n */\r\nfunction mergeConfig(configs) {\r\n if (!configs || configs.length < 1) {\r\n return null;\r\n }\r\n const result = configs[0];\r\n // skip the 0th item as it is assigned to result above, only merge properties section\r\n for (let count = 1; count < configs.length; count++) {\r\n result.properties = mergeWith(result.properties, configs[count].properties, customizer);\r\n }\r\n return result;\r\n}\r\n/**\r\n * matches targeting scope and returns the config urls for the same.\r\n * @private\r\n * @param {IExperienceConfigIndex} configIndex - an array of config documents\r\n * @return string[] - returns urls for configurations for which the scope matched\r\n */\r\nfunction resolveConfigIndex(configIndex) {\r\n if (!configIndex) {\r\n return null;\r\n }\r\n const configPaths = [];\r\n configIndex.configs.forEach(experienceRef => {\r\n if (targetScopeMatched(experienceRef)) {\r\n configPaths.push(experienceRef.href);\r\n }\r\n });\r\n // if override config is provided, then we add that to the end of list\r\n // so props provided in override config will add/update existing properties.\r\n // This is similar to CMS override settings but scoped to experience level.\r\n if (configIndex.overrideConfig && stringHasData(configIndex.overrideConfig.href)) {\r\n configPaths.push(configIndex.overrideConfig.href);\r\n }\r\n return configPaths;\r\n}\r\n/**\r\n * basic version of target scope that only checks market currently.\r\n * @private\r\n * @param {IExperienceConfigReference} experienceRef - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope matches with config target scope, otherwise false\r\n */\r\nfunction targetScopeMatched(experienceRef) {\r\n const targetScope = experienceRef.targetScope;\r\n // if target scope is undefined for a config entry, we treat that as default config and apply it\r\n if (!targetScope) {\r\n return true;\r\n }\r\n return (audienceModeMatched(targetScope)\r\n && browserTypeMatched(targetScope)\r\n && deviceTypeMatched(targetScope)\r\n && domainMatched(targetScope)\r\n && experimentMatched(targetScope)\r\n && marketMatched(targetScope)\r\n && osMatched(targetScope)\r\n && pageTypeMatched(targetScope)\r\n && platformMatched(targetScope));\r\n}\r\n/**\r\n * function to check if current audienceMode type matches target audienceMode type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope audienceMode matches with config target scope audienceMode, otherwise false\r\n */\r\nfunction audienceModeMatched(targetScope) {\r\n if (!targetScope.audienceMode || currentTargetScope.audienceMode === targetScope.audienceMode) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current browser type matches target browser type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope browser type matches with config target scope browser type, otherwise false\r\n */\r\nfunction browserTypeMatched(targetScope) {\r\n if (!targetScope.browser || !targetScope.browser.browserType) {\r\n return true;\r\n }\r\n if (currentTargetScope.browser && currentTargetScope.browser.browserType === targetScope.browser.browserType &&\r\n (!targetScope.browser.version || currentTargetScope.browser.version === targetScope.browser.version)) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current device type matches target device type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope device type matches with config target scope device type, otherwise false\r\n */\r\nfunction deviceTypeMatched(targetScope) {\r\n if (!targetScope.deviceFormFactor || currentTargetScope.deviceFormFactor === targetScope.deviceFormFactor) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Check if current domain matches target domain\r\n * @param targetScope - experience config reference that has targetscope as child property\r\n * @return Whether current target scope domain matches with config target scope domain\r\n */\r\nfunction domainMatched(targetScope) {\r\n return !targetScope.domain || currentTargetScope.domain === targetScope.domain;\r\n}\r\n/**\r\n * function to check if current experiment id matches with the requested scope experiment id.\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope experiment matches with config target scope experiment, otherwise false\r\n */\r\nfunction experimentMatched(targetScope) {\r\n currentTargetScope.pageExperiments = currentTargetScope.pageExperiments || [];\r\n if (!isString(targetScope.experimentId) || isEmpty(targetScope.experimentId)\r\n || currentTargetScope.pageExperiments.indexOf(targetScope.experimentId) >= 0) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Compare the strings case insensitive. Undefined or null is treated as empty string.\r\n * @private\r\n * @param {string} lhs The string to compare.\r\n * @param {string} rhs The string to compare against.\r\n * @return {number} - true if the strings equal case insensitive.\r\n */\r\nfunction stringsEqualCaseInsensitive(lhs, rhs) {\r\n return (lhs || \"\").localeCompare(rhs || \"\", undefined, { sensitivity: \"accent\" }) === 0;\r\n}\r\n/**\r\n * function to check if current market scope match with target scope market.\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope market matches with config target scope market, otherwise false\r\n */\r\nfunction marketMatched(targetScope) {\r\n // if locale is not part of target scope, we assume it is applicable for all locale.\r\n // Separated out this if condition to have clarity about this behavior.\r\n if (!targetScope.locale) {\r\n return true;\r\n }\r\n const targetLocale = targetScope.locale;\r\n const currentLocale = currentTargetScope.locale;\r\n if ((!targetLocale.language || stringsEqualCaseInsensitive(targetLocale.language, currentLocale.language)) &&\r\n (!targetLocale.market || stringsEqualCaseInsensitive(targetLocale.market, currentLocale.market)) &&\r\n (!targetLocale.script || stringsEqualCaseInsensitive(targetLocale.script, currentLocale.script))) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current operating system type matches target operating system type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope operating system type matches with config target scope operating system type, otherwise false\r\n */\r\nfunction osMatched(targetScope) {\r\n return !targetScope.os || currentTargetScope.os === targetScope.os;\r\n}\r\n/**\r\n * function to check if current pagetype matches target scope\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope pagetype matches with config target scope pagetype, otherwise false\r\n */\r\nfunction pageTypeMatched(targetScope) {\r\n if (!targetScope.pageType || currentTargetScope.pageType === targetScope.pageType) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * function to check if current scope platform type matches target scope platform type\r\n * @private\r\n * @param {PageRequestTargetScope} targetScope - experience config reference that has targetscope as child property\r\n * @return boolean - true if current target scope platform matches with config target scope platform, otherwise false\r\n */\r\nfunction platformMatched(targetScope) {\r\n if (!targetScope.platform || currentTargetScope.platform === targetScope.platform) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Customizer for merge. We are explcitly overriding the array from taget to source. No array elements from source are preserved.\r\n * @private\r\n * @param {any} srcValue - source object to merge. Can be of type any\r\n * @param {any} objValue - target object to merge. Can be of type any\r\n * @return target Object when the type is array. Otherwise uses default behavior of merge.\r\n */\r\nfunction customizer(srcValue, objValue) {\r\n if (isArray(srcValue)) {\r\n return objValue;\r\n }\r\n}\r\n/**\r\n * Returns the resolved merged Experience config when passed Experience Config Index.\r\n * This function downloads the config index, filter based on target scope, download the configs and\r\n * merge the configs\r\n * @private\r\n * @param {string} configIndexHref - Experience Index document relative url.\r\n * @return Promise> map of config(s) resolved by service/cdn.\r\n */\r\nfunction getConfigFromNetwork(configIndexHref) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const mergedConfigsMap = new Map();\r\n if (!currentTargetScope || !configIndexHref || !isString(configIndexHref) || isEmpty(configIndexHref)) {\r\n logger.error(Object.assign(Object.assign({}, PageScopeInvalid), { message: \"Page scope invalid for configIndexHref\", pb: Object.assign(Object.assign({}, PageScopeInvalid.pb), { customMessage: configIndexHref || \"\" }) }));\r\n return mergedConfigsMap;\r\n }\r\n if (enableConfigService) {\r\n const configServiceRelativeUrl = configIndexHref.replace(\"cms/api/amp/experienceConfigIndex/\", \"\") + configServiceParameters;\r\n try {\r\n // Get mereged config from config service with multi config support.\r\n if (isMultiConfigRetrievalEnabled) {\r\n const crsResponse = yield downloadFile(configServiceBaseUrl, configServiceRelativeUrl, true);\r\n if (crsResponse && crsResponse.rootConfigIndexId && crsResponse.configs) {\r\n Object.values(crsResponse.configs).forEach((crsMergedConfig) => {\r\n if (crsMergedConfig && crsMergedConfig.configIndexHref) {\r\n const configIndexKey = crsMergedConfig.configIndexHref;\r\n addConfigToConfigMap(configIndexKey, crsMergedConfig);\r\n mergedConfigsMap.set(configIndexKey, crsMergedConfig);\r\n }\r\n });\r\n return mergedConfigsMap;\r\n }\r\n }\r\n else {\r\n // Get single merged config from config service\r\n const crsConfig = yield downloadFile(configServiceBaseUrl, configServiceRelativeUrl, true);\r\n if (crsConfig) {\r\n addConfigToConfigMap(configIndexHref, crsConfig);\r\n mergedConfigsMap.set(configIndexHref, crsConfig);\r\n logger.info(`${configIndexHref} config fetched using CRS without multi config support.`);\r\n return mergedConfigsMap;\r\n }\r\n }\r\n }\r\n catch (error) {\r\n logger.error(Object.assign(Object.assign({}, CrsFetchError), { message: \"CRS fetch failed due to network error\", pb: Object.assign(Object.assign({}, CrsFetchError.pb), { customMessage: `CRS relative Url: ${configServiceRelativeUrl} Error: ${error}` }) }));\r\n }\r\n }\r\n // Get config from CDN when config service is not enabled or it returned null or invalid response.\r\n const cdnConfig = yield downloadMergeConfig(configIndexHref);\r\n if (cdnConfig) {\r\n addConfigToConfigMap(configIndexHref, cdnConfig);\r\n mergedConfigsMap.set(configIndexHref, cdnConfig);\r\n // Dev scenario: if config service is not enabled and we got configs from CDN, do not log app error.\r\n if (enableConfigService) {\r\n logger.error(Object.assign(Object.assign({}, ConfigsDownloadedByCdn), { message: \"Configs served from CDN after CRS fetch failed\", pb: Object.assign(Object.assign({}, ConfigsDownloadedByCdn.pb), { customMessage: `Relative Url: ${configIndexHref} CRS Params: ${configServiceParameters}` }) }));\r\n }\r\n }\r\n return mergedConfigsMap;\r\n });\r\n}\r\n/**\r\n * Set configMap object with appropriate values.\r\n * @param configIndexHref example: cms/api/amp/experienceConfigIndex/AfCDeG\r\n * @param config object of ExperienceConfigWrapper\r\n */\r\nfunction addConfigToConfigMap(configIndexHref, config) {\r\n config.storageTimestamp = stalenessCheckTimestamp;\r\n config.configIndexHref = configIndexHref;\r\n // Set configMap for future reference.\r\n configMap.set(configIndexHref, config);\r\n}\r\n/**\r\n * Get the config over the network, merge and return.\r\n * @private\r\n * @param {string} relativeUrl - Experience Index document relative url.\r\n * @return Promise\r\n */\r\nfunction downloadMergeConfig(relativeUrl) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const experienceIndex = yield downloadFile(cdnConfigBaseUrl, relativeUrl, false);\r\n const configPaths = resolveConfigIndex(experienceIndex);\r\n const configObjects = yield downloadExperienceConfig(cdnConfigBaseUrl, configPaths);\r\n const config = mergeConfig(configObjects);\r\n config.experienceType = experienceIndex.experienceType;\r\n return config;\r\n });\r\n}\r\n/**\r\n * Returns true if cached config and network fetched config properties are exactly same else false.\r\n * @private\r\n * @param {ExperienceConfigWrapper} cachedConfig - config fetched from in memory object.\r\n * @param {ExperienceConfigWrapper} networkConfig - config fetched over the network.\r\n * @return boolean\r\n */\r\nexport function areConfigsEqual(cachedConfig, networkConfig) {\r\n if (!cachedConfig || !networkConfig) {\r\n return false;\r\n }\r\n // Performs a deep comparison between two configs. Should only compare properties section\r\n return isEqual(cachedConfig.properties, networkConfig.properties);\r\n}\r\n/**\r\n * Given an array of config urls, this function downloads them in parallel and returns a promise.\r\n * @private\r\n * @param {string} baseConfigUrl - base config url depends on implementation\r\n * @param {string[]} hrefs - Array of configuration relative urls\r\n * @return Promise\r\n */\r\nfunction downloadExperienceConfig(baseConfigUrl, hrefs) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const promiseArray = [];\r\n hrefs.forEach(href => {\r\n promiseArray.push(downloadFile(baseConfigUrl, href, false));\r\n });\r\n return yield Promise.all(promiseArray);\r\n });\r\n}\r\n/**\r\n * downloads file from CMS given the relative url\r\n * @private\r\n * @param {string} relativeUrl - relative url of the document\r\n * @param {boolean} isCrsFetch - Is this CRS fetch\r\n * @return Promise returns generic Type object wrapped in Promise\r\n */\r\nfunction downloadFile(baseConfigUrl, relativeUrl, isCrsFetch) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const cachedValue = downloadMap[relativeUrl];\r\n if (cachedValue) {\r\n return cachedValue;\r\n }\r\n const cachedPromise = donwloadPromiseMap[relativeUrl];\r\n if (cachedPromise) {\r\n return cachedPromise;\r\n }\r\n const url = new URL(`${relativeUrl}${baseConfigUrl.search}`, baseConfigUrl);\r\n const fetchUrl = url.toString();\r\n const resultPromise = fetch(fetchUrl)\r\n .then(response => {\r\n if (response.ok) {\r\n const json = response.json();\r\n downloadMap[relativeUrl] = json;\r\n delete donwloadPromiseMap[relativeUrl];\r\n return json;\r\n }\r\n let errorMessage = \"\";\r\n if (isCrsFetch) {\r\n const crsVersion = response.headers.get(\"X-Crs-BuildVersion\") || \"\";\r\n const msedgeRef = response.headers.get(\"x-msedge-ref\") || \"\";\r\n errorMessage = `msedge ref: ${msedgeRef} Status: ${response.status}, Status Text: ${response.statusText}, Url: ${fetchUrl} and CRS Version: ${crsVersion}`;\r\n logger.error(Object.assign(Object.assign({}, ConfigCrsFetchNon200Response), { message: \"CRS sent non-200 response\", pb: Object.assign(Object.assign({}, ConfigCrsFetchNon200Response.pb), { customMessage: errorMessage }) }));\r\n }\r\n else {\r\n errorMessage = `Status: ${response.status}, Status Text: ${response.statusText}, Url: ${fetchUrl}`;\r\n logger.error(Object.assign(Object.assign({}, ConfigCdnFetchNon200Response), { message: \"Cdn config fetch received non-200 response\", pb: Object.assign(Object.assign({}, ConfigCdnFetchNon200Response.pb), { customMessage: errorMessage }) }));\r\n }\r\n return Promise.resolve();\r\n });\r\n donwloadPromiseMap[relativeUrl] = resultPromise;\r\n return resultPromise;\r\n });\r\n}\r\n/**\r\n * Function checks if ConfigService is enabled.\r\n * @returns true if supported else false.\r\n */\r\nexport function useConfigService() {\r\n const param = environment.getQueryParameter(\"enableConfigService\");\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n // PCS flag to turn on/off ConfigService.\r\n // When enableConfigService = false, it gets configs from CDN and merge at client side.\r\n return environment.enableConfigService;\r\n}\r\n/**\r\n * Function that returns maxDepth if exists in query string else default value.\r\n * This is the max depth of the config tree.\r\n * @returns Depth of config in tree.\r\n */\r\nfunction getConfigRetrievalMaxDepth() {\r\n const param = environment.getQueryParameter(\"maxDepth\");\r\n if (param) {\r\n return param;\r\n }\r\n // PCS flag for maxDepth\r\n if (environment.featureFlags\r\n && environment.featureFlags.crsMaxDepth) {\r\n return environment.featureFlags.crsMaxDepth;\r\n }\r\n // Config service to use this default to parse depth of config tree.\r\n return \"10\";\r\n}\r\n/**\r\n * Function checks if url has any dev only query string params\r\n * @returns true if exist else false.\r\n */\r\nfunction containsDevOnlyQueryParameters() {\r\n const item = environment.getQueryParameter(\"item\");\r\n if (item) {\r\n return true;\r\n }\r\n const segments = environment.getQueryParameter(\"pcsonly\");\r\n if (segments) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * For testing purpose to access what has been set for configServiceParameters\r\n */\r\nexport function getConfigServiceParameters() {\r\n return configServiceParameters;\r\n}\r\n/**\r\n * Checks if the resolved config is of the desired experience type, and updates the experienceconfigmap\r\n * @param resolvedConfig Resolved Config\r\n */\r\nexport function checkForExperienceConfigs(experienceTypes, resolvedConfig) {\r\n for (const experienceType of experienceTypes) {\r\n if (!experienceConfigMap.has(experienceType)\r\n && resolvedConfig\r\n && resolvedConfig.experienceType\r\n && resolvedConfig.experienceType.toLowerCase() === experienceType) {\r\n if (experienceType === ExperienceTypes.River) {\r\n if (resolvedConfig.properties.isMyFeed && !experienceConfigMap.has(RiverConfigType.MyFeed)) {\r\n experienceConfigMap.set(RiverConfigType.MyFeed, resolvedConfig);\r\n continue;\r\n }\r\n const stripeTopStories = get(resolvedConfig, \"properties.templateCategoryFiltersMap.myFeed\");\r\n if (stripeTopStories && !experienceConfigMap.has(RiverConfigType.StripeMyFeed)) {\r\n experienceConfigMap.set(RiverConfigType.StripeMyFeed, resolvedConfig);\r\n }\r\n }\r\n else {\r\n experienceConfigMap.set(experienceType, resolvedConfig);\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * Add experience configs from Git to subscribable map.\r\n */\r\nfunction addConfigToExperienceConfigMap() {\r\n if (!experienceGitConfigMap) {\r\n return;\r\n }\r\n for (const experienceType of experienceConfigsNeeded) {\r\n // if we've already found the type, continue with next type\r\n if (experienceConfigMap.has(experienceType)) {\r\n continue;\r\n }\r\n const gitConfigs = experienceGitConfigMap.get(experienceType);\r\n if (!gitConfigs) {\r\n continue;\r\n }\r\n for (const gitConfig of gitConfigs) {\r\n if (!gitConfig || !gitConfig.properties) {\r\n return;\r\n }\r\n const gitResolvedConfig = {\r\n properties: gitConfig.properties,\r\n experienceType,\r\n _name: experienceType,\r\n typeVersion: \"Git\"\r\n };\r\n if (experienceType === ExperienceTypes.River) {\r\n // There can definitely be more than one river. So use the .isMyFeed property to distinguish\r\n // the main/default feed instance. Once we found it continue processing in case we also need to\r\n // find the stripe myfeed river\r\n if (gitResolvedConfig.properties.isMyFeed && !experienceConfigMap.has(RiverConfigType.MyFeed)) {\r\n experienceConfigMap.set(RiverConfigType.MyFeed, gitResolvedConfig);\r\n continue;\r\n }\r\n // Identify the stripe myfeed river\r\n const stripeTopStories = get(gitResolvedConfig.properties, \"templateCategoryFiltersMap.myFeed\");\r\n if (stripeTopStories && !experienceConfigMap.has(RiverConfigType.StripeMyFeed)) {\r\n experienceConfigMap.set(RiverConfigType.StripeMyFeed, gitResolvedConfig);\r\n }\r\n }\r\n else {\r\n // HACK: if there are multiple configs of the same type, this map will only contain one of them.\r\n // I guess we must not care maybe because most of the config type subscriptions we have are usually\r\n // singletons on a page?? Also note that we can break out of the loop since we only need one instance.\r\n experienceConfigMap.set(experienceType, gitResolvedConfig);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * Returns the config for the given experience type\r\n * @param experienceType Experience Type requested\r\n * @returns merged config for experience type\r\n */\r\nexport function getExperienceTypeConfig(experienceType) {\r\n return experienceConfigMap.get(experienceType);\r\n}\r\n/**\r\n * Returns config from configMap.\r\n * @returns merged config from cache.\r\n */\r\nexport function getConfigFromMap(configIndexHref) {\r\n return configMap.get(configIndexHref) || undefined;\r\n}\r\n/**\r\n * Function to clear internal state map\r\n * @public\r\n * @void\r\n */\r\nexport function clearInternalState() {\r\n configMap.clear();\r\n configTreePromiseMap.clear();\r\n downloadMap.clear();\r\n donwloadPromiseMap.clear();\r\n}\r\n//# sourceMappingURL=WebWorkerResolver.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, environment } from \"../wwCommon\";\r\nimport { PlatformType } from \"@msnews/config-data-types\";\r\nimport { stringHasData } from \"./Utility\";\r\n/**\r\n * Sets target scope for current request.\r\n */\r\nexport function getTargetScope() {\r\n var _a;\r\n const { apptype, audienceMode, browser, deviceFormFactor, isGitConfigs, ocid, os, pcsPagetype: pageType, currentFlights, pcsLocale, pcsDomain } = environment;\r\n const currentRequestTargetScope = {\r\n audienceMode,\r\n browser,\r\n deviceFormFactor,\r\n domain: pcsDomain,\r\n locale: pcsLocale ? pcsLocale : environment.getLocaleObject(),\r\n ocid,\r\n os,\r\n platform: PlatformType.Web,\r\n pageType\r\n };\r\n const flights = environment.currentFlights;\r\n if (stringHasData(flights)) {\r\n currentRequestTargetScope.pageExperiments = flights.split(\",\");\r\n }\r\n // Hacky temporary flight addition for hub windows git scenario\r\n if (apptype === AppType.Hub\r\n && ((_a = environment.getQueryParameter(\"ocid\")) === null || _a === void 0 ? void 0 : _a.toLowerCase().substr(0, 3)) === \"win\"\r\n && isGitConfigs) {\r\n const currentPageExperiments = currentRequestTargetScope.pageExperiments || [];\r\n currentRequestTargetScope.pageExperiments = currentPageExperiments.concat(\"prg-iswin-hub\");\r\n }\r\n return currentRequestTargetScope;\r\n}\r\n//# sourceMappingURL=Variables.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Headers used for OneService requests\r\n */\r\nexport const oneServiceHeaders = {\r\n activityId: \"x-client-activityid\",\r\n authorization: \"Authorization\"\r\n};\r\n/**\r\n * used query string params in OneService requests\r\n */\r\nexport const oneServiceQueryStringKeys = {\r\n activityId: \"activityId\",\r\n apiKey: \"apikey\",\r\n complexInfoPaneEnabled: \"cipenabled\",\r\n contentType: \"contentType\",\r\n delta: \"delta\",\r\n disableTypeSerialization: \"DisableTypeSerialization\",\r\n infopaneCount: \"infopaneCount\",\r\n fdhead: \"fdhead\",\r\n filter: \"$filter\",\r\n ids: \"ids\",\r\n location: \"location\",\r\n market: \"market\",\r\n ocid: \"ocid\",\r\n parentContentId: \"parent-content-id\",\r\n parentNamespace: \"parent-ns\",\r\n parentTitle: \"parent-title\",\r\n query: \"query\",\r\n queryType: \"queryType\",\r\n qScope: \"qscope\",\r\n responseSchema: \"responseSchema\",\r\n select: \"$select\",\r\n signInCookieName: \"scn\",\r\n skip: \"$skip\",\r\n source: \"source\",\r\n timeOut: \"timeOut\",\r\n top: \"$top\",\r\n user: \"user\",\r\n wrapOData: \"wrapodata\",\r\n feedLayoutRequestType: \"t\"\r\n};\r\n//# sourceMappingURL=OneServiceConstants.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { perfMarker, WebWorkerMessageId } from \"../wwCommon\";\r\nimport { experienceConfigMap } from \"../wwResolver\";\r\n/** Default OCID for some OneService requests */\r\nexport const defaultOneServiceOcid = \"Peregrine\";\r\nexport var OneServiceResponseSchema;\r\n(function (OneServiceResponseSchema) {\r\n OneServiceResponseSchema[\"CardView\"] = \"cardview\";\r\n OneServiceResponseSchema[\"FlatView\"] = \"flatview\";\r\n})(OneServiceResponseSchema || (OneServiceResponseSchema = {}));\r\n/**\r\n * Reformats the given guid without dashes to a guid string with dashes.\r\n * @param {string} guid - The guid without dashes.\r\n * @returns The reformatted GUI with dashes.\r\n */\r\nexport function tryReformatGuid(guid) {\r\n if (guid && guid.length === 32) {\r\n // use a regex to extract the specific substrings to reformat the guid\r\n const matches = guid.match(/(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})/i);\r\n if (matches) {\r\n // join all the captured groups from 1-5 to format the final guid string\r\n guid = matches.slice(1).join(\"-\");\r\n }\r\n }\r\n return guid;\r\n}\r\n/**\r\n * Sets the search param if value is present.\r\n * NOTE: this function will not set the search param if value is undefined, null, false, empty strings or 0.\r\n * @param urlSearchParamsHelper URLSearchParamsHelper object\r\n * @param name the name of the search param\r\n * @param value the value of the search param\r\n */\r\nexport function trySetSearchParam(urlSearchParamsHelper, name, value) {\r\n if (!value) {\r\n return;\r\n }\r\n urlSearchParamsHelper.set(name, value);\r\n}\r\n/** Adds start perf marker name for message id */\r\nexport function addStartPerfMarker(messageId) {\r\n const markerPrefix = messageId === WebWorkerMessageId.MyFeed ? \"MyFeed\" : messageId;\r\n perfMarker(`${markerPrefix}FetchStart`);\r\n}\r\n/** Adds end perf marker name for message id */\r\nexport function addEndPerfMarker(messageId) {\r\n const markerPrefix = messageId === WebWorkerMessageId.MyFeed ? \"MyFeed\" : messageId;\r\n perfMarker(`${markerPrefix}FetchEnd`);\r\n}\r\n/** Subscribes to the given config and returns a promise that resolves when the config is ready */\r\nexport function subscribeToExperienceConfig(experienceType) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n let experienceConfigResolver;\r\n const experienceConfigReadyPromise = new Promise((resolve) => { experienceConfigResolver = resolve; });\r\n const experienceConfigSubscription = experienceConfigMap.subscribe(experienceType, () => {\r\n experienceConfigSubscription.unsubscribe();\r\n experienceConfigResolver();\r\n });\r\n return experienceConfigReadyPromise;\r\n });\r\n}\r\n//# sourceMappingURL=Common.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { environment, ExperienceTypes, AppType, registerCommandMessageHandler, WebWorkerMessageId, webWorkerCache } from \"../wwCommon\";\r\nimport { get } from \"lodash-es\";\r\nimport { getExperienceTypeConfig } from \"../wwResolver\";\r\nimport { oneServiceHeaders } from \"./OneServiceConstants\";\r\nimport { tryReformatGuid } from \"./Common\";\r\n/** The aadToken QS key */\r\nexport const aadTokenQsKey = \"stn\";\r\n/** The aadToken QS value */\r\nexport const aadTokenQsVal = \"aad\";\r\nlet aadToken;\r\n/** Registers command handler for Aad Token message */\r\nexport function registerOneServiceTokenListener() {\r\n registerCommandMessageHandler(WebWorkerMessageId.AuthToken, (token) => {\r\n aadToken = token;\r\n webWorkerCache.set(WebWorkerMessageId.AuthToken, token);\r\n });\r\n}\r\n/**\r\n * Gets common headers used in service requests to OneService\r\n * @param useEnterpriseHeaders true if enterprise headers should be forced for the request\r\n * @returns The common headers to use on OneService requests.\r\n */\r\nexport function getOneServiceHeaders(useEnterpriseHeaders = shouldMakeEnterpriseRequest()) {\r\n const headers = {};\r\n if (aadToken && useEnterpriseHeaders) {\r\n headers[oneServiceHeaders.authorization] = `Bearer ${aadToken}`;\r\n }\r\n return headers;\r\n}\r\n/**\r\n * Returns true if enterprise request should be made for the river call only\r\n *\r\n * @export\r\n * @returns {boolean}\r\n */\r\nexport function shouldMakeEnterpriseRequest() {\r\n return !!getEntryPointConfigSetting(\"properties.useEnterpriseCompliance\");\r\n}\r\n/**\r\n * Returns true if enterprise domain should be used for the river call only\r\n *\r\n * @export\r\n * @returns {boolean}\r\n */\r\nexport function shouldUseEnterpriseDomain() {\r\n if (!shouldMakeEnterpriseRequest()) {\r\n return false;\r\n }\r\n return !!getEntryPointConfigSetting(\"properties.useEnterpriseDomain\");\r\n}\r\n/**\r\n * Gets headers used in service requests to OneService /feed and /feed/me endpoints\r\n * @param useEnterpriseHeaders true if enterprise headers should be forced for the request\r\n * @returns The headers to use on the OneService request.\r\n */\r\nexport function getOneServiceFeedCallHeaders(useEnterpriseHeaders) {\r\n const headers = getOneServiceHeaders(useEnterpriseHeaders);\r\n const activityId = environment.activityId;\r\n if (environment.sendFeedCallActivityIdInHeader && activityId) {\r\n headers[oneServiceHeaders.activityId] = tryReformatGuid(activityId);\r\n }\r\n return headers;\r\n}\r\n/** Gets the entry point config */\r\nfunction getEntryPointConfigSetting(path) {\r\n const entryPointConfigName = environment.apptype === AppType.EdgeChromium ? ExperienceTypes.EntryPointEdgeNext : ExperienceTypes.EntryPoint;\r\n const entryPointConfig = getExperienceTypeConfig(entryPointConfigName);\r\n if (!entryPointConfig) {\r\n return;\r\n }\r\n return get(entryPointConfig, path);\r\n}\r\n//# sourceMappingURL=OneServiceRequest.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, ExperienceTypes, RiverConfigType, UrlSearchParamsHelper, WebWorkerMessageId, environment, logger, ocidMapping, registerCommandMessageHandler, scnMapping, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { FetchOneServiceMyFeedFailed, OneServiceFeedResponseEmpty, RiverConfigIsNull } from \"../AppErrors\";\r\nimport { aadTokenQsKey, aadTokenQsVal, getOneServiceFeedCallHeaders, shouldMakeEnterpriseRequest, shouldUseEnterpriseDomain } from \"./OneServiceRequest\";\r\nimport { addEndPerfMarker, addStartPerfMarker, OneServiceResponseSchema, tryReformatGuid, trySetSearchParam } from \"./Common\";\r\nimport { oneServiceQueryStringKeys } from \"./OneServiceConstants\";\r\nimport { get } from \"lodash-es\";\r\nimport { experienceConfigMap, getExperienceTypeConfig } from \"../wwResolver\";\r\n/** Path inside One Service to retrieve content when feed id is not present */\r\nconst feedLayoutUrlPath = \"MSN/FeedLayout\";\r\n/** Path inside One Service to retrieve content when feed id is not present */\r\nconst myFeedUrlPath = \"MSN/Feed/me\";\r\n/** Path inside One Service to retrieve content when feed id is present */\r\nconst xFeedUrlPath = \"MSN/Feed\";\r\nlet feedDisplaySetting;\r\n/**\r\n * Registers command message handler for feed display setting. Used only in Anaheim\r\n */\r\nexport function registerFeedDisplaySettingListener() {\r\n registerCommandMessageHandler(WebWorkerMessageId.FeedDisplaySetting, (setting) => {\r\n webWorkerCache.set(WebWorkerMessageId.FeedDisplaySetting, setting);\r\n });\r\n}\r\n/**\r\n * Registers OneServiceFeed tasks\r\n */\r\nexport function registerOneServiceFeedTasks() {\r\n if (!environment.isPrefetchEnabled) {\r\n return;\r\n }\r\n registerCommandMessageHandler(WebWorkerMessageId.UpdateMyFeed, updateOneServiceFeeds);\r\n subscribeToFeedConfigs();\r\n}\r\n/**\r\n * Registers OneServiceFeed tasks for Edge Chromium\r\n */\r\nexport function registerOneServiceFeedTasksForEdgeChromium() {\r\n if (!environment.isPrefetchEnabled) {\r\n return;\r\n }\r\n registerCommandMessageHandler(WebWorkerMessageId.UpdateMyFeed, updateOneServiceFeeds);\r\n const messagesToWait = [WebWorkerMessageId.FeedDisplaySetting];\r\n if (environment.isEnterpriseCompliantNTP) {\r\n messagesToWait.push(WebWorkerMessageId.AuthToken);\r\n }\r\n const subscription = webWorkerCache.subscribeMultiple(messagesToWait, (data) => {\r\n subscription.unsubscribe();\r\n subscribeToFeedConfigs(data);\r\n });\r\n}\r\n/** Subscribes to feed configs and fetches feed when configs are available */\r\nfunction subscribeToFeedConfigs(data) {\r\n if (data && Array.isArray(data) && data.length) {\r\n // First subscription is for feed display setting\r\n feedDisplaySetting = data[0];\r\n }\r\n const riverConfigsToWait = [RiverConfigType.MyFeed];\r\n const stripeConfigsToWait = [RiverConfigType.StripeMyFeed];\r\n if (environment.isEnterpriseCompliantNTP) {\r\n riverConfigsToWait.push(ExperienceTypes.EntryPointEdgeNext);\r\n stripeConfigsToWait.push(ExperienceTypes.EntryPointEdgeNext);\r\n }\r\n const myFeedConfigSubscription = experienceConfigMap.subscribeMultiple(riverConfigsToWait, () => {\r\n myFeedConfigSubscription.unsubscribe();\r\n fetchRiverFeed(environment.cacheBypassValue);\r\n });\r\n const stripeConfigSubscription = experienceConfigMap.subscribeMultiple(stripeConfigsToWait, () => {\r\n stripeConfigSubscription.unsubscribe();\r\n fetchStripeFeed(environment.cacheBypassValue);\r\n });\r\n}\r\n/**\r\n * Makes fetch call for OneService my feed and marks cache state as fetching item\r\n * @param cacheBypassValue - value used (if not null) to bypass http cache on request\r\n */\r\nexport function fetchRiverFeed(cacheBypassValue) {\r\n if (!canFetchFeed()) {\r\n return;\r\n }\r\n const riverConfig = getExperienceTypeConfig(RiverConfigType.MyFeed);\r\n // If configs have await and we still didn't get river config, don't make feed call in web worker.\r\n if (!riverConfig) {\r\n logger.error(Object.assign(Object.assign({}, RiverConfigIsNull), { message: `fetchOneService-${WebWorkerMessageId.MyFeed}: River config is null when it is expecting to be not null.` }));\r\n return;\r\n }\r\n fetchOneServiceFeed(riverConfig, WebWorkerMessageId.MyFeed, cacheBypassValue);\r\n}\r\n/**\r\n * Take action to re-fetch one service my feed.\r\n * @param cacheBypassValue - value used (if not null) to bypass http cache on request\r\n */\r\nexport function updateOneServiceFeeds(cacheBypassValue) {\r\n webWorkerCache.delete(WebWorkerMessageId.MyFeed);\r\n webWorkerCache.delete(WebWorkerMessageId.StripeMyFeed);\r\n // Enterprise NTP auth token might have expired when these calls are made,\r\n // to be safe, avoid making API calls\r\n if (environment.isEnterpriseCompliantNTP) {\r\n return;\r\n }\r\n fetchRiverFeed(cacheBypassValue);\r\n fetchStripeFeed(cacheBypassValue);\r\n}\r\n/**\r\n * Fetches top stories data for stripe view\r\n * @param cacheBypassValue - value used (if not null) to bypass http cache on request\r\n */\r\nfunction fetchStripeFeed(cacheBypassValue) {\r\n if (!canFetchFeed()) {\r\n return;\r\n }\r\n const stripeRiverConfig = getExperienceTypeConfig(RiverConfigType.StripeMyFeed);\r\n if (!stripeRiverConfig) {\r\n // Stripe view is not enabled for all app-types, don't log an error if the config is not found\r\n return;\r\n }\r\n fetchOneServiceFeed(stripeRiverConfig, WebWorkerMessageId.StripeMyFeed, cacheBypassValue);\r\n}\r\n/**\r\n * Makes fetch call for OneService my feed and marks cache state as fetching item\r\n * @param riverConfig - the river configuration to use for generating the url\r\n * @param cacheBypassValue - value used (if not null) to bypass http cache on request\r\n */\r\nfunction fetchOneServiceFeed(riverConfig, messageId, cacheBypassValue) {\r\n addStartPerfMarker(messageId);\r\n const url = getRequestURL(riverConfig, cacheBypassValue);\r\n if (!url) {\r\n onFetchComplete(messageId);\r\n return;\r\n }\r\n const init = {\r\n credentials: \"include\",\r\n method: \"GET\",\r\n headers: getOneServiceFeedCallHeaders()\r\n };\r\n let sessionId;\r\n const feedUrl = url.toString();\r\n const tabbedInfopaneQueryString = (url.searchParams.get(oneServiceQueryStringKeys.feedLayoutRequestType) || \"\").toLowerCase();\r\n const isTabbedInfopaneResponse = tabbedInfopaneQueryString === \"tabriver\" || tabbedInfopaneQueryString === \"tabs\";\r\n const responseSchema = url.searchParams.get(oneServiceQueryStringKeys.responseSchema);\r\n return fetch(feedUrl, init).then(response => {\r\n if (!response.ok) {\r\n throw `OneServiceFeed call for ${messageId} failed with status code ${response.status}`;\r\n }\r\n if (response.headers) {\r\n sessionId = response.headers.get(\"ddd-session-id\");\r\n }\r\n // Handle No-Content response\r\n if (response.status === 204) {\r\n // set response as per responseSchema to use the right property to check and log error in the then block below\r\n if (responseSchema === OneServiceResponseSchema.CardView) {\r\n return isTabbedInfopaneResponse ? [{ subCards: [] }] : { subCards: [] };\r\n }\r\n else {\r\n return { feedItems: [] };\r\n }\r\n }\r\n return response.json();\r\n }).then((data) => {\r\n let feedItems;\r\n if (responseSchema === OneServiceResponseSchema.CardView) {\r\n feedItems = isTabbedInfopaneResponse ? (data[0] && data[0].subCards) : data.subCards;\r\n }\r\n else {\r\n feedItems = data.feedItems;\r\n }\r\n if (!Array.isArray(feedItems) || !feedItems.length) {\r\n logger.error(Object.assign(Object.assign({}, OneServiceFeedResponseEmpty), { message: \"OneService response empty\", pb: Object.assign(Object.assign({}, OneServiceFeedResponseEmpty.pb), { fetchNetworkResponse: {\r\n activityId: environment.activityId,\r\n requestUrl: feedUrl\r\n } }) }));\r\n }\r\n onFetchComplete(messageId, {\r\n feedData: data,\r\n sessionId,\r\n isTabbedInfopaneResponse,\r\n responseSchema\r\n });\r\n }).catch(reason => {\r\n logger.error(Object.assign(Object.assign({}, FetchOneServiceMyFeedFailed), { message: \"OneService MyFeed fetch failed\", pb: Object.assign(Object.assign({}, FetchOneServiceMyFeedFailed.pb), { customMessage: `Error: ${reason}. Url: [${feedUrl}]` }) }));\r\n onFetchComplete(messageId);\r\n });\r\n}\r\n/**\r\n * Marks cache state complete for OneService my feed. Responds to any pending messages. And triggers the content preview fetch.\r\n * @param response - The response\r\n */\r\nfunction onFetchComplete(messageId, response = null) {\r\n addEndPerfMarker(messageId);\r\n webWorkerCache.set(messageId, { payload: response });\r\n sendMessage({ id: messageId, fetched: true, payload: response });\r\n}\r\n/**\r\n * Returns the feed url.\r\n * @param cacheBypassValue - value used (if > 0) to bypass http cache on request\r\n * @returns - The url with required query params\r\n */\r\nfunction getRequestURL(riverConfig, cacheBypassValue) {\r\n const isEnterpriseRequest = shouldMakeEnterpriseRequest();\r\n const initialRequest = get(riverConfig, \"properties.cardProviderConfig.initialRequest\");\r\n const { feedId, feedLayoutRequestType } = initialRequest || {};\r\n let requestPath;\r\n if (feedLayoutRequestType) {\r\n requestPath = feedLayoutUrlPath;\r\n }\r\n else if (feedId) {\r\n requestPath = xFeedUrlPath;\r\n }\r\n else {\r\n requestPath = myFeedUrlPath;\r\n }\r\n const urlBase = shouldUseEnterpriseDomain() ? environment.enterpriseServiceUrlBase : environment.feedServiceUrlBase;\r\n const feedUrl = new URL(requestPath, urlBase);\r\n const urlSearchParams = new UrlSearchParamsHelper(urlBase.search);\r\n setDefaultSearchParams(urlSearchParams);\r\n // When tabbed infopane is active, we use \"/FeedLayout\" which doesn't accept the queryType param\r\n if (!feedLayoutRequestType) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.queryType, \"myfeed\");\r\n if (environment.latitude && environment.longitude) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.location, `${environment.latitude}|${environment.longitude}`);\r\n }\r\n }\r\n else {\r\n urlSearchParams.set(\"t\", feedLayoutRequestType);\r\n }\r\n if (cacheBypassValue > 0) {\r\n urlSearchParams.set(\"cbypass\", cacheBypassValue.toString());\r\n }\r\n if (isEnterpriseRequest) {\r\n urlSearchParams.set(aadTokenQsKey, aadTokenQsVal);\r\n }\r\n if (!initialRequest) {\r\n feedUrl.search = urlSearchParams.toString();\r\n return feedUrl;\r\n }\r\n if (initialRequest.infopaneItemCount) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.infopaneCount, initialRequest.infopaneItemCount);\r\n if (initialRequest.complexInfopaneEnabled === false) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.complexInfoPaneEnabled, \"false\");\r\n }\r\n }\r\n // Update response schema query string when faltview is disabled via config\r\n if (initialRequest.disableFlatViewResponse) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.responseSchema, OneServiceResponseSchema.CardView);\r\n }\r\n if (initialRequest.useDelta) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.delta, \"true\");\r\n }\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.ids, feedId);\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.ocid, initialRequest.ocid);\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.contentType, initialRequest.contentType);\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.top, initialRequest.count);\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.timeOut, initialRequest.timeoutMs);\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.query, initialRequest.query);\r\n feedUrl.search = urlSearchParams.toString();\r\n return feedUrl;\r\n}\r\n/**\r\n * Gets the feed url with default search parameters\r\n * @param urlSearchParamsHelper search params\r\n */\r\nfunction setDefaultSearchParams(urlSearchParamsHelper) {\r\n urlSearchParamsHelper.set(oneServiceQueryStringKeys.apiKey, environment.oneServiceApiKey)\r\n .set(oneServiceQueryStringKeys.ocid, ocidMapping[environment.pagetype] || \"Peregrine\")\r\n .set(oneServiceQueryStringKeys.market, environment.locale)\r\n .set(oneServiceQueryStringKeys.responseSchema, OneServiceResponseSchema.FlatView)\r\n .set(oneServiceQueryStringKeys.wrapOData, \"false\")\r\n .set(oneServiceQueryStringKeys.disableTypeSerialization, \"true\")\r\n .set(oneServiceQueryStringKeys.timeOut, \"1000\") // Default to 1000\r\n .set(oneServiceQueryStringKeys.top, \"30\"); // Default to 30\r\n if (!environment.sendFeedCallActivityIdInHeader) {\r\n trySetSearchParam(urlSearchParamsHelper, oneServiceQueryStringKeys.activityId, tryReformatGuid(environment.activityId));\r\n }\r\n trySetSearchParam(urlSearchParamsHelper, oneServiceQueryStringKeys.user, environment.userId);\r\n trySetSearchParam(urlSearchParamsHelper, oneServiceQueryStringKeys.fdhead, environment.currentFlights);\r\n if (environment.signedIn) {\r\n urlSearchParamsHelper.set(oneServiceQueryStringKeys.signInCookieName, scnMapping[environment.pagetype] || \"ANON\");\r\n }\r\n}\r\n/** Checks and returns a boolean indicating if the feed call can be made */\r\nfunction canFetchFeed() {\r\n if (environment.apptype !== AppType.EdgeChromium) {\r\n return true;\r\n }\r\n return feedDisplaySetting === \"always\";\r\n}\r\n//# sourceMappingURL=OneServiceFeed.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * used query string params in Wpo requests\r\n */\r\nexport const WpoQueryStringKeys = {\r\n activityId: \"activityId\",\r\n apiKey: \"apikey\",\r\n audienceMode: \"audienceMode\",\r\n bypassTrigger: \"bypass_trigger\",\r\n complexInfoPaneEnabled: \"cipenabled\",\r\n contentType: \"contentType\",\r\n delta: \"delta\",\r\n disableTypeSerialization: \"DisableTypeSerialization\",\r\n infopaneCount: \"infopaneCount\",\r\n fdhead: \"fdhead\",\r\n feedLayoutRequestType: \"t\",\r\n filter: \"$filter\",\r\n ids: \"ids\",\r\n interestIds: \"interestids\",\r\n location: \"location\",\r\n market: \"market\",\r\n ocid: \"ocid\",\r\n pageConfiguration: \"pgc\",\r\n parentContentId: \"parent-content-id\",\r\n parentNamespace: \"parent-ns\",\r\n parentTitle: \"parent-title\",\r\n queryQ: \"q\",\r\n query: \"query\",\r\n queryType: \"queryType\",\r\n qScope: \"qscope\",\r\n responseSchema: \"responseschema\",\r\n select: \"$select\",\r\n session: \"session\",\r\n signInCookieName: \"scn\",\r\n skip: \"$skip\",\r\n source: \"source\",\r\n timeOut: \"timeOut\",\r\n top: \"$top\",\r\n type: \"type\",\r\n user: \"user\",\r\n wrapOData: \"wrapodata\",\r\n wpoitems: \"wpoitems\",\r\n wpoPageId: \"wpopageid\",\r\n wpoSchema: \"wposchema\"\r\n};\r\n/** Api Key */\r\nexport const APIKey4Wpo = \"0QfOX3Vn51YCzitbLaRkTTBadtWpgTN8NZLW0C1SEM\";\r\n/** Feed URL Path */\r\nexport const WpoFeedUrlPath = \"optimizer/api/anaheim/feed\";\r\n/** Feed URL Path for flight prg-ewebcomp-os */\r\nexport const WpoOneServiceFeedUrlPath = \"news/feed/pages/wpodhp\";\r\n/** Feed endpoint path without pageId */\r\nexport const WpoOneServicePagePath = \"service/news/feed/pages/\";\r\n/** Page id for X-Feed(Interest) page */\r\nexport const WpoOneServiceXFeedPageId = \"wpoxfeed\";\r\n/** Page id for Myfeed(dhp) */\r\nexport const WpoOneServiceDhpPageId = \"wpodhp\";\r\n/** Page id for NTP */\r\nexport const WpoOneServiceNtpPageId = \"ntp\";\r\nexport const WpoOneServiceSegmentPath = \"news/feed/Segments\";\r\n/** Feed Base domain for flight prg-ewebcomp-os */\r\nexport const WpoOneServiceFeedBaseDomain = \"https://assets.msn.com\";\r\n/** WPO Base domain for OneService cluster */\r\nexport const WPOBaseDomainForOneServiceCluster = \"https://api.msn.com\";\r\n/** QS override value to use base request domain. For testing int environment changes. */\r\nexport const WPOUseBaseDomainQSOverride = \"wpo-usebasedomain\";\r\n/** PPE api domain and path */\r\nexport const WPOIntEnableKey = \"wpo-useintdomain\";\r\nexport const WpoIntServiceFeedBaseDomain = \"https://ppe-api.msn.com\";\r\nexport const WpoIntServiceMyfeedPath = \"news/feed/pages/wpodhp\";\r\nexport const WpoIntServiceXfeedPath = \"news/feed/pages/wpoxfeed\";\r\n/**\r\n * The fallback value to be used for infopane count query param if not present in market config.\r\n */\r\nexport const DefaultInfopaneCountValue = 17;\r\n/**\r\n * specific query string for kid mode.\r\n */\r\nexport const ocidForChildMode = \"msnkids\";\r\nexport const apiKeyForChildWpo = \"dy0rQcQaYj5cKZ2Cy0cdaRDJcC5maS5hPj9w2SbeRf\";\r\nexport function initBaseRequestParameters4Wpo(request, requestQueryParams) {\r\n requestQueryParams\r\n .set(WpoQueryStringKeys.wrapOData, \"false\")\r\n .set(WpoQueryStringKeys.disableTypeSerialization, \"true\")\r\n .set(WpoQueryStringKeys.queryType, \"myfeed\")\r\n .set(WpoQueryStringKeys.timeOut, `${getRequestTimeout(request)}`)\r\n .set(WpoQueryStringKeys.contentType, request.contentType)\r\n .set(WpoQueryStringKeys.apiKey, APIKey4Wpo);\r\n if (!request.disableQueryType) {\r\n requestQueryParams.set(WpoQueryStringKeys.queryType, \"myfeed\");\r\n }\r\n if (request.useDelta || request.sessionId) {\r\n requestQueryParams.set(WpoQueryStringKeys.delta, \"true\");\r\n if (request.sessionId) {\r\n requestQueryParams.set(WpoQueryStringKeys.session, request.sessionId);\r\n }\r\n }\r\n if (request.ocid) {\r\n requestQueryParams.set(WpoQueryStringKeys.ocid, request.ocid);\r\n }\r\n}\r\nfunction getRequestTimeout(request) {\r\n const { timeoutMs, query, customFeedTimeoutMs } = request;\r\n // Use custom feed specific timeout when loading a custom feed\r\n // to alow higher timeouts if required to OneService when fetching\r\n // feed data straight from bing\r\n return query && customFeedTimeoutMs ? customFeedTimeoutMs : timeoutMs;\r\n}\r\n//# sourceMappingURL=WpoService.js.map","// © Microsoft Corporation. All rights reserved.\r\nexport const ContentPreview = {\r\n dbName: \"wwContent\",\r\n storeName: \"Preview\",\r\n indexName: \"MyFeed\"\r\n};\r\nexport const SamAuctionCall = {\r\n dbName: \"SamAdData\",\r\n storeName: \"SamAuction\",\r\n indexName: \"CallData\"\r\n};\r\n// Used for ExP to improve Native Ads loading\r\nexport const ContentList = {\r\n dbName: \"AdsContent\",\r\n storeName: \"CmsLists\",\r\n indexName: \"FallbackAds\"\r\n};\r\nexport const MyBriefing = {\r\n myBriefingServiceEndpoint: \"/service/News/Briefing\",\r\n defaultOcid: \"Peregrine\"\r\n};\r\nexport const OneServiceMetadataType = {\r\n // infopane\r\n Infopane: \"infopane\",\r\n SportsMatch: \"SportsMatch\",\r\n WeatherSummary: \"WeatherSummary\",\r\n WeatherSummary_spotlight: \"WeatherSummary_spotlight\",\r\n TrafficDelays: \"TrafficDelays\",\r\n StockQuote: \"StockQuote\",\r\n ShoppingMerchantCategoryDeals: \"ShoppingMerchantCategoryDeals\",\r\n MyBriefRiverCard: \"toppicks\",\r\n TopStories: \"topStories\",\r\n Upsell: \"Upsell\"\r\n};\r\n//# sourceMappingURL=Constants.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { ImageFetchFailed } from \"../AppErrors\";\r\nimport { logger } from \"../wwCommon\";\r\n/**\r\n * Bing image resizer for content images.\r\n */\r\nconst BingThumbnailBaseUrl = \"//www.bing.com/th\";\r\n/**\r\n * Image size mapping for various content types.\r\n * Please Note: tall and double wide cards image sizes are not supported yet\r\n */\r\nexport const imageSizeMap = {\r\n ContentPreview: { width: 300, height: 174 },\r\n HalfPane: { width: 624, height: 350 },\r\n HeadToHead: [{ width: 312, height: 350 }, { width: 312, height: 350 }],\r\n Mosaic: [{ width: 312, height: 350 }, { width: 312, height: 175 }, { width: 312, height: 175 }],\r\n Triptych: [{ width: 208, height: 350 }, { width: 208, height: 350 }, { width: 208, height: 350 }],\r\n Image_1x1y: { width: 90, height: 90 },\r\n _2x_3y: { width: 612, height: 462 } // Windows feed Infopane image size\r\n};\r\n/**\r\n * Fetches the image for given image metadata and image size.\r\n * @param imageMetadata - The image metadata\r\n * @param imageSize - The image size\r\n * @param options - Options for the image fetch\r\n */\r\nexport function fetchImage(imageMetadata, imageSize, options) {\r\n options = options || {};\r\n const url = getImageUrl(imageMetadata, imageSize, options.overrideImageQuality);\r\n if (url) {\r\n fetch(url).then(response => {\r\n if (!response.ok) {\r\n throw (`Image call failed with status [${response.status}].`);\r\n }\r\n }).catch(reason => {\r\n const appError = options.appError || ImageFetchFailed;\r\n logger.error(Object.assign(Object.assign({}, appError), { message: \"Image fetch failed\", pb: Object.assign(Object.assign(Object.assign({}, appError.pb), options.appErrorPB), { customMessage: `Error: ${reason}. Url: ${url}` }) }));\r\n });\r\n }\r\n}\r\n/**\r\n * Returns the image url.\r\n * NOTE: Make sure the Url generated matches what will be requested in the main thread.\r\n * @param imageMetadata - The image metadata\r\n * @param imageSize - The image size\r\n * @param overrideImageQuality - Should we override the default Peregrine quality with a higher one?\r\n * @returns The image url.\r\n */\r\nfunction getImageUrl(imageMetadata, imageSize, overrideImageQuality) {\r\n var _a;\r\n if (!imageMetadata || (!imageMetadata.id && !imageMetadata.url) || !imageSize || !imageSize.height || !imageSize.width) {\r\n return null;\r\n }\r\n if ((_a = imageMetadata.url) === null || _a === void 0 ? void 0 : _a.includes(BingThumbnailBaseUrl)) {\r\n return getBingImageUrl(imageMetadata, imageSize, overrideImageQuality);\r\n }\r\n if (!imageMetadata.id) {\r\n imageMetadata.id = getImageIdFromUrl(imageMetadata.url);\r\n }\r\n let auxQsp = \"\";\r\n const { id, focalRegion } = imageMetadata;\r\n if (focalRegion) {\r\n const focusX = midPoint(focalRegion.x1, focalRegion.x2);\r\n const focusY = midPoint(focalRegion.y1, focalRegion.y2);\r\n if (focusX != null && focusY != null) {\r\n auxQsp += `&x=${focusX}&y=${focusY}`;\r\n }\r\n }\r\n const quality = overrideImageQuality ? 90 : 60;\r\n return `//img-s-msn-com.akamaized.net/tenant/amp/entityid/${id}?w=${imageSize.width}&h=${imageSize.height}&q=${quality}&m=6&f=jpg${auxQsp}&u=t`;\r\n}\r\n/**\r\n * Returns the Bing image url.\r\n * NOTE: Make sure the Url generated matches what will be requested in the main thread.\r\n * @param imageMetadata - The image metadata\r\n * @param imageSize - The image size\r\n * @returns The image url.\r\n */\r\nfunction getBingImageUrl(imageMetadata, imageSize, overrideImageQuality) {\r\n if (!imageMetadata || !imageSize || !imageSize.height || !imageSize.width) {\r\n return null;\r\n }\r\n const auxQsp = \"&rs=1\";\r\n const { url } = imageMetadata;\r\n const { height, width } = imageSize;\r\n // NOTE: I know these could be written directly in the return string, but defining them to call them out and easier updating.\r\n const quality = overrideImageQuality ? 90 : 60;\r\n const mode = 1;\r\n return `${url}&w=${width}&h=${height}&qlt=${quality}&c=${mode}${auxQsp}`;\r\n}\r\n/**\r\n * Returns the (integer) midpoint between two integers.\r\n * @param min - The min number\r\n * @param max - The max number\r\n * @returns The (integer) midpoint between two integers\r\n */\r\nfunction midPoint(min, max) {\r\n if (min != null && max != null) {\r\n return Math.floor((min + max) / 2);\r\n }\r\n}\r\n/**\r\n * Returns ImageId from URL\r\n * @param url - the url string\r\n */\r\nfunction getImageIdFromUrl(url) {\r\n if (!url) {\r\n return;\r\n }\r\n const imageData = url.split(\"/\");\r\n const imageId = imageData[imageData.length - 1];\r\n return imageId;\r\n}\r\n//# sourceMappingURL=Image.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Enterprise flights that are relevant to WPO\r\n */\r\nexport const wpoEnterpriseFlights = [\"prg-wpo-rentin-t\", \"prg-wpo-northstr\", \"prg-northstar\", \"prg-webcomp-ent\"];\r\n//# sourceMappingURL=Constants.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AudienceModeType, DefaultInfopaneCountValue, WPOBaseDomainForOneServiceCluster, WPOIntEnableKey, WPOUseBaseDomainQSOverride, WpoFeedUrlPath, WpoIntServiceFeedBaseDomain, WpoIntServiceMyfeedPath, WpoOneServiceDhpPageId, WpoOneServiceFeedBaseDomain, WpoOneServiceNtpPageId, WpoOneServicePagePath, WpoOneServiceXFeedPageId, WpoQueryStringKeys, apiKeyForChildWpo, initBaseRequestParameters4Wpo, ocidForChildMode } from \"@msnews/experiences-constants\";\r\nimport { DesktopFeedEdgeNextConfigIsNull, WpoFeedFetchFailed, WpoFeedGetMuidFailure, WpoFeedImageFetchFailed } from \"../AppErrors\";\r\nimport { ExperienceTypes, UrlSearchParamsHelper, WebWorkerMessageId, environment, logger, registerCommandMessageHandler, scnMapping, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { addEndPerfMarker, addStartPerfMarker, tryReformatGuid, trySetSearchParam } from \"./Common\";\r\nimport { experienceConfigMap, getExperienceTypeConfig } from \"../wwResolver\";\r\nimport { OneServiceMetadataType } from \"./Constants\";\r\nimport { fetchImage } from \"./Image\";\r\nimport { getOneServiceFeedCallHeaders } from \"./OneServiceRequest\";\r\nimport { trimEnterpriseFlightsIfNecessary } from \"@msnews/wpo-enterprise\";\r\nlet feedDisplaySetting;\r\nlet renderSingleColumn;\r\nexport function registerWpoFeedTasksForEdgeChromium() {\r\n if (!environment.isPrefetchEnabled) {\r\n return;\r\n }\r\n /**\r\n * When web worker receives a message, it will use its default handler to send message back to foreground\r\n * This behavior will make foreground message queue cleared\r\n * so if we want to wait for real message (message carrys payload) from web worker, we set default message handler in web-worker to no-op\r\n * P.s. since we do not want to wait for message from web-worker in current design, we comment below sentence\r\n */\r\n // registerDataMessageHandler(WebWorkerMessageId.MyFeed, () => {});\r\n registerCommandMessageHandler(WebWorkerMessageId.UpdateMyFeed, updateWpoFeed);\r\n registerCommandMessageHandler(WebWorkerMessageId.RenderSingleColumn, (value) => {\r\n webWorkerCache.set(WebWorkerMessageId.RenderSingleColumn, value);\r\n });\r\n // Message to wait for before subscribeToFeedConfigs\r\n // Index = 0 : FeedDisplaySetting from PSL\r\n // Index = 1 : Render single column from PSL\r\n const messagesToWait = [WebWorkerMessageId.FeedDisplaySetting, WebWorkerMessageId.RenderSingleColumn];\r\n const subscription = webWorkerCache.subscribeMultiple(messagesToWait, (data) => {\r\n subscription.unsubscribe();\r\n subscribeToFeedConfigs(data);\r\n });\r\n}\r\nfunction updateWpoFeed(cacheBypassValue) {\r\n webWorkerCache.delete(WebWorkerMessageId.MyFeed);\r\n fetchRiverFeed(cacheBypassValue);\r\n}\r\nfunction subscribeToFeedConfigs(data) {\r\n if (data.length) {\r\n feedDisplaySetting = data[0];\r\n renderSingleColumn = data[1];\r\n }\r\n const desktopFeedEdgeNextConfigSubscription = experienceConfigMap.subscribe(ExperienceTypes.DesktopFeedEdgeNext, () => {\r\n desktopFeedEdgeNextConfigSubscription.unsubscribe();\r\n fetchRiverFeed(environment.cacheBypassValue);\r\n });\r\n}\r\nfunction fetchRiverFeed(cacheBypassValue) {\r\n if (feedDisplaySetting !== \"always\" /* always */ && feedDisplaySetting !== \"peek\" /* peek */) {\r\n return;\r\n }\r\n const feedExperience = environment.currentFlights.includes(\"prg-wpo-singcol2\") || renderSingleColumn ? ExperienceTypes.DesktopFeedSingleColumn : ExperienceTypes.DesktopFeedEdgeNext;\r\n const feedConfig = getExperienceTypeConfig(feedExperience);\r\n if (!feedConfig) {\r\n logger.error(Object.assign(Object.assign({}, DesktopFeedEdgeNextConfigIsNull), { message: `fetchOneService-${WebWorkerMessageId.MyFeed}: DesktopFeedEdgeNext config is null when it is expecting to be not null.` }));\r\n return;\r\n }\r\n fetchWpoFeed(feedConfig, WebWorkerMessageId.MyFeed, cacheBypassValue);\r\n}\r\n/**\r\n * Make fetch call for Wpo my feed and mark cache state as fetching item\r\n * @param feedConfig - the feed configuration to use for generating the url\r\n * @param messageId - type of feed, currently only use MyFeed\r\n * @param cacheBypassValue - value used (if not null) to bypass http cache on request\r\n */\r\nfunction fetchWpoFeed(feedConfig, messageId, cacheBypassValue) {\r\n var _a, _b;\r\n addStartPerfMarker(messageId);\r\n const defaultInitialRequest = {\r\n contentType: \"article,video,slideshow,webcontent\",\r\n feedName: \"default\",\r\n ocid: \"anaheim-ntp-feeds\",\r\n start: 0,\r\n timeoutMs: 1000,\r\n useOneServiceUrl: false\r\n };\r\n const initialRequestFromConfig = (_b = (_a = feedConfig === null || feedConfig === void 0 ? void 0 : feedConfig.properties) === null || _a === void 0 ? void 0 : _a.riverSectionCardProviderConfig) === null || _b === void 0 ? void 0 : _b.initialRequest;\r\n const initialRequest = Object.assign(Object.assign({}, defaultInitialRequest), initialRequestFromConfig);\r\n const url = getUrl(initialRequest, cacheBypassValue);\r\n if (!url) {\r\n onFetchComplete(messageId);\r\n return;\r\n }\r\n const headers = getOneServiceFeedCallHeaders();\r\n if (initialRequest.useOneServiceUrl && !environment.userId) {\r\n headers.MUID = environment.activityId;\r\n }\r\n const init = {\r\n credentials: \"include\",\r\n method: \"GET\",\r\n headers\r\n };\r\n return fetch(url, init)\r\n .then((response) => {\r\n if (!response.ok) {\r\n throw `WpoFeed call for ${messageId} failed with status code ${response.status}`;\r\n }\r\n // Since we did not use sessionId, remove it\r\n // if (response.headers) {\r\n // sessionId = response.headers.get(\"ddd-session-id\");\r\n // }\r\n return response.json();\r\n })\r\n .then((data) => {\r\n onFetchComplete(messageId, data);\r\n })\r\n .catch((reason) => {\r\n logger.error(Object.assign(Object.assign({}, WpoFeedFetchFailed), { message: \"Wpo MyFeed fetch failed\", pb: Object.assign(Object.assign({}, WpoFeedFetchFailed.pb), { customMessage: `Error: ${reason}. Url: ${url}` }) }));\r\n onFetchComplete(messageId);\r\n });\r\n}\r\nfunction logMuidError(customMessage) {\r\n logger.error(Object.assign(Object.assign({}, WpoFeedGetMuidFailure), { message: \"Cannot get MUID.\", pb: Object.assign(Object.assign({}, WpoFeedGetMuidFailure.pb), { customMessage: `${customMessage}; ProbableCause: cannot access cookie` }) }));\r\n}\r\nfunction getUrl(initialRequest, cacheBypassValue) {\r\n var _a;\r\n const urlSearchParamsHelper = new UrlSearchParamsHelper();\r\n initBaseRequestParameters4Wpo(initialRequest, urlSearchParamsHelper);\r\n if (cacheBypassValue > 0) {\r\n urlSearchParamsHelper.set(\"cbypass\", cacheBypassValue.toString());\r\n }\r\n if (!environment.sendFeedCallActivityIdInHeader) {\r\n trySetSearchParam(urlSearchParamsHelper, WpoQueryStringKeys.activityId, tryReformatGuid(environment.activityId));\r\n }\r\n trySetSearchParam(urlSearchParamsHelper, WpoQueryStringKeys.market, environment.locale);\r\n const trimmedFlights = (_a = trimEnterpriseFlightsIfNecessary(environment.currentFlights.split(\",\"), environment.audienceMode)) === null || _a === void 0 ? void 0 : _a.join();\r\n trySetSearchParam(urlSearchParamsHelper, WpoQueryStringKeys.fdhead, trimmedFlights);\r\n const { useOneServiceUrl, renderSingleColumn, powerRightRailWithWpo, wpoPageId, wpoSchema } = initialRequest;\r\n // Option-b: flights prg-webcomp-os\r\n if (useOneServiceUrl) {\r\n if (!urlSearchParamsHelper.get(\"User\")) {\r\n trySetSearchParam(urlSearchParamsHelper, \"User\", environment.userId);\r\n urlSearchParamsHelper.delete(WpoQueryStringKeys.user);\r\n if (environment.userId == null) {\r\n logMuidError(\"Using OneServiceUrl\");\r\n }\r\n }\r\n }\r\n else {\r\n trySetSearchParam(urlSearchParamsHelper, WpoQueryStringKeys.user, environment.userId);\r\n if (environment.userId == null) {\r\n logMuidError(\"Not using OneServiceUrl\");\r\n }\r\n }\r\n if (initialRequest.feedId) {\r\n const interestIdParamKey = useOneServiceUrl ? WpoQueryStringKeys.interestIds : WpoQueryStringKeys.ids;\r\n trySetSearchParam(urlSearchParamsHelper, interestIdParamKey, initialRequest.feedId);\r\n }\r\n if (environment.signedIn) {\r\n trySetSearchParam(urlSearchParamsHelper, WpoQueryStringKeys.signInCookieName, scnMapping[environment.pagetype] || \"ANON\");\r\n }\r\n let pathname = WpoFeedUrlPath;\r\n let oneServiceFeedPath;\r\n if (useOneServiceUrl || renderSingleColumn) {\r\n const wpoPageId = initialRequest.shouldUseNewWpoEndpoint ? WpoOneServiceNtpPageId : WpoOneServiceDhpPageId;\r\n oneServiceFeedPath = initialRequest.feedId ? `${WpoOneServicePagePath}${WpoOneServiceXFeedPageId}` : `${WpoOneServicePagePath}${wpoPageId}`;\r\n pathname = oneServiceFeedPath;\r\n }\r\n const domain = useOneServiceUrl || renderSingleColumn ? WpoOneServiceFeedBaseDomain : WPOBaseDomainForOneServiceCluster;\r\n let feedUrl;\r\n const urlSearchParams = environment.getSearchParams();\r\n if (urlSearchParams[WPOUseBaseDomainQSOverride] === \"enabled\") {\r\n feedUrl = new URL(pathname, environment.configServiceBaseUrl.origin);\r\n }\r\n else if ([\"enabled\", \"true\"].includes(urlSearchParams[WPOIntEnableKey])) {\r\n feedUrl = new URL(WpoIntServiceMyfeedPath, WpoIntServiceFeedBaseDomain);\r\n }\r\n else {\r\n feedUrl = new URL(pathname, domain);\r\n }\r\n // For Flight 'prg-webcomp-os'\r\n if (useOneServiceUrl || renderSingleColumn) {\r\n if (!urlSearchParamsHelper.get(\"newsTop\")) {\r\n urlSearchParamsHelper.set(\"newsTop\", \"48\");\r\n }\r\n if (!urlSearchParamsHelper.get(\"newsSkip\")) {\r\n urlSearchParamsHelper.set(\"newsSkip\", \"0\");\r\n }\r\n if (!initialRequest.feedId && !urlSearchParamsHelper.get(WpoQueryStringKeys.infopaneCount)) {\r\n const ipValue = initialRequest.infopaneCount || DefaultInfopaneCountValue;\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.infopaneCount, ipValue.toString());\r\n }\r\n urlSearchParamsHelper.delete(WpoQueryStringKeys.wrapOData);\r\n urlSearchParamsHelper.delete(WpoQueryStringKeys.disableTypeSerialization);\r\n }\r\n if (environment.audienceMode === AudienceModeType.Kids) {\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.query, AudienceModeType.Kids);\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.apiKey, apiKeyForChildWpo);\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.ocid, ocidForChildMode);\r\n }\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.audienceMode, environment.audienceMode);\r\n if (renderSingleColumn) {\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.wpoSchema, \"byregion\");\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.wpoPageId, \"singlecol\");\r\n }\r\n if (powerRightRailWithWpo) {\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.wpoSchema, wpoSchema);\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.wpoPageId, wpoPageId);\r\n }\r\n const wpoitems = urlSearchParams[WpoQueryStringKeys.wpoitems];\r\n if (wpoitems && useOneServiceUrl && !initialRequest.feedId) {\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.wpoitems, wpoitems.toString());\r\n }\r\n const bypassTrigger = urlSearchParams[WpoQueryStringKeys.bypassTrigger];\r\n if (bypassTrigger && (useOneServiceUrl || renderSingleColumn) && !initialRequest.feedId) {\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.bypassTrigger, bypassTrigger.toString());\r\n }\r\n if (initialRequest === null || initialRequest === void 0 ? void 0 : initialRequest.feedName) {\r\n urlSearchParamsHelper.set(WpoQueryStringKeys.query, initialRequest.feedName);\r\n }\r\n feedUrl.search = urlSearchParamsHelper.toString();\r\n return feedUrl.toString();\r\n}\r\n/**\r\n * Marks cache state complete for OneService my feed. Responds to any pending messages. And triggers the content preview fetch.\r\n * @param response - The response\r\n */\r\nfunction onFetchComplete(messageId, response = null) {\r\n addEndPerfMarker(messageId);\r\n webWorkerCache.set(messageId, { payload: response });\r\n sendMessage({ id: messageId, fetched: true, payload: response });\r\n if (response && response.sections && response.sections.length) {\r\n // Load the first infopane image and the following 3 content card images\r\n const maxPreloadCount = 4;\r\n const imagesToPrefetch = [];\r\n for (const aboveTheFoldCard of response.sections[0].cards) {\r\n if (aboveTheFoldCard.type === OneServiceMetadataType.Infopane) {\r\n const firstInfopaneCard = aboveTheFoldCard.subCards[0];\r\n if (firstInfopaneCard.images && firstInfopaneCard.images[0]) {\r\n imagesToPrefetch.push({ metadata: firstInfopaneCard.images[0], size: { width: 612, height: 304 } });\r\n }\r\n }\r\n else if (aboveTheFoldCard.images && aboveTheFoldCard.images[0]) {\r\n imagesToPrefetch.push({ metadata: aboveTheFoldCard.images[0], size: { width: 300, height: 156 } });\r\n }\r\n // If we now have the max number of images to preload, bail.\r\n if (imagesToPrefetch.length >= maxPreloadCount) {\r\n break;\r\n }\r\n }\r\n for (const imageToPrefetch of imagesToPrefetch) {\r\n fetchImage(imageToPrefetch.metadata, imageToPrefetch.size, { appError: WpoFeedImageFetchFailed });\r\n }\r\n }\r\n}\r\n/**\r\n * Test only exports\r\n */\r\nexport const _getUrl = getUrl;\r\n//# sourceMappingURL=WpoFeed.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AudienceModeType } from \"@msnews/experiences-constants\";\r\nimport { wpoEnterpriseFlights } from \"./Constants\";\r\n/**\r\n * Trim the list of flights to send to wpo by removing Enterprise specific flights from the list\r\n * if the audience mode is not Enterprise\r\n * @param flights Full list of flights\r\n * @returns Trimmed list of flights or the same list if no trimming was necessary\r\n */\r\nexport function trimEnterpriseFlightsIfNecessary(flights, audienceMode) {\r\n // Don't remove anything if the audience mode is Enterprise\r\n if (!flights || audienceMode === AudienceModeType.Enterprise) {\r\n return flights;\r\n }\r\n return flights.filter((flightId) => {\r\n return wpoEnterpriseFlights.indexOf(flightId.toLowerCase(), 0) === -1;\r\n });\r\n}\r\n//# sourceMappingURL=WpoEnterpriseHelper.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, ExperienceTypes, UrlSearchParamsHelper, WebWorkerMessageId, environment, logger, perfMarker, registerCommandMessageHandler, scnMapping, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { aadTokenQsKey, aadTokenQsVal, getOneServiceHeaders, shouldMakeEnterpriseRequest, shouldUseEnterpriseDomain } from \"./OneServiceRequest\";\r\nimport { FetchMyBriefingFailed } from \"../AppErrors\";\r\nimport { MyBriefing } from \"./Constants\";\r\nimport { experienceConfigMap } from \"../wwResolver\";\r\nimport { oneServiceQueryStringKeys } from \"./OneServiceConstants\";\r\nimport { tryReformatGuid } from \"./Common\";\r\nlet feedDisplaySetting;\r\n/**\r\n * Registers My Briefing Tasks\r\n */\r\nexport function registerMyBriefingTasks() {\r\n if (!isFeatureEnabled()) {\r\n return;\r\n }\r\n registerCommandMessageHandler(WebWorkerMessageId.MyBriefing, updateMyBriefing);\r\n subscribeToMyBriefingConfig();\r\n}\r\n/**\r\n * Registers MyBriefing tasks for Edge Chromium\r\n */\r\nexport function registerMyBriefingTasksForEdgeChromium() {\r\n if (!isFeatureEnabled()) {\r\n return;\r\n }\r\n registerCommandMessageHandler(WebWorkerMessageId.UpdateMyBriefing, updateMyBriefing);\r\n const messagesToWait = [WebWorkerMessageId.FeedDisplaySetting];\r\n if (environment.isEnterpriseCompliantNTP) {\r\n messagesToWait.push(WebWorkerMessageId.AuthToken);\r\n }\r\n const subscription = webWorkerCache.subscribeMultiple(messagesToWait, (data) => {\r\n subscription.unsubscribe();\r\n subscribeToMyBriefingConfig(data);\r\n });\r\n}\r\n/**\r\n * Take action to re-fetch MyBriefing\r\n */\r\nexport function updateMyBriefing(cacheBypassValue) {\r\n webWorkerCache.delete(WebWorkerMessageId.MyBriefing);\r\n fetchMyBriefing(cacheBypassValue);\r\n}\r\n/**\r\n * Subscribe to the MyBriefRiverCard config and if it is present, fetch MyBriefing\r\n */\r\nfunction subscribeToMyBriefingConfig(data) {\r\n if (data && Array.isArray(data) && data.length) {\r\n // First subscription is for feed display setting\r\n feedDisplaySetting = data[0];\r\n }\r\n const myBriefingConfigSubscription = experienceConfigMap.subscribe(ExperienceTypes.MyBriefing, () => {\r\n myBriefingConfigSubscription.unsubscribe();\r\n fetchMyBriefing(environment.cacheBypassValue);\r\n });\r\n}\r\n/**\r\n * Fetch My Briefing\r\n */\r\nfunction fetchMyBriefing(cacheBypassValue) {\r\n if (!canFetchBriefing()) {\r\n return;\r\n }\r\n perfMarker(`${WebWorkerMessageId.MyBriefing}FetchStart`);\r\n const userId = environment.userId;\r\n if (!userId) {\r\n onFetchComplete();\r\n return;\r\n }\r\n const init = {\r\n headers: getOneServiceHeaders(),\r\n method: \"GET\"\r\n };\r\n if (environment.signedIn) {\r\n init.credentials = \"include\";\r\n }\r\n const url = getUrl(cacheBypassValue);\r\n if (!url) {\r\n onFetchComplete();\r\n return;\r\n }\r\n fetch(url, init).then(response => {\r\n if (!response.ok) {\r\n throw `OneServiceFeed call for ${WebWorkerMessageId.MyBriefing} failed with status code ${response.status}`;\r\n }\r\n return response.json();\r\n }).then((data) => {\r\n onFetchComplete(transformResponse(data));\r\n }).catch(reason => {\r\n logger.error(Object.assign(Object.assign({}, FetchMyBriefingFailed), { message: \"My Briefing fetch failed\", pb: Object.assign(Object.assign({}, FetchMyBriefingFailed.pb), { customMessage: `Error: ${reason}. Url: ${url}` }) }));\r\n onFetchComplete();\r\n });\r\n}\r\n/**\r\n * Construct the URL\r\n */\r\nfunction getUrl(cacheBypassValue) {\r\n const isEnterpriseRequest = shouldMakeEnterpriseRequest();\r\n const urlBase = shouldUseEnterpriseDomain() ? environment.enterpriseServiceUrlBase : environment.feedServiceUrlBase;\r\n const url = new URL(MyBriefing.myBriefingServiceEndpoint, urlBase);\r\n const urlSearchParamsHelper = new UrlSearchParamsHelper(urlBase.search);\r\n setDefaultSearchParams(urlSearchParamsHelper);\r\n if (isEnterpriseRequest) {\r\n urlSearchParamsHelper.set(aadTokenQsKey, aadTokenQsVal);\r\n }\r\n if (cacheBypassValue > 0) {\r\n urlSearchParamsHelper.set(\"cbypass\", cacheBypassValue.toString());\r\n }\r\n url.search = urlSearchParamsHelper.toString();\r\n return url.toString();\r\n}\r\n/**\r\n * Gets the my briefing url with default search parameters\r\n * @param urlSearchParamsHelper search params\r\n */\r\nfunction setDefaultSearchParams(urlSearchParamsHelper) {\r\n urlSearchParamsHelper.set(oneServiceQueryStringKeys.apiKey, environment.oneServiceApiKey)\r\n .set(oneServiceQueryStringKeys.activityId, tryReformatGuid(environment.activityId))\r\n .set(oneServiceQueryStringKeys.ocid, MyBriefing.defaultOcid)\r\n .set(oneServiceQueryStringKeys.market, environment.locale)\r\n .set(oneServiceQueryStringKeys.top, \"8\");\r\n trySetSearchParam(urlSearchParamsHelper, oneServiceQueryStringKeys.user, environment.userId);\r\n trySetSearchParam(urlSearchParamsHelper, oneServiceQueryStringKeys.fdhead, environment.currentFlights);\r\n if (environment.signedIn) {\r\n urlSearchParamsHelper.set(oneServiceQueryStringKeys.signInCookieName, scnMapping[environment.pagetype] || \"ANON\");\r\n }\r\n}\r\n/**\r\n * Transforms raw data into the expected response format\r\n * @param data Raw data response\r\n */\r\nfunction transformResponse(data) {\r\n if (!data || !data.value || !data.value.length) {\r\n return;\r\n }\r\n return data.value[0].subCards;\r\n}\r\n/**\r\n * Marks cache state complete for My Briefing.\r\n * @param response - The response\r\n */\r\nfunction onFetchComplete(response = null) {\r\n perfMarker(`${WebWorkerMessageId.MyBriefing}FetchEnd`);\r\n webWorkerCache.set(WebWorkerMessageId.MyBriefing, { payload: response });\r\n sendMessage({ id: WebWorkerMessageId.MyBriefing, fetched: true, payload: response });\r\n}\r\n/**\r\n * Sets the search param if value is present\r\n * @param urlSearchParamsHelper URLSearchParams object\r\n * @param name the name of the search param\r\n * @param value the value of the search param\r\n */\r\nfunction trySetSearchParam(urlSearchParamsHelper, name, value) {\r\n if (!value) {\r\n return;\r\n }\r\n urlSearchParamsHelper.set(name, value);\r\n}\r\n/** Checks and returns a boolean indicating if the briefing call can be made */\r\nfunction canFetchBriefing() {\r\n if (environment.apptype !== AppType.EdgeChromium) {\r\n return true;\r\n }\r\n return feedDisplaySetting === \"always\";\r\n}\r\n/** Checks if the feature is enabled on this canvas */\r\nfunction isFeatureEnabled() {\r\n return environment.apptype === AppType.EdgeChromium ||\r\n environment.apptype === AppType.MicrosoftNews ||\r\n environment.apptype === AppType.Windows;\r\n}\r\n//# sourceMappingURL=MyBriefing.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, ExperienceTypes, RiverConfigType, WebWorkerMessageId, environment, logger, notifySubscription, registerCommandMessageHandler, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { ContentPreviewFetchFailed, UnknownComplexInfopaneSlide } from \"../AppErrors\";\r\nimport { experienceConfigMap, getExperienceTypeConfig } from \"../wwResolver\";\r\nimport { fetchImage, imageSizeMap } from \"./Image\";\r\nimport { OneServiceResponseSchema } from \"./Common\";\r\nimport { ContentPreview } from \"./Constants\";\r\nimport { IndexedDBCache } from \"../wwCommon\";\r\nimport { get } from \"lodash-es\";\r\nlet contentPreviewCache;\r\nlet isRefreshComplete = false;\r\n// Are we overriding the default image quality? Exported only for testing\r\nexport let overrideImageQuality;\r\n/** Registers content preview related tasks */\r\nexport function registerContentPreviewTasks() {\r\n if (isFeatureEnabled()) {\r\n initializecontentPreviewCache();\r\n registerCommandMessageHandler(WebWorkerMessageId.PostTtvr, refreshStaleContentPreviewItems);\r\n }\r\n const myFeedSubscription = webWorkerCache.subscribe(WebWorkerMessageId.MyFeed, feedResponse => {\r\n myFeedSubscription.unsubscribe();\r\n fetchItems(feedResponse, WebWorkerMessageId.MyFeed);\r\n });\r\n const stripeMyFeedSubscription = webWorkerCache.subscribe(WebWorkerMessageId.StripeMyFeed, stripeFeedResponse => {\r\n stripeMyFeedSubscription.unsubscribe();\r\n fetchItems(stripeFeedResponse, WebWorkerMessageId.StripeMyFeed);\r\n });\r\n}\r\n/**\r\n * Fetches content preview items or only images based on feed response schema\r\n * @param feedResponse - the feed response\r\n * @param messageId - web worker message id\r\n */\r\nfunction fetchItems(feedResponse, messageId) {\r\n if (!feedResponse || !feedResponse.payload || !feedResponse.payload.feedData) {\r\n return;\r\n }\r\n const { responseSchema, feedData, isTabbedInfopaneResponse } = feedResponse.payload;\r\n let feedItems;\r\n if (responseSchema === OneServiceResponseSchema.CardView) {\r\n feedItems = isTabbedInfopaneResponse ? feedData[0] && feedData[0].subCards : feedData.subCards;\r\n }\r\n else {\r\n feedItems = feedData.feedItems;\r\n }\r\n if (!feedItems || !feedItems.length) {\r\n return;\r\n }\r\n const contentPreviewItems = getContentItems(feedItems, messageId);\r\n const contentItems = filterCachedItems(contentPreviewItems.infopaneContentItems);\r\n const riverContentItems = filterCachedItems(contentPreviewItems.contentItems);\r\n // Add content preview items for river.\r\n const contentPreviewPreloadCount = Math.min(getWWContentPreviewPreloadCount(messageId), riverContentItems.length);\r\n for (let index = 0; index < contentPreviewPreloadCount; index++) {\r\n contentItems.push(riverContentItems[index]);\r\n }\r\n if (!contentItems.length) {\r\n return;\r\n }\r\n // Card view response contains card content, only fetch images\r\n if (responseSchema === OneServiceResponseSchema.CardView) {\r\n fetchImages(contentItems);\r\n return;\r\n }\r\n fetchContentPreviewItems(contentItems);\r\n}\r\n/**\r\n * Initializes content preview cache\r\n */\r\nfunction initializecontentPreviewCache() {\r\n contentPreviewCache = new IndexedDBCache({\r\n dbName: ContentPreview.dbName,\r\n storeName: ContentPreview.storeName,\r\n indexName: ContentPreview.indexName,\r\n freshnessDuration: 5 * 60 * 1000 // 5 minutes\r\n });\r\n // Check if we are overriding the quality of resized images.\r\n overrideImageQuality = false;\r\n const contentPreviewConfigSubscription = experienceConfigMap.subscribe(ExperienceTypes.ContentPreview, (cpConfig) => {\r\n contentPreviewConfigSubscription.unsubscribe();\r\n overrideImageQuality = get(cpConfig, \"properties.overrideDefaultImageQuality\");\r\n });\r\n contentPreviewCache.initialize().then(() => {\r\n const contentPreviewItems = contentPreviewCache.toArray();\r\n webWorkerCache.set(WebWorkerMessageId.ContentPreviewData, { payload: contentPreviewItems });\r\n sendMessage({ id: WebWorkerMessageId.ContentPreviewData, fetched: true, payload: contentPreviewItems });\r\n });\r\n // Perform cleanup irrespective of PostTtvr message\r\n setTimeout(refreshStaleContentPreviewItems, 5000);\r\n}\r\n/**\r\n * Gets multiple content preview items\r\n * @param contentItems - content items to fetch\r\n */\r\nfunction fetchContentPreviewItems(contentItems) {\r\n if (!contentItems || !contentItems.length) {\r\n return;\r\n }\r\n return Promise.all(contentItems.map(item => fetchContentPreviewItem(item))).then(() => {\r\n if (contentPreviewCache) {\r\n contentPreviewCache.saveToIndexedDB();\r\n notifySubscription(WebWorkerMessageId.ContentPreviewCache, contentPreviewCache.toArray());\r\n }\r\n });\r\n}\r\n/**\r\n * Fetches images for card view response\r\n * @param feedItems - the feed items from response\r\n */\r\nfunction fetchImages(contentItems) {\r\n contentItems.map(item => fetchImage(item.imageMetadata, item.imageSize, { appErrorPB: { parentId: item.id } }));\r\n}\r\n/**\r\n * Refreshes stale content preview items\r\n */\r\nfunction refreshStaleContentPreviewItems() {\r\n if (isRefreshComplete || !contentPreviewCache || !contentPreviewCache.getStaleItems().length) {\r\n return;\r\n }\r\n isRefreshComplete = true;\r\n // Use Map to avoid duplicates\r\n const staleItems = new Map();\r\n findStaleItemsInCache(WebWorkerMessageId.MyFeed, staleItems);\r\n findStaleItemsInCache(WebWorkerMessageId.StripeMyFeed, staleItems);\r\n if (staleItems.size === 0) {\r\n return;\r\n }\r\n const contentPreviewPromises = [];\r\n staleItems.forEach((item) => {\r\n contentPreviewPromises.push(fetchContentPreviewItem(item));\r\n });\r\n Promise.all(contentPreviewPromises).then(() => {\r\n contentPreviewCache.saveToIndexedDB();\r\n notifySubscription(WebWorkerMessageId.ContentPreviewCache, contentPreviewCache.toArray());\r\n });\r\n}\r\n/**\r\n * Finds stale items in content preview cache that are part of current feed response\r\n * @param messageId - the message Id to determine MyFeed and StripeMyFeed feed responses\r\n * @param staleItems - the staleItems Map object used to check for duplicates\r\n */\r\nfunction findStaleItemsInCache(messageId, staleItems) {\r\n const cacheEntry = webWorkerCache.get(messageId);\r\n if (!cacheEntry\r\n || !cacheEntry.payload\r\n || cacheEntry.payload.responseSchema === OneServiceResponseSchema.CardView\r\n || !cacheEntry.payload.feedData) {\r\n return;\r\n }\r\n const feedItems = cacheEntry.payload.feedData.feedItems;\r\n if (!feedItems || !feedItems.length) {\r\n return;\r\n }\r\n // Get all content preview items from feed response\r\n const riverItems = getContentItems(feedItems, null, true);\r\n const contentItems = [...(riverItems.contentItems || []), ...(riverItems.infopaneContentItems || [])];\r\n const staleItemsInCache = contentPreviewCache.getStaleItems().map(item => item.id);\r\n contentItems.forEach((item) => {\r\n if (!staleItems.has(item.id) && staleItemsInCache.indexOf(item.id) !== -1) {\r\n staleItems.set(item.id, item);\r\n }\r\n });\r\n}\r\n/**\r\n * Makes fetch call for content preview and marks cache state as fetching item.\r\n * @param item - The item metadata\r\n */\r\nfunction fetchContentPreviewItem(item) {\r\n const { id, variation, locale } = item;\r\n let url;\r\n if (variation && locale) {\r\n const search = environment.ContentServiceUrlBase.search\r\n ? environment.ContentServiceUrlBase.search + `&market=${locale}`\r\n : `?market=${locale}`;\r\n url = new URL(`view/v1/Preview/${id}${variation}${search}`, environment.ContentServiceUrlBase);\r\n }\r\n else {\r\n url = new URL(`view/v1/Preview/${id}${environment.ContentServiceUrlBase.search}`, environment.ContentServiceUrlBase);\r\n }\r\n return fetch(url.href).then(response => {\r\n if (!response.ok) {\r\n throw `ContentPreview call failed with status [${response.status}].`;\r\n }\r\n return response.json();\r\n }).then(data => {\r\n onFetchComplete(item, data);\r\n }).catch(reason => {\r\n logger.error(Object.assign(Object.assign({}, ContentPreviewFetchFailed), { message: \"Content Preview fetch failed\", pb: Object.assign(Object.assign({}, ContentPreviewFetchFailed.pb), { customMessage: `Error: ${reason}. Url: ${url}` }) }));\r\n onFetchComplete(item);\r\n });\r\n}\r\n/**\r\n * Marks cache state complete for given item id. Responds to any pending messages. And the image fetch.\r\n * @param item - The item metadata\r\n * @param response - The response\r\n */\r\nfunction onFetchComplete(item, response = null) {\r\n const { id, imageSize } = item;\r\n webWorkerCache.set(id, { payload: response });\r\n logger.info(`WebWorker.fetchContentPreviewComplete: [id ${id}]`);\r\n if (!response) {\r\n return;\r\n }\r\n if (contentPreviewCache) {\r\n contentPreviewCache.set(id, response);\r\n }\r\n if (response.images && response.images.length) {\r\n fetchImage(response.images[0], imageSize, { appErrorPB: { parentId: id }, overrideImageQuality });\r\n }\r\n}\r\n/**\r\n * Get metadata for all the content items.\r\n * @param feedItems - The response\r\n * @param messageId - web worker message id\r\n * @param getAllInfoPaneItems - Boolean to return all infopane items, by default only the first infopane item is returned\r\n * @returns An array of ContentItem\r\n */\r\nfunction getContentItems(feedItems, messageId = null, getAllInfoPaneItems = false) {\r\n if (!feedItems || !feedItems.length) {\r\n return {};\r\n }\r\n const contentPreviewItems = {};\r\n const contentItems = [];\r\n let fetchDoubleWideImageForMMX = true;\r\n const isMMX = environment.apptype === AppType.MMX;\r\n // External link items in river (with type = 'link') don't need to be fetched so skip those\r\n feedItems\r\n .filter(item => item.type !== \"link\")\r\n .forEach((item) => {\r\n if (item.type === \"infopane\") {\r\n let subItems = item.subItems || item.subCards;\r\n // External link items in infopane (with type = 'link') don't need to be fetched so skip those\r\n subItems = subItems.filter(subItem => subItem.type !== \"link\");\r\n contentPreviewItems.infopaneContentItems = getInfopaneContentItems(getAllInfoPaneItems ? subItems : [subItems[0]]);\r\n }\r\n else if (item.id) {\r\n let imageSize = messageId === WebWorkerMessageId.StripeMyFeed ? imageSizeMap.Image_1x1y : imageSizeMap.ContentPreview;\r\n const { locale, variation, images = [] } = item.metadata || item;\r\n if (isMMX) {\r\n if (fetchDoubleWideImageForMMX) {\r\n // Pre-fetch the first image on MMX as a double-wide\r\n imageSize = imageSizeMap.HalfPane;\r\n fetchDoubleWideImageForMMX = false;\r\n }\r\n else {\r\n // Don't pre-fetch images\r\n imageSize = null;\r\n }\r\n }\r\n contentItems.push({\r\n id: item.id,\r\n imageSize,\r\n locale,\r\n variation,\r\n imageMetadata: images[0]\r\n });\r\n }\r\n else {\r\n logger.info(`WebWorker.getContentItems: Skipped fetching content item of type ${item.type}`);\r\n }\r\n });\r\n contentPreviewItems.contentItems = contentItems;\r\n return contentPreviewItems;\r\n}\r\n/**\r\n * Gets the Infopane content preview items\r\n * @param items - infoPane items from feed response\r\n */\r\nfunction getInfopaneContentItems(items) {\r\n let contentItems = [];\r\n if (!items || items.length === 0) {\r\n return contentItems;\r\n }\r\n items.forEach(item => {\r\n if (item.id) {\r\n const { locale, variation, images = [] } = item.metadata || item;\r\n contentItems.push({\r\n id: item.id,\r\n imageSize: imageSizeMap.HalfPane,\r\n locale,\r\n variation,\r\n imageMetadata: images[0]\r\n });\r\n }\r\n else {\r\n const complexSlideContentIds = getInfopaneComplexSlideContentItems(item.type, item.subItems);\r\n contentItems = [...contentItems, ...complexSlideContentIds];\r\n }\r\n });\r\n return contentItems;\r\n}\r\n/**\r\n * Get metadata for Infopane complex slide content items.\r\n * @param type - The complex slide type\r\n * @param items - The complex slide items\r\n * @returns An array of ContentItem\r\n */\r\nfunction getInfopaneComplexSlideContentItems(type, items) {\r\n const contentItems = [];\r\n const sizeMap = imageSizeMap[type];\r\n if (!sizeMap) {\r\n logger.error(Object.assign(Object.assign({}, UnknownComplexInfopaneSlide), { message: `Unknown Infopane complex slide type ${type}` }));\r\n return contentItems;\r\n }\r\n items.forEach((item, index) => {\r\n if (!item.id || item.type === \"link\") {\r\n return;\r\n }\r\n const { locale, variation, images = [] } = item.metadata || item;\r\n contentItems.push({\r\n id: item.id,\r\n imageSize: sizeMap[index],\r\n locale,\r\n variation,\r\n imageMetadata: images[0]\r\n });\r\n });\r\n return contentItems;\r\n}\r\n/**\r\n * Filters out items that are already cached\r\n * @param items the list of items to filter\r\n * @returns items not cached\r\n */\r\nfunction filterCachedItems(items) {\r\n if (!items || !items.length) {\r\n return [];\r\n }\r\n if (!contentPreviewCache) {\r\n return items;\r\n }\r\n return items.filter((contentItem) => !contentPreviewCache.has(contentItem.id));\r\n}\r\n/**\r\n * get the max number of content preview items to preload.\r\n * preloadRiverContentItemsInWebWorker is used from River config.\r\n * If not present in river config, it assumes 1 for MMX and 12 for non MMX.\r\n * For debugging, it can be overwritten from the query string param wwcontentpreviewpreloadcount\r\n * @param messageId - web worker message id\r\n * @returns {number}\r\n */\r\nfunction getWWContentPreviewPreloadCount(messageId) {\r\n const param = environment.getQueryParameter(\"previewcount\");\r\n if (param) {\r\n const count = Number(param);\r\n if (!isNaN(count)) {\r\n return count;\r\n }\r\n }\r\n const experienceType = messageId === WebWorkerMessageId.StripeMyFeed ? RiverConfigType.StripeMyFeed : RiverConfigType.MyFeed;\r\n const config = getExperienceTypeConfig(experienceType);\r\n const preloadRiverContentItemsInWebWorker = config &&\r\n get(config, \"properties.cardProviderConfig.initialRequest.preloadRiverContentItemsInWebWorker\");\r\n if (environment.apptype === AppType.MMX) {\r\n return preloadRiverContentItemsInWebWorker || 1;\r\n }\r\n if (preloadRiverContentItemsInWebWorker) {\r\n return preloadRiverContentItemsInWebWorker;\r\n }\r\n return messageId === WebWorkerMessageId.StripeMyFeed ? 3 : 12;\r\n}\r\n/**\r\n * Checks if content preview cache feature is enabled\r\n */\r\nfunction isFeatureEnabled() {\r\n if (environment.disableContentPreviewCache === true) {\r\n return false;\r\n }\r\n return environment.apptype === AppType.EdgeChromium;\r\n}\r\n//# sourceMappingURL=ContentPreview.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { FailedToClearIdb, FailedToHydrateIdb, FailedToInitIdb, FailedToSaveIdb } from \"../AppErrors\";\r\nimport { IndexedDb } from \"./IndexedDb\";\r\nimport { logger } from \"./Logger\";\r\nimport { registerCommandMessageHandler } from \"./MessageHandler\";\r\n/**\r\n * IndexedDBCache\r\n * Helper class that hydrates from IndexedDB and saves data to IndexedDB\r\n */\r\nexport class IndexedDBCache {\r\n constructor(options) {\r\n this.options = options;\r\n /** In Memory Cache for data from IndexedDB */\r\n this.cache = new Map();\r\n /** Flag indicating if IndexedDB is supported */\r\n this.isIndexedDBSupported = false;\r\n /** Stale items in cache */\r\n this.staleItems = [];\r\n options.dbVersion = options.dbVersion || 1;\r\n this.registerIndexedDBCommandHandler();\r\n }\r\n /**\r\n * Connects to an IndexedDB instance and hydrates in memory cache\r\n * @param idb indexedDb instance, only used for unit tests\r\n */\r\n initialize(idb = new IndexedDb()) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n this.idb = idb;\r\n this.isIndexedDBSupported = this.idb.supported;\r\n if (!this.isIndexedDBSupported) {\r\n return;\r\n }\r\n try {\r\n yield this.idb.initializeIndexedDb(this.options.dbVersion, this.options.storeName, this.options.dbName);\r\n yield this.hydrate();\r\n }\r\n catch (ex) {\r\n logger.error(Object.assign(Object.assign({}, FailedToInitIdb), { message: `Failed to init IndexedDB [${this.options.dbName}|${this.options.storeName}]`, pb: Object.assign(Object.assign({}, FailedToInitIdb.pb), { customMessage: `Error: ${ex}` }) }));\r\n }\r\n });\r\n }\r\n /**\r\n * Checks if data with given key is present in InMemoryCache\r\n * @param key the key to look up\r\n */\r\n has(key) {\r\n return this.cache.has(key);\r\n }\r\n /**\r\n * Gets an item from in-memory cache\r\n * @param key item key\r\n */\r\n get(key) {\r\n return this.cache.get(key);\r\n }\r\n /**\r\n * Returns the in memory cache entries as any Array.\r\n * Not returning a Map since it does not serialize/deserialize correctly in post messages\r\n * @param key item key\r\n */\r\n toArray() {\r\n // Array.from is a simpler way to do this, not doing it here since it's not supported in IE.\r\n const entries = [];\r\n this.cache.forEach(item => {\r\n entries.push(item);\r\n });\r\n return entries;\r\n }\r\n /**\r\n * Returns stale items in cache\r\n */\r\n getStaleItems() {\r\n return this.staleItems;\r\n }\r\n /**\r\n * Adds an item into in-memory cache\r\n * @param key item key\r\n */\r\n set(key, payload) {\r\n if (!payload || this.cache.size === this.options.maxItems) {\r\n return;\r\n }\r\n if (!payload.storageTimestamp) {\r\n payload.storageTimestamp = Date.now();\r\n }\r\n this.cache.set(key, payload);\r\n }\r\n /**\r\n * Saves the items in indexed db and in memory cache\r\n * @param key - optional key if only 1 entry is to be saved ti IDB else the entire in memory cache is saved\r\n */\r\n saveToIndexedDB() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (!this.isIndexedDBSupported) {\r\n return;\r\n }\r\n try {\r\n // To avoid stale data in IndexedB, overwrite IndexedDB with new data even if it's empty\r\n yield this.idb.setObject(this.options.indexName, this.cache);\r\n }\r\n catch (ex) {\r\n logger.error(Object.assign(Object.assign({}, FailedToSaveIdb), { message: `Failed to save data in IndexedDB [${this.options.dbName}|${this.options.storeName}]`, pb: Object.assign(Object.assign({}, FailedToSaveIdb.pb), { customMessage: `Error: ${ex}` }) }));\r\n }\r\n });\r\n }\r\n /**\r\n * Clears the IndexedDB index\r\n * @param - Boolean to enable/disable local cache clear. By default, local cacheis cleared.\r\n */\r\n clearIndexedDB(clearLocalCache = true) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n if (clearLocalCache) {\r\n this.cache.clear();\r\n }\r\n if (!this.isIndexedDBSupported) {\r\n return;\r\n }\r\n try {\r\n yield this.idb.clearObjects();\r\n }\r\n catch (ex) {\r\n logger.error(Object.assign(Object.assign({}, FailedToClearIdb), { message: `Failed to clear cache [${this.options.dbName}|${this.options.storeName}]`, pb: Object.assign(Object.assign({}, FailedToClearIdb.pb), { customMessage: `Error: ${ex}` }) }));\r\n }\r\n });\r\n }\r\n /**\r\n * Returns the number of items in the cache\r\n */\r\n size() {\r\n return this.cache.size;\r\n }\r\n /**\r\n * Hydrates in-memory cache with items from IndexedDB\r\n */\r\n hydrate() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n try {\r\n const indexedDBData = yield this.idb.getObject(this.options.indexName);\r\n if (!indexedDBData) {\r\n return;\r\n }\r\n if (indexedDBData instanceof Map) {\r\n this.populateInMemoryCache(indexedDBData);\r\n return;\r\n }\r\n const dataConverter = this.options.convertToMap;\r\n if (dataConverter) {\r\n const convertedData = dataConverter(indexedDBData);\r\n if (!convertedData) {\r\n return;\r\n }\r\n this.populateInMemoryCache(convertedData);\r\n }\r\n }\r\n catch (ex) {\r\n logger.error(Object.assign(Object.assign({}, FailedToHydrateIdb), { message: `Failed to hydrate from IndexedDB [${this.options.dbName}|${this.options.storeName}`, pb: Object.assign(Object.assign({}, FailedToHydrateIdb.pb), { customMessage: `${this.options.indexName}]. Error: ${ex}` }) }));\r\n }\r\n });\r\n }\r\n /**\r\n * Populates in memory cache with data from IndexedDB. Optionally filters stale items.\r\n * @param items - items to filter\r\n */\r\n populateInMemoryCache(items) {\r\n // Skip filtering if freshness duration is not set\r\n if (this.options.freshnessDuration === undefined) {\r\n items.forEach((item, key) => {\r\n this.set(key, item);\r\n });\r\n return;\r\n }\r\n const now = Date.now();\r\n items.forEach((item, key) => {\r\n if (!item.storageTimestamp) {\r\n return;\r\n }\r\n // Add to cache only if the item is not stale.\r\n if ((item.storageTimestamp + this.options.freshnessDuration) > now) {\r\n this.set(key, item);\r\n }\r\n else {\r\n this.staleItems.push(item);\r\n }\r\n });\r\n }\r\n registerIndexedDBCommandHandler() {\r\n const messageId = `IndexedDBCache-${this.options.dbName}-${this.options.storeName}`;\r\n registerCommandMessageHandler(messageId, (payload) => {\r\n if (!Array.isArray(payload)) {\r\n return;\r\n }\r\n let hasUpdates = false;\r\n payload.forEach((item) => {\r\n if (!item || !item.id) {\r\n return;\r\n }\r\n const existingItem = this.cache.get(item.id);\r\n if (existingItem && existingItem.storageTimestamp > item.storageTimestamp) {\r\n // What we have is newer, return\r\n return;\r\n }\r\n this.set(item.id, item);\r\n hasUpdates = true;\r\n });\r\n if (hasUpdates) {\r\n this.saveToIndexedDB();\r\n }\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=IndexedDBCache.js.map","// © Microsoft Corporation. All rights reserved.\r\n/** The pdp query enums */\r\nexport var TargetType;\r\n(function (TargetType) {\r\n /** Weather location */\r\n TargetType[\"Location\"] = \"Location\";\r\n /** Finance */\r\n TargetType[\"Finance\"] = \"Finance\";\r\n /** Sports team */\r\n TargetType[\"Team\"] = \"Team\";\r\n /** Sports league */\r\n TargetType[\"League\"] = \"League\";\r\n /** Sports layer */\r\n TargetType[\"Player\"] = \"Player\";\r\n})(TargetType || (TargetType = {}));\r\n//# sourceMappingURL=TargetType.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { AppType, PageType, WebWorkerMessageId, environment, logger, perfMarker, registerCommandMessageHandler, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { TargetType } from \"@msnews/pdp-service-contracts\";\r\nimport { aadTokenQsKey, aadTokenQsVal, getOneServiceHeaders, shouldMakeEnterpriseRequest, shouldUseEnterpriseDomain } from \"./OneServiceRequest\";\r\nimport { FetchPdpDataFailed } from \"../AppErrors\";\r\nimport { tryReformatGuid } from \"./Common\";\r\n/** Registers PDP related tasks */\r\nexport function registerPdpTasks() {\r\n if (!isPdpDataFeatureEnabled()) {\r\n return;\r\n }\r\n const subscription = webWorkerCache.subscribeMultiple([WebWorkerMessageId.AppAnonCookie, WebWorkerMessageId.MyFeed], (values) => {\r\n subscription.unsubscribe();\r\n const appAnonCookieExists = values[0] && values[0].payload && values[0].payload.appAnonCookieExists;\r\n if (appAnonCookieExists === true) {\r\n fetchUserPdpData();\r\n }\r\n });\r\n registerCommandMessageHandler(WebWorkerMessageId.Updatepdp, fetchUserPdpData);\r\n registerCommandMessageHandler(WebWorkerMessageId.InvalidateWeatherPdp, invalidateWeatherPdp);\r\n}\r\n/** Makes weather, money and sports PDP calls */\r\nfunction fetchUserPdpData() {\r\n perfMarker(\"SdPDPBulkFetchStart\");\r\n const pdpInfo = [\r\n { id: WebWorkerMessageId.WeatherPdp, type: TargetType.Location },\r\n { id: WebWorkerMessageId.SportsTeamPdp, type: TargetType.Team },\r\n { id: WebWorkerMessageId.SportsPlayerPdp, type: TargetType.Player },\r\n { id: WebWorkerMessageId.SportsLeaguePdp, type: TargetType.League },\r\n { id: WebWorkerMessageId.MoneyPdp, type: TargetType.Finance }\r\n ];\r\n const url = getPdpUrl(pdpInfo.map(info => info.type));\r\n const init = {\r\n credentials: \"include\",\r\n method: \"GET\",\r\n headers: getOneServiceHeaders()\r\n };\r\n return fetch(url, init).then(response => {\r\n if (!response.ok && response.status !== 401) {\r\n throw (`SD card bulk PDP call failed with ${response.status} and StatusText: ${response.statusText}`);\r\n }\r\n return response.json();\r\n }).then((data) => {\r\n perfMarker(\"SdPDPBulkFetchEnd\");\r\n const valueGroups = {};\r\n (data.value || []).forEach(value => {\r\n const values = valueGroups[value.targetType] || (valueGroups[value.targetType] = []);\r\n values.push(value);\r\n });\r\n pdpInfo.forEach(info => {\r\n // de-multiplex the batch result into individual results base on the inputs\r\n // and handle them individually\r\n const infoSlice = valueGroups[info.type] || [];\r\n fetchPdpComplete({ value: infoSlice }, info.id);\r\n });\r\n }).catch(reason => {\r\n perfMarker(\"SdPDPBulkFetchError\");\r\n logger.error(Object.assign(Object.assign({}, FetchPdpDataFailed), { message: \"PDP bulk data fetch failed for SD cards\", pb: Object.assign(Object.assign({}, FetchPdpDataFailed.pb), { customMessage: `Error: ${reason}. Url: ${url}` }) }));\r\n // de-multiplex the batch error\r\n pdpInfo.forEach(info => {\r\n fetchPdpComplete(null, info.id);\r\n });\r\n });\r\n}\r\n/**\r\n * Marks cache state complete for PDP Data fetch. Responds to any pending messages.\r\n * @param response - The response\r\n * @param id - The webworker messageId\r\n */\r\nfunction fetchPdpComplete(response, id) {\r\n logger.info(`WebWorker.fetchPDPComplete: [id ${id}]`);\r\n webWorkerCache.set(id, { payload: response });\r\n sendMessage({ id, fetched: true, payload: response });\r\n}\r\n/**\r\n * Invalidates pdp calls\r\n */\r\nexport function invalidateWeatherPdp() {\r\n logger.info(`WebWorker.InvalidatePdp: [id ${WebWorkerMessageId.InvalidateWeatherPdp}]`);\r\n webWorkerCache.delete(WebWorkerMessageId.WeatherPdp);\r\n sendMessage({ id: WebWorkerMessageId.InvalidateWeatherPdp, fetched: false, payload: null });\r\n}\r\n/**\r\n * Returns the pdp get Url\r\n * @param targetType - The target type to filter\r\n * @returns - The url\r\n */\r\nfunction getPdpUrl(targetTypes) {\r\n const isEnterpriseRequest = shouldMakeEnterpriseRequest();\r\n const userId = environment.userId && environment.userId.length ? `&user=${environment.userId}` : \"\";\r\n const activityId = environment.activityId && environment.activityId.length ? `&activityId=${tryReformatGuid(environment.activityId)}` : \"\";\r\n const fdhead = environment.currentFlights && environment.currentFlights.length ? `&fdhead=${environment.currentFlights}` : \"\";\r\n const ocid = \"&ocid=Peregrine\";\r\n const appAnonScn = \"&scn=APP_ANON\";\r\n const anonScn = \"&scn=ANON\";\r\n const aad = isEnterpriseRequest ? `&${aadTokenQsKey}=${aadTokenQsVal}` : \"\";\r\n const urlBase = shouldUseEnterpriseDomain() ? environment.enterpriseServiceUrlBase : environment.feedServiceUrlBase;\r\n const targetTypeFilter = targetTypes.map(targetType => `targetType eq '${targetType}'`).join(\" or \");\r\n const filterQueryString = `$filter=actionType eq 'Follow' and (${targetTypeFilter})`;\r\n // default count is 10 for individual calls, since we can't really guarantee we'll get 10 for each\r\n // during the bulk call, we'll use the count as a multipler factor and double it as a loose safety measure.\r\n const countFilter = `$top=${targetTypes.length * 10 * 2}`;\r\n let scn = \"\";\r\n switch (environment.pagetype) {\r\n case PageType.MMX:\r\n case PageType.DHP:\r\n case PageType.NTP:\r\n scn = appAnonScn;\r\n break;\r\n default:\r\n scn = anonScn;\r\n }\r\n const url = new URL(`graph/actions${urlBase.search || \"?\"}&apiKey=${environment.oneServiceApiKey}${activityId}${ocid}&market=${environment.locale}${userId}${fdhead}${scn}&${filterQueryString}&${countFilter}${aad}`, urlBase);\r\n return url.href;\r\n}\r\n/**\r\n * Checks if PDP data feature is enabled\r\n */\r\nexport function isPdpDataFeatureEnabled() {\r\n if (environment.isEnterpriseCompliantNTP) {\r\n return false;\r\n }\r\n return environment.apptype === AppType.Edge || environment.apptype === AppType.EdgeChromium || environment.apptype === AppType.Windows;\r\n}\r\n/**\r\n * Test only exports\r\n */\r\nexport const _fetchUserPdpData = fetchUserPdpData;\r\n//# sourceMappingURL=PdpCardData.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { AppType, ExperienceTypes, IndexedDBCache, PageType, WebWorkerMessageId, environment, logger, perfMarker, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { LocalNewsFetchFailed, LocalNewsLocationIdFetchFailed } from \"../AppErrors\";\r\nimport { aadTokenQsKey, aadTokenQsVal, getOneServiceHeaders, shouldMakeEnterpriseRequest, shouldUseEnterpriseDomain } from \"./OneServiceRequest\";\r\nimport { experienceConfigMap } from \"../wwResolver\";\r\nimport { get } from \"lodash-es\";\r\nimport { isPdpDataFeatureEnabled } from \"./PdpCardData\";\r\nimport { tryReformatGuid } from \"./Common\";\r\n/** Min Local News feed items required */\r\nconst minRequiredLocalNewsFeedItems = 5;\r\n/** Topics End Point */\r\nconst topicsEndPoint = \"https://assets.msn.com/service/\";\r\nconst LocalNewsDatabaseName = \"localNewsContent\";\r\nconst LocalNewsStoreName = \"LocalNews\";\r\nlet latLongLocation;\r\n/** Registers local news related tasks */\r\nexport function registerLocalNewsTasks() {\r\n if (!isFeatureEnabled()) {\r\n return;\r\n }\r\n latLongLocation = `lat-long-locationid-${environment.pcsApptype}`;\r\n createLocalNewsCache();\r\n // Wait for weather config\r\n experienceConfigMap.subscribe(ExperienceTypes.WeatherCard, (weatherConfig) => {\r\n const isLocalNewsEnabled = get(weatherConfig, \"properties.enableLocalNews\");\r\n // Do not fetch local news if local news is disabled in via config\r\n if (!isLocalNewsEnabled) {\r\n return;\r\n }\r\n if (isPdpDataFeatureEnabled()) {\r\n webWorkerCache.subscribe(WebWorkerMessageId.WeatherPdp, (data) => {\r\n const weatherPdpData = data && data.payload;\r\n fetchLocalNews(weatherPdpData);\r\n });\r\n }\r\n else {\r\n fetchLocalNews();\r\n }\r\n });\r\n}\r\nexport let localNewsCache;\r\n/** Makes fetch call for local news and marks cache state as fetching item. */\r\nexport function fetchLocalNews(weatherPdpData) {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const locationInfo = getActiveWeatherLocation(weatherPdpData);\r\n if (!locationInfo) {\r\n return;\r\n }\r\n const ocidLocalNews = getOneServiceOCIDLocal();\r\n perfMarker(\"fetchLocalNewsStart\");\r\n const locationData = {\r\n lat: locationInfo.latitude,\r\n long: locationInfo.longitude,\r\n id: latLongLocation,\r\n storageTimestamp: Date.now()\r\n };\r\n try {\r\n yield localNewsCache.initialize();\r\n // Always check if there is entry in cache and then avoid making calls.\r\n const data = localNewsCache.get(latLongLocation);\r\n if (data && data.lat && data.long && data.lat === locationInfo.latitude && data.long === locationInfo.longitude) {\r\n return;\r\n }\r\n const url = getLocalNewsUrl(locationInfo, ocidLocalNews);\r\n const init = {\r\n credentials: \"include\",\r\n headers: getOneServiceHeaders()\r\n };\r\n const response = yield fetch(url, init);\r\n if (response && !response.ok) {\r\n throw Error(\"fetchLocal News call failed\");\r\n }\r\n const responseData = yield response.json();\r\n const locationId = responseData && responseData.id;\r\n if (locationId) {\r\n const isLocalNewsPresent = yield fetchLocalNewsForLocationId(locationId, ocidLocalNews);\r\n localNewsCache.set(latLongLocation, Object.assign(Object.assign({}, locationData), { locationId,\r\n isLocalNewsPresent }));\r\n localNewsCache.saveToIndexedDB();\r\n return;\r\n }\r\n logger.info(\"WebWorker.fetchLocalNews: Insufficient local news\");\r\n localNewsCache.set(latLongLocation, Object.assign(Object.assign({}, locationData), { locationId: null, isLocalNewsPresent: false }));\r\n localNewsCache.saveToIndexedDB();\r\n fetchLocalNewsComplete(false);\r\n }\r\n catch (ex) {\r\n logger.error(Object.assign(Object.assign({}, LocalNewsFetchFailed), { message: \"LocalNews failed\", pb: Object.assign(Object.assign({}, LocalNewsFetchFailed.pb), { customMessage: `Error: ${ex}. Details: ${JSON.stringify(locationData)}.` }) }));\r\n localNewsCache.set(latLongLocation, Object.assign(Object.assign({}, locationData), { locationId: null, isLocalNewsPresent: false }));\r\n localNewsCache.saveToIndexedDB();\r\n fetchLocalNewsComplete(false);\r\n }\r\n });\r\n}\r\n/** Makes fetch call for local news and marks cache state as fetching item.\r\n * @returns boolean represents whether sufficient local news is present or not\r\n */\r\nexport function fetchLocalNewsForLocationId(locationId, ocidLocalNews) {\r\n const url = getLocalNewsUrlForLocationId(locationId, ocidLocalNews);\r\n const init = {\r\n credentials: \"include\",\r\n headers: getOneServiceHeaders()\r\n };\r\n return fetch(url, init).then((response) => {\r\n if (!response.ok) {\r\n throw Error(`fetchLocal News call failed with status code [${response.status}] for url: ${url}`);\r\n }\r\n return response.json();\r\n }).then(data => {\r\n if (data && data.feedItems && data.feedItems.length >= minRequiredLocalNewsFeedItems) {\r\n fetchLocalNewsComplete(true);\r\n return true;\r\n }\r\n else {\r\n logger.info(\"WebWorker.fetchLocalNews: Insufficient local news\");\r\n fetchLocalNewsComplete(false);\r\n return false;\r\n }\r\n }).catch(reason => {\r\n logger.error(Object.assign(Object.assign({}, LocalNewsLocationIdFetchFailed), { message: \"LocalNews fetch failed for location\", pb: Object.assign(Object.assign({}, LocalNewsLocationIdFetchFailed.pb), { customMessage: `Error: ${reason}. LocationId: ${locationId}. ocidLocalNews: ${ocidLocalNews}` }) }));\r\n fetchLocalNewsComplete(false);\r\n return false;\r\n });\r\n}\r\n/** Marks cache state complete for local news fetch. Responds to any pending message for app anon cookie. */\r\nexport function fetchLocalNewsComplete(isLocalNewsPresent) {\r\n perfMarker(\"fetchLocalNewsEnd\");\r\n logger.info(`WebWorker.fetchLocalNewsComplete: [id ${WebWorkerMessageId.LocalNews}]`);\r\n webWorkerCache.set(WebWorkerMessageId.LocalNews, { payload: { isLocalNewsPresent } });\r\n sendMessage({ id: WebWorkerMessageId.LocalNews, fetched: true, payload: { isLocalNewsPresent } });\r\n}\r\n/** Gets the active weather location */\r\nfunction getActiveWeatherLocation(weatherPdpData) {\r\n if (weatherPdpData) {\r\n const { value = [] } = weatherPdpData;\r\n const pdpResponse = convertPdpDataToPdpResponse(value);\r\n if (pdpResponse && pdpResponse.myLocation && pdpResponse.myLocation.latitude && pdpResponse.myLocation.longitude) {\r\n return pdpResponse.myLocation;\r\n }\r\n }\r\n return environment.detectLocationCookie ? getGeoLocation() : (getHomeLocationfromCookies() || getGeoLocation());\r\n}\r\n/**\r\n * Returns the pdp get Url\r\n * @param locationInfo location information\r\n * @param ocidLocalNews the ocid for local news feed\r\n * @returns - The url\r\n */\r\nfunction getLocalNewsUrl(locationInfo, ocidLocalNews) {\r\n const isEnterpriseRequest = shouldMakeEnterpriseRequest();\r\n const isEnterpriseDomain = shouldUseEnterpriseDomain();\r\n const activityId = environment.activityId && environment.activityId.length ? `&activityId=${tryReformatGuid(environment.activityId)}` : \"\";\r\n const fdhead = environment.currentFlights && environment.currentFlights.length ? `&fdhead=${environment.currentFlights}` : \"\";\r\n const ocid = `&ocid=${ocidLocalNews}`;\r\n const locationParam = `&query=location:${locationInfo.latitude}|${locationInfo.longitude}`;\r\n const wrapData = \"&wrapodata=false\";\r\n const disableSerialization = \"&DisableTypeSerialization=true\";\r\n const aad = isEnterpriseRequest ? `&${aadTokenQsKey}=${aadTokenQsVal}` : \"\";\r\n const urlHref = isEnterpriseDomain ? environment.enterpriseServiceUrlBase : environment.feedServiceUrlBase;\r\n if (!isEnterpriseDomain) {\r\n urlHref.href = topicsEndPoint;\r\n }\r\n const url = new URL(`news/topics${urlHref.search || \"?\"}&apiKey=${environment.oneServiceApiKey}${activityId}${ocid}&market=${environment.locale}${fdhead}${locationParam}${wrapData}${disableSerialization}${aad}`, urlHref);\r\n return url.href;\r\n}\r\n/**\r\n * Returns the pdp get Url\r\n * @param location id\r\n * @returns - The url\r\n */\r\nfunction getLocalNewsUrlForLocationId(locationId, ocidLocalNews) {\r\n const isEnterpriseRequest = shouldMakeEnterpriseRequest();\r\n const activityId = environment.activityId && environment.activityId.length ? `&activityId=${tryReformatGuid(environment.activityId)}` : \"\";\r\n const fdhead = environment.currentFlights && environment.currentFlights.length ? `&fdhead=${environment.currentFlights}` : \"\";\r\n const ocid = `&ocid=${ocidLocalNews}`;\r\n const locationParam = `&ids=${locationId}`;\r\n const wrapData = \"&wrapodata=false\";\r\n const disableSerialization = \"&DisableTypeSerialization=true\";\r\n const topParam = \"&$top=5\";\r\n const responseSchema = \"&responseschema=flatview\";\r\n const aad = isEnterpriseRequest ? `&${aadTokenQsKey}=${aadTokenQsVal}` : \"\";\r\n const urlBase = shouldUseEnterpriseDomain() ? environment.enterpriseServiceUrlBase : environment.feedServiceUrlBase;\r\n const url = new URL(`msn/feed${urlBase.search || \"?\"}&apiKey=${environment.oneServiceApiKey}${activityId}${ocid}&market=${environment.locale}${fdhead}${locationParam}${responseSchema}${wrapData}${disableSerialization}${topParam}${aad}`, urlBase);\r\n return url.href;\r\n}\r\n/**\r\n * Get home location from cookies\r\n */\r\nfunction getHomeLocationfromCookies() {\r\n const homeLocationCookie = environment.homeLocationCookie;\r\n if (!homeLocationCookie || !homeLocationCookie.length) {\r\n return null;\r\n }\r\n const values = homeLocationCookie.split(\"|\");\r\n if (values.length > 3 && values[2] && values[3]) {\r\n return {\r\n longitude: decodeURIComponent(values[3]),\r\n latitude: decodeURIComponent(values[2]),\r\n locality: values[4] && decodeURIComponent(values[4]),\r\n region: values[5] && decodeURIComponent(values[5]),\r\n country: values[6] && decodeURIComponent(values[6])\r\n };\r\n }\r\n}\r\n/**\r\n * Get geo Location, this should come from PCS\r\n */\r\nexport function getGeoLocation() {\r\n const { latitude, longitude } = environment;\r\n return {\r\n latitude,\r\n longitude\r\n };\r\n}\r\n/**\r\n * Convert PDP Data to PDP Response\r\n * @returns {WeatherPdpResponse} WeatherPdpResponse\r\n *\r\n */\r\nfunction convertPdpDataToPdpResponse(response) {\r\n if (!response || !response.length) {\r\n return null;\r\n }\r\n const defaultLocations = response.filter(value => value.degree === \"DefaultLocation\");\r\n const homeLocation = (defaultLocations && defaultLocations.length > 0) ?\r\n defaultLocations.sort((a, b) => new Date(b.updatedDateTime).valueOf() - new Date(a.updatedDateTime).valueOf())[0] :\r\n null;\r\n if (!homeLocation || !homeLocation.definitionName) {\r\n return null;\r\n }\r\n const latLong = homeLocation && homeLocation.definitionName && homeLocation.definitionName.split(\",\");\r\n let myLocation = null;\r\n if (latLong && latLong.length > 1) {\r\n myLocation = {\r\n latitude: latLong[0],\r\n longitude: latLong[1],\r\n locality: homeLocation.metadata && homeLocation.metadata.city,\r\n region: homeLocation.metadata && homeLocation.metadata.state,\r\n country: homeLocation.metadata && homeLocation.metadata.countryRegion,\r\n displayName: \"\",\r\n isoCode: homeLocation.metadata && homeLocation.metadata.isoCode\r\n };\r\n }\r\n const mysetting = (homeLocation.metadata && homeLocation.metadata.displayunit === \"2\") ? WeatherUnit.Celsius : WeatherUnit.Fahrenheit;\r\n return {\r\n myLocation,\r\n unit: mysetting,\r\n favLocations: response.filter(value => value.degree === \"FavoriteLocation\")\r\n };\r\n}\r\n/**\r\n * Returns the OCID very specific for local news\r\n * @returns {string}\r\n */\r\nexport function getOneServiceOCIDLocal() {\r\n switch (environment.apptype) {\r\n case AppType.Edge:\r\n if (environment.pagetype === PageType.DHP) {\r\n return \"spartan-dhp-local\";\r\n }\r\n if (environment.pagetype === PageType.NTP) {\r\n return \"spartan-ntp-local\";\r\n }\r\n return \"peregrine\";\r\n case AppType.EdgeChromium:\r\n if (environment.pagetype === PageType.DHP) {\r\n return \"anaheim-dhp-local\";\r\n }\r\n if (environment.pagetype === PageType.NTP) {\r\n return \"anaheim-ntp-local\";\r\n }\r\n return \"peregrine\";\r\n case AppType.MicrosoftNews:\r\n return \"msftnews-msnews-local\";\r\n default:\r\n return \"peregrine\";\r\n }\r\n}\r\n/**\r\n * Creates local new indexed db cache instance\r\n * @param storeName - the name of the indexeddb store\r\n */\r\nexport function createLocalNewsCache() {\r\n localNewsCache = new IndexedDBCache({\r\n dbName: LocalNewsDatabaseName,\r\n storeName: LocalNewsStoreName,\r\n indexName: `lat-long-locationid-${environment.pcsApptype}`,\r\n convertToMap: (data) => {\r\n return new Map().set(data.id, data);\r\n }\r\n });\r\n}\r\n/**\r\n * Check if local news feature is enabled.\r\n * @returns true if enabled.\r\n */\r\nfunction isFeatureEnabled() {\r\n const { apptype } = environment;\r\n return apptype === AppType.EdgeChromium || apptype === AppType.SuperApp || apptype === AppType.Windows;\r\n}\r\n/**\r\n * The Weather Units\r\n * @export\r\n * @interface\r\n */\r\nexport var WeatherUnit;\r\n(function (WeatherUnit) {\r\n WeatherUnit[WeatherUnit[\"Fahrenheit\"] = 1] = \"Fahrenheit\";\r\n WeatherUnit[WeatherUnit[\"Celsius\"] = 2] = \"Celsius\";\r\n})(WeatherUnit || (WeatherUnit = {}));\r\n//# sourceMappingURL=LocalNews.js.map","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * The audience mode enum\r\n */\r\nexport var AudienceModeType;\r\n(function (AudienceModeType) {\r\n AudienceModeType[\"Adult\"] = \"adult\";\r\n AudienceModeType[\"Enterprise\"] = \"enterprise\";\r\n AudienceModeType[\"Kids\"] = \"kids\";\r\n})(AudienceModeType || (AudienceModeType = {}));\r\n//# sourceMappingURL=AudienceModeType.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { AppType, ExperienceTypes, PageType, WebWorkerMessageId, environment, logger, perfMarker, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { getExperienceTypeConfig } from \"../wwResolver\";\r\nimport { FetchAppAnonFailed } from \"../AppErrors\";\r\nimport { defaultOneServiceOcid, subscribeToExperienceConfig } from \"./Common\";\r\nimport { get } from \"lodash-es\";\r\nimport { registerDataMessageHandler } from \"../wwCommon\";\r\n/** Makes fetch call for app anon cookie and marks cache state as fetching item. */\r\nexport function registerFetchAppAnonCookie() {\r\n if (!isFeatureEnabled()) {\r\n return;\r\n }\r\n registerDataMessageHandler(WebWorkerMessageId.AppAnonCookie, () => {\r\n // Subscribe to the web worker cache, which returns immediately if the response already exists or is added\r\n const appAnonCookieSubscription = webWorkerCache.subscribe(WebWorkerMessageId.AppAnonCookie, appAnonCookieResponse => {\r\n appAnonCookieSubscription.unsubscribe();\r\n sendMessage({ id: WebWorkerMessageId.AppAnonCookie, fetched: true, payload: appAnonCookieResponse.payload });\r\n });\r\n });\r\n fetchAppAnonCookie();\r\n}\r\nfunction fetchAppAnonCookie() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n const entryPointConfigType = environment.apptype === AppType.EdgeChromium ?\r\n ExperienceTypes.EntryPointEdgeNext : ExperienceTypes.EntryPoint;\r\n yield subscribeToExperienceConfig(entryPointConfigType);\r\n perfMarker(\"AppAnonFetchStart\");\r\n const entryPointConfig = getExperienceTypeConfig(entryPointConfigType);\r\n const useOneServiceAuthEndpoints = get(entryPointConfig, \"properties.useOneServiceAuthEndpoints\");\r\n let url;\r\n if (useOneServiceAuthEndpoints) {\r\n url = `https://api.msn.com/auth/cookie/appanon?scn=app_anon&ocid=${defaultOneServiceOcid}&apikey=${environment.oneServiceApiKey}`;\r\n }\r\n else {\r\n url = `${environment.domain}/spartan/${environment.locale}/getappanoncookie`;\r\n }\r\n const init = {\r\n credentials: \"include\"\r\n };\r\n // add a test hook so AppAnon and aace cookies are not cleared out and refetched\r\n if (environment && environment.getQueryParameter(\"isAutomation\") === \"true\") {\r\n fetchAppAnonCookieComplete(true);\r\n return Promise.resolve(true);\r\n }\r\n if (environment && !environment.signedIn) {\r\n return fetch(url, init).then((response) => {\r\n if (!response.ok) {\r\n throw Error(`fetchAppAnonCookie call failed: Status: ${response.status} and StatusText: ${response.statusText}`);\r\n }\r\n return true;\r\n }).then(appAnonCookieExists => {\r\n fetchAppAnonCookieComplete(appAnonCookieExists);\r\n return true;\r\n }).catch(reason => {\r\n logger.error(Object.assign(Object.assign({}, FetchAppAnonFailed), { message: \"AppAnon cookie fetch failed\", pb: Object.assign(Object.assign({}, FetchAppAnonFailed.pb), { customMessage: `Error: ${reason} for Url: ${url}` }) }));\r\n fetchAppAnonCookieComplete();\r\n return false;\r\n });\r\n }\r\n fetch(url, init);\r\n fetchAppAnonCookieComplete(true);\r\n return Promise.resolve(true);\r\n });\r\n}\r\n/** Marks cache state complete for app anon cookie fetch. Responds to any pending message for app anon cookie. */\r\nfunction fetchAppAnonCookieComplete(appAnonCookieExists = false) {\r\n perfMarker(\"AppAnonFetchEnd\");\r\n logger.info(`WebWorker.fetchAppAnonCookieComplete: [id ${WebWorkerMessageId.AppAnonCookie}]`);\r\n webWorkerCache.set(WebWorkerMessageId.AppAnonCookie, { payload: { appAnonCookieExists } });\r\n}\r\n/** Checks if AppAnonCookie feature is enabled */\r\nfunction isFeatureEnabled() {\r\n // Disable the getappanoncookie call on the China ntp\r\n const locale = environment.locale;\r\n if (locale === \"zh-cn\" && location.host.includes(\".msn.cn\")) {\r\n return false;\r\n }\r\n // Disable the getappanoncookie call on the Enterprise blended page\r\n if (environment.isEnterpriseCompliantNTP) {\r\n return false;\r\n }\r\n return environment.apptype === AppType.Edge ||\r\n environment.apptype === AppType.EdgeChromium ||\r\n environment.apptype === AppType.MMX ||\r\n environment.pagetype === PageType.NewsBar;\r\n}\r\n//# sourceMappingURL=AppAnonCookie.js.map","// © Microsoft Corporation. All rights reserved.\r\nimport { __awaiter } from \"tslib\";\r\nimport { AppType, ExperienceTypes, UrlSearchParamsHelper, WebWorkerMessageId, environment, logger, perfMarker, sendMessage, webWorkerCache } from \"../wwCommon\";\r\nimport { aadTokenQsKey, aadTokenQsVal, getOneServiceFeedCallHeaders } from \"./OneServiceRequest\";\r\nimport { subscribeToExperienceConfig, tryReformatGuid, trySetSearchParam } from \"./Common\";\r\nimport { FetchIndustryNewsArticlesFailed } from \"../AppErrors\";\r\nimport { get } from \"lodash-es\";\r\nimport { getExperienceTypeConfig } from \"../wwResolver\";\r\nimport { oneServiceQueryStringKeys } from \"./OneServiceConstants\";\r\nimport { registerDataMessageHandler } from \"../wwCommon\";\r\n/** Makes fetch call for Industry News Articles and sets the response in the web worker cache */\r\nexport function registerFetchIndustryNewsArticles() {\r\n if (!isFeatureEnabled()) {\r\n return;\r\n }\r\n registerDataMessageHandler(WebWorkerMessageId.IndustryNewsArticles, () => {\r\n // Subscribe to the web worker cache, which returns immediately if the response already exists or is added\r\n const industryNewsArticlesSubscription = webWorkerCache.subscribe(WebWorkerMessageId.IndustryNewsArticles, industryNewsArticlesResponse => {\r\n industryNewsArticlesSubscription.unsubscribe();\r\n sendMessage({ id: WebWorkerMessageId.IndustryNewsArticles, fetched: true, payload: industryNewsArticlesResponse.payload });\r\n });\r\n });\r\n // wait for the auth token to be fetched\r\n const subscription = webWorkerCache.subscribe(WebWorkerMessageId.AuthToken, (data) => {\r\n subscription.unsubscribe();\r\n // wait for the Industry News Card configs to be loaded\r\n // the OCID value from the config is required to make the article fetch call\r\n subscribeToExperienceConfig(ExperienceTypes.IndustryNewsCard).then(() => {\r\n fetchIndustryNewsArticles();\r\n });\r\n });\r\n}\r\n/** Fetches the industry news articles */\r\nfunction fetchIndustryNewsArticles() {\r\n return __awaiter(this, void 0, void 0, function* () {\r\n perfMarker(`${WebWorkerMessageId.IndustryNewsArticles}FetchStart`);\r\n const url = getUrl();\r\n if (!url) {\r\n onFetchComplete();\r\n return;\r\n }\r\n const init = {\r\n method: \"GET\",\r\n headers: getOneServiceFeedCallHeaders(true /* useEnterpriseHeaders */)\r\n };\r\n return fetch(url.toString(), init).then(response => {\r\n if (!response.ok) {\r\n throw Error(`fetchIndustryNewsArticles call failed: Status: ${response.status} and StatusText: ${response.statusText}`);\r\n }\r\n // Handle No-Content response\r\n if (response.status === 204) {\r\n // return an empty response according to the response schema\r\n return { subCards: [] };\r\n }\r\n return response.json();\r\n }).then(data => {\r\n if (!Array.isArray(data.subCards) || data.subCards.length === 0) {\r\n logger.error(Object.assign(Object.assign({}, FetchIndustryNewsArticlesFailed), { message: \"WW Industry News Article fetch response was empty\" }));\r\n }\r\n onFetchComplete(data);\r\n }).catch(reason => {\r\n logger.error(Object.assign(Object.assign({}, FetchIndustryNewsArticlesFailed), { message: \"WW Industry News Article fetch failed\", pb: Object.assign(Object.assign({}, FetchIndustryNewsArticlesFailed.pb), { customMessage: `Error: ${reason} for Url: ${url}` }) }));\r\n onFetchComplete();\r\n });\r\n });\r\n}\r\n/** Generates the URL used to fetch the industry news articles */\r\nfunction getUrl() {\r\n const requestPath = \"MSN/Feed/me\";\r\n const urlBase = environment.enterpriseServiceUrlBase;\r\n const url = new URL(requestPath, urlBase);\r\n const urlSearchParams = new UrlSearchParamsHelper(urlBase.search);\r\n setDefaultSearchParams(urlSearchParams);\r\n url.search = urlSearchParams.toString();\r\n return url;\r\n}\r\n/** Sets the default QSPs for the industry news articles fetch */\r\nfunction setDefaultSearchParams(urlSearchParams) {\r\n // get the ocid from the industry news card configs rather than based on page type\r\n const industryNewsConfig = getExperienceTypeConfig(ExperienceTypes.IndustryNewsCard);\r\n const industryNewsOcid = get(industryNewsConfig, \"properties.requestOptions.ocid\");\r\n urlSearchParams.set(oneServiceQueryStringKeys.apiKey, environment.oneServiceApiKey)\r\n .set(oneServiceQueryStringKeys.queryType, \"myfeed\")\r\n .set(oneServiceQueryStringKeys.ocid, industryNewsOcid || \"Peregrine\")\r\n .set(oneServiceQueryStringKeys.market, environment.locale)\r\n .set(oneServiceQueryStringKeys.responseSchema, \"cardview\")\r\n .set(oneServiceQueryStringKeys.wrapOData, \"false\")\r\n .set(oneServiceQueryStringKeys.disableTypeSerialization, \"true\")\r\n .set(oneServiceQueryStringKeys.timeOut, \"3000\")\r\n .set(oneServiceQueryStringKeys.top, \"4\")\r\n .set(oneServiceQueryStringKeys.query, \"worknews\")\r\n .set(oneServiceQueryStringKeys.contentType, \"article,video,slideshow,webcontent\")\r\n .set(aadTokenQsKey, aadTokenQsVal);\r\n if (environment.latitude && environment.longitude) {\r\n urlSearchParams.set(oneServiceQueryStringKeys.location, `${environment.latitude}|${environment.longitude}`);\r\n }\r\n if (!environment.sendFeedCallActivityIdInHeader) {\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.activityId, tryReformatGuid(environment.activityId));\r\n }\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.user, environment.userId);\r\n trySetSearchParam(urlSearchParams, oneServiceQueryStringKeys.fdhead, environment.currentFlights);\r\n urlSearchParams.set(oneServiceQueryStringKeys.user, environment.userId);\r\n}\r\n/** Marks cache state complete for industry news articles fetch. Responds to any pending message for the industry news articles. */\r\nfunction onFetchComplete(responseData) {\r\n perfMarker(`${WebWorkerMessageId.IndustryNewsArticles}FetchEnd`);\r\n logger.info(`WebWorker.fetchIndustryNewsArticlesComplete: [id ${WebWorkerMessageId.IndustryNewsArticles}]`);\r\n webWorkerCache.set(WebWorkerMessageId.IndustryNewsArticles, { payload: { responseData } });\r\n}\r\n/** Checks if IndustryNewsCard feature is enabled */\r\nfunction isFeatureEnabled() {\r\n // Enable the call only the Enterprise blended page\r\n if (!environment.isEnterpriseCompliantNTP) {\r\n return false;\r\n }\r\n // Enable this fetch only on EdgeChromium\r\n return environment.apptype === AppType.EdgeChromium;\r\n}\r\n//# sourceMappingURL=IndustryNewsArticles.js.map","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n environment,\r\n initializeMessageHandler,\r\n loadConfigTree,\r\n perfMarker,\r\n registerConfigResolverTasks,\r\n registerContentPreviewTasks,\r\n registerFeedDisplaySettingListener,\r\n registerFetchAppAnonCookie,\r\n registerFetchIndustryNewsArticles,\r\n registerLocalNewsTasks,\r\n registerMyBriefingTasksForEdgeChromium,\r\n registerOneServiceFeedTasksForEdgeChromium,\r\n registerOneServiceTokenListener,\r\n registerPdpTasks,\r\n registerWpoFeedTasksForEdgeChromium\r\n} from \"@msnews/web-worker\";\r\n\r\nimport { AudienceModeType } from \"@msnews/config-data-types\";\r\n\r\n(() => {\r\n // since we can't use perfMarker until after environment is initialized,\r\n // capture the raw time offset at start now, so we can use it after init.\r\n const startTime = performance.now();\r\n\r\n // Initialize environment variables\r\n environment.init();\r\n\r\n // record with the custom time we saved earlier once environment has been fully initialized.\r\n perfMarker(\"Start\", startTime);\r\n\r\n // Add message listener first to avoid missing messages from main thread\r\n initializeMessageHandler();\r\n\r\n // Add listener for feed display setting. This is Anaheim specific\r\n registerFeedDisplaySettingListener();\r\n\r\n // Add listener for Edge Chromium AadToken\r\n registerOneServiceTokenListener();\r\n\r\n // Register tasks dependent on/should wait for other tasks here\r\n registerConfigResolverTasks();\r\n\r\n // These markets are running on pure React by default still\r\n const pureReactMarkets = new Set([\"ko-kr\", \"ja-jp\", \"ru-ru\"]);\r\n if (environment.currentFlights && (environment.currentFlights.includes(\"prg-webcomp\")\r\n || environment.currentFlights.includes(\"prg-wpo-singcol2\")\r\n || environment.currentFlights.includes(\"prg-northstar\")\r\n || (!pureReactMarkets.has(environment.locale) && environment.audienceMode !== AudienceModeType.Enterprise))) {\r\n registerWpoFeedTasksForEdgeChromium();\r\n } else {\r\n registerOneServiceFeedTasksForEdgeChromium();\r\n }\r\n\r\n registerMyBriefingTasksForEdgeChromium();\r\n registerContentPreviewTasks();\r\n registerPdpTasks();\r\n registerLocalNewsTasks();\r\n registerFetchAppAnonCookie();\r\n registerFetchIndustryNewsArticles();\r\n\r\n // Start independent tasks here\r\n loadConfigTree();\r\n})();\r\n"],"sourceRoot":""}