Full Code of TeamNewPipe/NewPipe for AI

dev 515bb6e94de5 cached
3907 files
9.8 MB
2.8M tokens
4018 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (11,031K chars total). Download the full file to get everything.
Repository: TeamNewPipe/NewPipe
Branch: dev
Commit: 515bb6e94de5
Files: 3907
Total size: 9.8 MB

Directory structure:
gitextract_066mfw7c/

├── .editorconfig
├── .github/
│   ├── CONTRIBUTING.md
│   ├── DISCUSSION_TEMPLATE/
│   │   └── questions.yml
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── changed-lines-count-labeler.yml
│   └── workflows/
│       ├── backport-pr.yml
│       ├── build-release-apk.yml
│       ├── ci.yml
│       ├── image-minimizer.js
│       ├── image-minimizer.yml
│       ├── no-response.yml
│       └── pr-labeler.yml
├── .gitignore
├── LICENSE
├── README.md
├── app/
│   ├── build.gradle.kts
│   ├── lint.xml
│   ├── proguard-rules.pro
│   ├── sampledata/
│   │   └── channels.json
│   ├── schemas/
│   │   └── org.schabi.newpipe.database.AppDatabase/
│   │       ├── 2.json
│   │       ├── 3.json
│   │       ├── 4.json
│   │       ├── 5.json
│   │       ├── 6.json
│   │       ├── 7.json
│   │       ├── 8.json
│   │       └── 9.json
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── org/
│       │           └── schabi/
│       │               └── newpipe/
│       │                   ├── database/
│       │                   │   ├── DatabaseMigrationTest.kt
│       │                   │   └── FeedDAOTest.kt
│       │                   ├── error/
│       │                   │   └── ErrorInfoTest.java
│       │                   ├── local/
│       │                   │   ├── history/
│       │                   │   │   └── HistoryRecordManagerTest.kt
│       │                   │   ├── playlist/
│       │                   │   │   └── LocalPlaylistManagerTest.kt
│       │                   │   └── subscription/
│       │                   │       └── SubscriptionManagerTest.java
│       │                   ├── testUtil/
│       │                   │   ├── TestDatabase.kt
│       │                   │   └── TrampolineSchedulerRule.kt
│       │                   └── util/
│       │                       └── StreamItemAdapterTest.kt
│       ├── debug/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── org/
│       │           └── schabi/
│       │               └── newpipe/
│       │                   ├── DebugApp.kt
│       │                   └── settings/
│       │                       └── DebugSettingsBVDLeakCanary.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   ├── apache2.html
│       │   │   ├── epl1.html
│       │   │   ├── gpl_3.html
│       │   │   ├── mit.html
│       │   │   ├── mpl2.html
│       │   │   └── po_token.html
│       │   ├── java/
│       │   │   ├── androidx/
│       │   │   │   └── fragment/
│       │   │   │       └── app/
│       │   │   │           └── FragmentStatePagerAdapterMenuWorkaround.java
│       │   │   ├── com/
│       │   │   │   └── google/
│       │   │   │       └── android/
│       │   │   │           └── material/
│       │   │   │               └── appbar/
│       │   │   │                   └── FlingBehavior.java
│       │   │   ├── org/
│       │   │   │   ├── apache/
│       │   │   │   │   └── commons/
│       │   │   │   │       └── text/
│       │   │   │   │           └── similarity/
│       │   │   │   │               └── FuzzyScore.java
│       │   │   │   └── schabi/
│       │   │   │       └── newpipe/
│       │   │   │           ├── App.kt
│       │   │   │           ├── BaseFragment.java
│       │   │   │           ├── DownloaderImpl.java
│       │   │   │           ├── ExitActivity.kt
│       │   │   │           ├── MainActivity.java
│       │   │   │           ├── NewPipeDatabase.kt
│       │   │   │           ├── NewVersionWorker.kt
│       │   │   │           ├── PanicResponderActivity.java
│       │   │   │           ├── QueueItemMenuUtil.java
│       │   │   │           ├── RouterActivity.java
│       │   │   │           ├── about/
│       │   │   │           │   ├── AboutActivity.kt
│       │   │   │           │   ├── License.kt
│       │   │   │           │   ├── LicenseFragment.kt
│       │   │   │           │   ├── LicenseFragmentHelper.kt
│       │   │   │           │   ├── SoftwareComponent.kt
│       │   │   │           │   └── StandardLicenses.kt
│       │   │   │           ├── database/
│       │   │   │           │   ├── AppDatabase.kt
│       │   │   │           │   ├── BasicDAO.kt
│       │   │   │           │   ├── Converters.kt
│       │   │   │           │   ├── LocalItem.kt
│       │   │   │           │   ├── Migrations.kt
│       │   │   │           │   ├── feed/
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── FeedDAO.kt
│       │   │   │           │   │   │   └── FeedGroupDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── FeedEntity.kt
│       │   │   │           │   │       ├── FeedGroupEntity.kt
│       │   │   │           │   │       ├── FeedGroupSubscriptionEntity.kt
│       │   │   │           │   │       └── FeedLastUpdatedEntity.kt
│       │   │   │           │   ├── history/
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── SearchHistoryDAO.kt
│       │   │   │           │   │   │   └── StreamHistoryDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── SearchHistoryEntry.kt
│       │   │   │           │   │       ├── StreamHistoryEntity.kt
│       │   │   │           │   │       └── StreamHistoryEntry.kt
│       │   │   │           │   ├── playlist/
│       │   │   │           │   │   ├── PlaylistDuplicatesEntry.kt
│       │   │   │           │   │   ├── PlaylistLocalItem.kt
│       │   │   │           │   │   ├── PlaylistMetadataEntry.kt
│       │   │   │           │   │   ├── PlaylistStreamEntry.kt
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── PlaylistDAO.kt
│       │   │   │           │   │   │   ├── PlaylistRemoteDAO.kt
│       │   │   │           │   │   │   └── PlaylistStreamDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── PlaylistEntity.kt
│       │   │   │           │   │       ├── PlaylistRemoteEntity.kt
│       │   │   │           │   │       └── PlaylistStreamEntity.kt
│       │   │   │           │   ├── stream/
│       │   │   │           │   │   ├── StreamStatisticsEntry.kt
│       │   │   │           │   │   ├── StreamWithState.kt
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── StreamDAO.kt
│       │   │   │           │   │   │   └── StreamStateDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── StreamEntity.kt
│       │   │   │           │   │       └── StreamStateEntity.kt
│       │   │   │           │   └── subscription/
│       │   │   │           │       ├── NotificationMode.kt
│       │   │   │           │       ├── SubscriptionDAO.kt
│       │   │   │           │       └── SubscriptionEntity.kt
│       │   │   │           ├── download/
│       │   │   │           │   ├── DownloadActivity.java
│       │   │   │           │   ├── DownloadDialog.java
│       │   │   │           │   └── LoadingDialog.java
│       │   │   │           ├── error/
│       │   │   │           │   ├── AcraReportSender.java
│       │   │   │           │   ├── AcraReportSenderFactory.java
│       │   │   │           │   ├── ErrorActivity.kt
│       │   │   │           │   ├── ErrorInfo.kt
│       │   │   │           │   ├── ErrorPanelHelper.kt
│       │   │   │           │   ├── ErrorUtil.kt
│       │   │   │           │   ├── ReCaptchaActivity.java
│       │   │   │           │   └── UserAction.kt
│       │   │   │           ├── fragments/
│       │   │   │           │   ├── BackPressable.java
│       │   │   │           │   ├── BaseStateFragment.java
│       │   │   │           │   ├── BlankFragment.java
│       │   │   │           │   ├── EmptyFragment.java
│       │   │   │           │   ├── MainFragment.java
│       │   │   │           │   ├── OnScrollBelowItemsListener.java
│       │   │   │           │   ├── ViewContract.java
│       │   │   │           │   ├── detail/
│       │   │   │           │   │   ├── BaseDescriptionFragment.java
│       │   │   │           │   │   ├── DescriptionFragment.java
│       │   │   │           │   │   ├── StackItem.java
│       │   │   │           │   │   ├── TabAdapter.java
│       │   │   │           │   │   ├── VideoDetailFragment.java
│       │   │   │           │   │   └── VideoDetailPlayerCrasher.java
│       │   │   │           │   └── list/
│       │   │   │           │       ├── BaseListFragment.java
│       │   │   │           │       ├── BaseListInfoFragment.java
│       │   │   │           │       ├── ListViewContract.java
│       │   │   │           │       ├── channel/
│       │   │   │           │       │   ├── ChannelAboutFragment.java
│       │   │   │           │       │   ├── ChannelFragment.java
│       │   │   │           │       │   └── ChannelTabFragment.java
│       │   │   │           │       ├── comments/
│       │   │   │           │       │   ├── CommentRepliesFragment.java
│       │   │   │           │       │   ├── CommentRepliesInfo.java
│       │   │   │           │       │   └── CommentsFragment.java
│       │   │   │           │       ├── kiosk/
│       │   │   │           │       │   ├── DefaultKioskFragment.java
│       │   │   │           │       │   └── KioskFragment.java
│       │   │   │           │       ├── playlist/
│       │   │   │           │       │   ├── PlaylistControlViewHolder.java
│       │   │   │           │       │   └── PlaylistFragment.java
│       │   │   │           │       ├── search/
│       │   │   │           │       │   ├── SearchFragment.java
│       │   │   │           │       │   ├── SuggestionItem.kt
│       │   │   │           │       │   └── SuggestionListAdapter.kt
│       │   │   │           │       └── videos/
│       │   │   │           │           ├── RelatedItemsFragment.java
│       │   │   │           │           └── RelatedItemsInfo.java
│       │   │   │           ├── info_list/
│       │   │   │           │   ├── InfoItemBuilder.kt
│       │   │   │           │   ├── InfoListAdapter.java
│       │   │   │           │   ├── ItemViewMode.kt
│       │   │   │           │   ├── StreamSegmentAdapter.kt
│       │   │   │           │   ├── StreamSegmentItem.kt
│       │   │   │           │   ├── dialog/
│       │   │   │           │   │   ├── InfoItemDialog.java
│       │   │   │           │   │   ├── StreamDialogDefaultEntry.java
│       │   │   │           │   │   └── StreamDialogEntry.java
│       │   │   │           │   └── holder/
│       │   │   │           │       ├── ChannelCardInfoItemHolder.java
│       │   │   │           │       ├── ChannelGridInfoItemHolder.java
│       │   │   │           │       ├── ChannelInfoItemHolder.java
│       │   │   │           │       ├── ChannelMiniInfoItemHolder.java
│       │   │   │           │       ├── CommentInfoItemHolder.java
│       │   │   │           │       ├── InfoItemHolder.java
│       │   │   │           │       ├── PlaylistCardInfoItemHolder.java
│       │   │   │           │       ├── PlaylistGridInfoItemHolder.java
│       │   │   │           │       ├── PlaylistInfoItemHolder.java
│       │   │   │           │       ├── PlaylistMiniInfoItemHolder.java
│       │   │   │           │       ├── StreamCardInfoItemHolder.java
│       │   │   │           │       ├── StreamGridInfoItemHolder.java
│       │   │   │           │       ├── StreamInfoItemHolder.java
│       │   │   │           │       └── StreamMiniInfoItemHolder.java
│       │   │   │           ├── ktx/
│       │   │   │           │   ├── Bitmap.kt
│       │   │   │           │   ├── Bundle.kt
│       │   │   │           │   ├── SharedPreferences.kt
│       │   │   │           │   ├── TextView.kt
│       │   │   │           │   ├── Throwable.kt
│       │   │   │           │   └── View.kt
│       │   │   │           ├── local/
│       │   │   │           │   ├── BaseLocalListFragment.java
│       │   │   │           │   ├── HeaderFooterHolder.java
│       │   │   │           │   ├── LocalItemBuilder.java
│       │   │   │           │   ├── LocalItemListAdapter.java
│       │   │   │           │   ├── bookmark/
│       │   │   │           │   │   ├── BookmarkFragment.java
│       │   │   │           │   │   └── MergedPlaylistManager.java
│       │   │   │           │   ├── dialog/
│       │   │   │           │   │   ├── PlaylistAppendDialog.java
│       │   │   │           │   │   ├── PlaylistCreationDialog.java
│       │   │   │           │   │   └── PlaylistDialog.java
│       │   │   │           │   ├── feed/
│       │   │   │           │   │   ├── FeedDatabaseManager.kt
│       │   │   │           │   │   ├── FeedFragment.kt
│       │   │   │           │   │   ├── FeedState.kt
│       │   │   │           │   │   ├── FeedViewModel.kt
│       │   │   │           │   │   ├── item/
│       │   │   │           │   │   │   └── StreamItem.kt
│       │   │   │           │   │   ├── notifications/
│       │   │   │           │   │   │   ├── NotificationHelper.kt
│       │   │   │           │   │   │   ├── NotificationWorker.kt
│       │   │   │           │   │   │   └── ScheduleOptions.kt
│       │   │   │           │   │   └── service/
│       │   │   │           │   │       ├── FeedEventManager.kt
│       │   │   │           │   │       ├── FeedLoadManager.kt
│       │   │   │           │   │       ├── FeedLoadService.kt
│       │   │   │           │   │       ├── FeedLoadState.kt
│       │   │   │           │   │       ├── FeedResultsHolder.kt
│       │   │   │           │   │       └── FeedUpdateInfo.kt
│       │   │   │           │   ├── history/
│       │   │   │           │   │   ├── HistoryRecordManager.java
│       │   │   │           │   │   └── StatisticsPlaylistFragment.java
│       │   │   │           │   ├── holder/
│       │   │   │           │   │   ├── LocalBookmarkPlaylistItemHolder.java
│       │   │   │           │   │   ├── LocalItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistCardItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistGridItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistStreamCardItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistStreamGridItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistStreamItemHolder.java
│       │   │   │           │   │   ├── LocalStatisticStreamCardItemHolder.java
│       │   │   │           │   │   ├── LocalStatisticStreamGridItemHolder.java
│       │   │   │           │   │   ├── LocalStatisticStreamItemHolder.java
│       │   │   │           │   │   ├── PlaylistItemHolder.java
│       │   │   │           │   │   ├── RemoteBookmarkPlaylistItemHolder.java
│       │   │   │           │   │   ├── RemotePlaylistCardItemHolder.java
│       │   │   │           │   │   ├── RemotePlaylistGridItemHolder.java
│       │   │   │           │   │   └── RemotePlaylistItemHolder.java
│       │   │   │           │   ├── playlist/
│       │   │   │           │   │   ├── ExportPlaylist.kt
│       │   │   │           │   │   ├── LocalPlaylistFragment.java
│       │   │   │           │   │   ├── LocalPlaylistManager.java
│       │   │   │           │   │   ├── PlayListShareMode.kt
│       │   │   │           │   │   └── RemotePlaylistManager.kt
│       │   │   │           │   └── subscription/
│       │   │   │           │       ├── FeedGroupIcon.kt
│       │   │   │           │       ├── ImportConfirmationDialog.java
│       │   │   │           │       ├── SubscriptionFragment.kt
│       │   │   │           │       ├── SubscriptionManager.kt
│       │   │   │           │       ├── SubscriptionViewModel.kt
│       │   │   │           │       ├── SubscriptionsImportExportHelper.kt
│       │   │   │           │       ├── SubscriptionsImportFragment.java
│       │   │   │           │       ├── dialog/
│       │   │   │           │       │   ├── FeedGroupDialog.kt
│       │   │   │           │       │   ├── FeedGroupDialogViewModel.kt
│       │   │   │           │       │   ├── FeedGroupReorderDialog.kt
│       │   │   │           │       │   └── FeedGroupReorderDialogViewModel.kt
│       │   │   │           │       ├── item/
│       │   │   │           │       │   ├── ChannelItem.kt
│       │   │   │           │       │   ├── FeedGroupAddNewGridItem.kt
│       │   │   │           │       │   ├── FeedGroupAddNewItem.kt
│       │   │   │           │       │   ├── FeedGroupCardGridItem.kt
│       │   │   │           │       │   ├── FeedGroupCardItem.kt
│       │   │   │           │       │   ├── FeedGroupCarouselItem.kt
│       │   │   │           │       │   ├── FeedGroupReorderItem.kt
│       │   │   │           │       │   ├── GroupsHeader.kt
│       │   │   │           │       │   ├── Header.kt
│       │   │   │           │       │   ├── ImportSubscriptionsHintPlaceholderItem.kt
│       │   │   │           │       │   ├── PickerIconItem.kt
│       │   │   │           │       │   └── PickerSubscriptionItem.kt
│       │   │   │           │       └── workers/
│       │   │   │           │           ├── ImportExportJsonHelper.kt
│       │   │   │           │           ├── SubscriptionData.kt
│       │   │   │           │           ├── SubscriptionExportWorker.kt
│       │   │   │           │           └── SubscriptionImportWorker.kt
│       │   │   │           ├── player/
│       │   │   │           │   ├── AudioServiceLeakFix.java
│       │   │   │           │   ├── PlayQueueActivity.java
│       │   │   │           │   ├── Player.java
│       │   │   │           │   ├── PlayerIntentType.kt
│       │   │   │           │   ├── PlayerService.java
│       │   │   │           │   ├── PlayerType.kt
│       │   │   │           │   ├── datasource/
│       │   │   │           │   │   ├── NonUriHlsDataSourceFactory.java
│       │   │   │           │   │   └── YoutubeHttpDataSource.java
│       │   │   │           │   ├── event/
│       │   │   │           │   │   ├── OnKeyDownListener.java
│       │   │   │           │   │   ├── PlayerEventListener.java
│       │   │   │           │   │   ├── PlayerServiceEventListener.java
│       │   │   │           │   │   └── PlayerServiceExtendedEventListener.java
│       │   │   │           │   ├── gesture/
│       │   │   │           │   │   ├── BasePlayerGestureListener.kt
│       │   │   │           │   │   ├── CustomBottomSheetBehavior.java
│       │   │   │           │   │   ├── DisplayPortion.kt
│       │   │   │           │   │   ├── DoubleTapListener.kt
│       │   │   │           │   │   ├── MainPlayerGestureListener.kt
│       │   │   │           │   │   └── PopupPlayerGestureListener.kt
│       │   │   │           │   ├── helper/
│       │   │   │           │   │   ├── AudioReactor.java
│       │   │   │           │   │   ├── CacheFactory.java
│       │   │   │           │   │   ├── CustomMediaCodecVideoRenderer.java
│       │   │   │           │   │   ├── CustomRenderersFactory.java
│       │   │   │           │   │   ├── LoadController.java
│       │   │   │           │   │   ├── LockManager.java
│       │   │   │           │   │   ├── PlaybackParameterDialog.java
│       │   │   │           │   │   ├── PlayerDataSource.java
│       │   │   │           │   │   ├── PlayerHelper.java
│       │   │   │           │   │   ├── PlayerHolder.java
│       │   │   │           │   │   ├── PlayerSemitoneHelper.java
│       │   │   │           │   │   └── YoutubeDashLiveManifestParser.java
│       │   │   │           │   ├── mediabrowser/
│       │   │   │           │   │   ├── MediaBrowserCommon.kt
│       │   │   │           │   │   ├── MediaBrowserImpl.kt
│       │   │   │           │   │   ├── MediaBrowserPlaybackPreparer.kt
│       │   │   │           │   │   └── PackageValidator.kt
│       │   │   │           │   ├── mediaitem/
│       │   │   │           │   │   ├── ExceptionTag.java
│       │   │   │           │   │   ├── MediaItemTag.java
│       │   │   │           │   │   ├── PlaceholderTag.java
│       │   │   │           │   │   └── StreamInfoTag.java
│       │   │   │           │   ├── mediasession/
│       │   │   │           │   │   ├── MediaSessionPlayerUi.java
│       │   │   │           │   │   ├── PlayQueueNavigator.java
│       │   │   │           │   │   └── SessionConnectorActionProvider.java
│       │   │   │           │   ├── mediasource/
│       │   │   │           │   │   ├── FailedMediaSource.java
│       │   │   │           │   │   ├── LoadedMediaSource.java
│       │   │   │           │   │   ├── ManagedMediaSource.java
│       │   │   │           │   │   ├── ManagedMediaSourcePlaylist.java
│       │   │   │           │   │   └── PlaceholderMediaSource.java
│       │   │   │           │   ├── notification/
│       │   │   │           │   │   ├── NotificationActionData.java
│       │   │   │           │   │   ├── NotificationConstants.java
│       │   │   │           │   │   ├── NotificationPlayerUi.java
│       │   │   │           │   │   └── NotificationUtil.java
│       │   │   │           │   ├── playback/
│       │   │   │           │   │   ├── MediaSourceManager.java
│       │   │   │           │   │   ├── PlaybackListener.java
│       │   │   │           │   │   └── SurfaceHolderCallback.java
│       │   │   │           │   ├── playqueue/
│       │   │   │           │   │   ├── AbstractInfoPlayQueue.java
│       │   │   │           │   │   ├── ChannelTabPlayQueue.java
│       │   │   │           │   │   ├── PlayQueue.java
│       │   │   │           │   │   ├── PlayQueueAdapter.java
│       │   │   │           │   │   ├── PlayQueueEvent.kt
│       │   │   │           │   │   ├── PlayQueueItem.java
│       │   │   │           │   │   ├── PlayQueueItemBuilder.java
│       │   │   │           │   │   ├── PlayQueueItemHolder.java
│       │   │   │           │   │   ├── PlayQueueItemTouchCallback.java
│       │   │   │           │   │   ├── PlaylistPlayQueue.java
│       │   │   │           │   │   └── SinglePlayQueue.java
│       │   │   │           │   ├── resolver/
│       │   │   │           │   │   ├── AudioPlaybackResolver.java
│       │   │   │           │   │   ├── PlaybackResolver.java
│       │   │   │           │   │   ├── Resolver.java
│       │   │   │           │   │   └── VideoPlaybackResolver.java
│       │   │   │           │   ├── seekbarpreview/
│       │   │   │           │   │   ├── SeekbarPreviewThumbnailHelper.java
│       │   │   │           │   │   └── SeekbarPreviewThumbnailHolder.java
│       │   │   │           │   └── ui/
│       │   │   │           │       ├── BackgroundPlayerUi.java
│       │   │   │           │       ├── MainPlayerUi.java
│       │   │   │           │       ├── PlayerUi.java
│       │   │   │           │       ├── PlayerUiList.java
│       │   │   │           │       ├── PopupPlayerUi.java
│       │   │   │           │       └── VideoPlayerUi.java
│       │   │   │           ├── settings/
│       │   │   │           │   ├── AppearanceSettingsFragment.java
│       │   │   │           │   ├── BackupRestoreSettingsFragment.java
│       │   │   │           │   ├── BasePreferenceFragment.java
│       │   │   │           │   ├── ContentSettingsFragment.java
│       │   │   │           │   ├── DebugSettingsFragment.java
│       │   │   │           │   ├── DownloadSettingsFragment.java
│       │   │   │           │   ├── ExoPlayerSettingsFragment.java
│       │   │   │           │   ├── HistorySettingsFragment.java
│       │   │   │           │   ├── MainSettingsFragment.java
│       │   │   │           │   ├── NewPipeSettings.java
│       │   │   │           │   ├── NotificationSettingsFragment.kt
│       │   │   │           │   ├── NotificationsSettingsFragment.kt
│       │   │   │           │   ├── PeertubeInstanceListFragment.java
│       │   │   │           │   ├── PlayerNotificationSettingsFragment.kt
│       │   │   │           │   ├── SelectChannelFragment.java
│       │   │   │           │   ├── SelectFeedGroupFragment.java
│       │   │   │           │   ├── SelectKioskFragment.java
│       │   │   │           │   ├── SelectPlaylistFragment.java
│       │   │   │           │   ├── SettingsActivity.java
│       │   │   │           │   ├── SettingsResourceRegistry.java
│       │   │   │           │   ├── UpdateSettingsFragment.java
│       │   │   │           │   ├── VideoAudioSettingsFragment.java
│       │   │   │           │   ├── custom/
│       │   │   │           │   │   ├── DurationListPreference.kt
│       │   │   │           │   │   ├── NotificationActionsPreference.java
│       │   │   │           │   │   └── NotificationSlot.java
│       │   │   │           │   ├── export/
│       │   │   │           │   │   ├── BackupFileLocator.kt
│       │   │   │           │   │   ├── ImportExportManager.kt
│       │   │   │           │   │   └── PreferencesObjectInputStream.kt
│       │   │   │           │   ├── migration/
│       │   │   │           │   │   ├── MigrationManager.java
│       │   │   │           │   │   └── SettingMigrations.java
│       │   │   │           │   ├── notifications/
│       │   │   │           │   │   ├── NotificationModeConfigAdapter.kt
│       │   │   │           │   │   └── NotificationModeConfigFragment.kt
│       │   │   │           │   ├── preferencesearch/
│       │   │   │           │   │   ├── PreferenceFuzzySearchFunction.java
│       │   │   │           │   │   ├── PreferenceParser.java
│       │   │   │           │   │   ├── PreferenceSearchAdapter.java
│       │   │   │           │   │   ├── PreferenceSearchConfiguration.java
│       │   │   │           │   │   ├── PreferenceSearchFragment.java
│       │   │   │           │   │   ├── PreferenceSearchItem.kt
│       │   │   │           │   │   ├── PreferenceSearchResultHighlighter.java
│       │   │   │           │   │   ├── PreferenceSearchResultListener.kt
│       │   │   │           │   │   ├── PreferenceSearcher.java
│       │   │   │           │   │   └── package-info.java
│       │   │   │           │   └── tabs/
│       │   │   │           │       ├── AddTabDialog.java
│       │   │   │           │       ├── ChooseTabsFragment.java
│       │   │   │           │       ├── Tab.java
│       │   │   │           │       ├── TabsJsonHelper.java
│       │   │   │           │       └── TabsManager.java
│       │   │   │           ├── streams/
│       │   │   │           │   ├── DataReader.java
│       │   │   │           │   ├── Mp4DashReader.java
│       │   │   │           │   ├── Mp4FromDashWriter.java
│       │   │   │           │   ├── OggFromWebMWriter.java
│       │   │   │           │   ├── SrtFromTtmlWriter.java
│       │   │   │           │   ├── WebMReader.java
│       │   │   │           │   ├── WebMWriter.java
│       │   │   │           │   └── io/
│       │   │   │           │       ├── NoFileManagerSafeGuard.java
│       │   │   │           │       ├── SharpInputStream.java
│       │   │   │           │       ├── SharpOutputStream.java
│       │   │   │           │       ├── SharpStream.java
│       │   │   │           │       ├── StoredDirectoryHelper.java
│       │   │   │           │       └── StoredFileHelper.java
│       │   │   │           ├── util/
│       │   │   │           │   ├── AudioTrackAdapter.java
│       │   │   │           │   ├── BridgeStateSaverInitializer.java
│       │   │   │           │   ├── ChannelTabHelper.java
│       │   │   │           │   ├── Constants.kt
│       │   │   │           │   ├── DependentPreferenceHelper.kt
│       │   │   │           │   ├── DeviceUtils.java
│       │   │   │           │   ├── ExtractorHelper.java
│       │   │   │           │   ├── FallbackViewHolder.java
│       │   │   │           │   ├── FilePickerActivityHelper.java
│       │   │   │           │   ├── FilenameUtils.kt
│       │   │   │           │   ├── InfoCache.java
│       │   │   │           │   ├── KeyboardUtil.java
│       │   │   │           │   ├── KioskTranslator.kt
│       │   │   │           │   ├── ListHelper.java
│       │   │   │           │   ├── Localization.java
│       │   │   │           │   ├── NavigationHelper.java
│       │   │   │           │   ├── NewPipeTextViewHelper.kt
│       │   │   │           │   ├── OnClickGesture.java
│       │   │   │           │   ├── PeertubeHelper.kt
│       │   │   │           │   ├── PermissionHelper.java
│       │   │   │           │   ├── PlayButtonHelper.kt
│       │   │   │           │   ├── ReleaseVersionUtil.kt
│       │   │   │           │   ├── SavedState.kt
│       │   │   │           │   ├── SecondaryStreamHelper.java
│       │   │   │           │   ├── SerializedCache.java
│       │   │   │           │   ├── ServiceHelper.kt
│       │   │   │           │   ├── SimpleOnSeekBarChangeListener.kt
│       │   │   │           │   ├── SliderStrategy.java
│       │   │   │           │   ├── SparseItemUtil.java
│       │   │   │           │   ├── StateSaver.java
│       │   │   │           │   ├── StreamItemAdapter.java
│       │   │   │           │   ├── StreamTypeUtil.kt
│       │   │   │           │   ├── ThemeHelper.java
│       │   │   │           │   ├── ZipHelper.java
│       │   │   │           │   ├── debounce/
│       │   │   │           │   │   ├── DebounceSavable.java
│       │   │   │           │   │   └── DebounceSaver.java
│       │   │   │           │   ├── external_communication/
│       │   │   │           │   │   ├── KoreUtils.java
│       │   │   │           │   │   └── ShareUtils.java
│       │   │   │           │   ├── image/
│       │   │   │           │   │   ├── CoilHelper.kt
│       │   │   │           │   │   ├── ImageStrategy.kt
│       │   │   │           │   │   └── PreferredImageQuality.kt
│       │   │   │           │   ├── potoken/
│       │   │   │           │   │   ├── JavaScriptUtil.kt
│       │   │   │           │   │   ├── PoTokenException.kt
│       │   │   │           │   │   ├── PoTokenGenerator.kt
│       │   │   │           │   │   ├── PoTokenProviderImpl.kt
│       │   │   │           │   │   └── PoTokenWebView.kt
│       │   │   │           │   ├── text/
│       │   │   │           │   │   ├── HashtagLongPressClickableSpan.java
│       │   │   │           │   │   ├── InternalUrlsHandler.java
│       │   │   │           │   │   ├── LongPressClickableSpan.java
│       │   │   │           │   │   ├── LongPressLinkMovementMethod.java
│       │   │   │           │   │   ├── TextEllipsizer.java
│       │   │   │           │   │   ├── TextLinkifier.java
│       │   │   │           │   │   ├── TextViewExtensions.kt
│       │   │   │           │   │   ├── TimestampExtractor.java
│       │   │   │           │   │   ├── TimestampLongPressClickableSpan.kt
│       │   │   │           │   │   ├── TouchUtils.java
│       │   │   │           │   │   └── UrlLongPressClickableSpan.java
│       │   │   │           │   └── urlfinder/
│       │   │   │           │       ├── PatternsCompat.java
│       │   │   │           │       └── UrlFinder.kt
│       │   │   │           └── views/
│       │   │   │               ├── AnimatedProgressBar.java
│       │   │   │               ├── CustomCollapsingToolbarLayout.java
│       │   │   │               ├── ExpandableSurfaceView.java
│       │   │   │               ├── FocusAwareCoordinator.java
│       │   │   │               ├── FocusAwareDrawerLayout.java
│       │   │   │               ├── FocusAwareSeekBar.java
│       │   │   │               ├── FocusOverlayView.java
│       │   │   │               ├── NewPipeEditText.java
│       │   │   │               ├── NewPipeRecyclerView.java
│       │   │   │               ├── NewPipeTextView.java
│       │   │   │               ├── ScrollableTabLayout.java
│       │   │   │               ├── SimpleWindowCallback.kt
│       │   │   │               ├── SuperScrollLayoutManager.java
│       │   │   │               └── player/
│       │   │   │                   ├── CircleClipTapView.kt
│       │   │   │                   ├── PlayerFastSeekOverlay.kt
│       │   │   │                   └── SecondsView.kt
│       │   │   └── us/
│       │   │       └── shandian/
│       │   │           └── giga/
│       │   │               ├── get/
│       │   │               │   ├── DownloadInitializer.java
│       │   │               │   ├── DownloadMission.java
│       │   │               │   ├── DownloadMissionRecover.java
│       │   │               │   ├── DownloadRunnable.java
│       │   │               │   ├── DownloadRunnableFallback.java
│       │   │               │   ├── FinishedMission.java
│       │   │               │   ├── Mission.java
│       │   │               │   ├── MissionRecoveryInfo.kt
│       │   │               │   └── sqlite/
│       │   │               │       └── FinishedMissionStore.java
│       │   │               ├── io/
│       │   │               │   ├── ChunkFileInputStream.java
│       │   │               │   ├── CircularFileWriter.java
│       │   │               │   ├── FileStream.java
│       │   │               │   ├── FileStreamSAF.java
│       │   │               │   └── ProgressReport.java
│       │   │               ├── postprocessing/
│       │   │               │   ├── M4aNoDash.java
│       │   │               │   ├── Mp4FromDashMuxer.java
│       │   │               │   ├── OggFromWebmDemuxer.java
│       │   │               │   ├── Postprocessing.java
│       │   │               │   ├── TtmlConverter.java
│       │   │               │   └── WebMMuxer.java
│       │   │               ├── service/
│       │   │               │   ├── DownloadManager.java
│       │   │               │   ├── DownloadManagerService.java
│       │   │               │   └── MissionState.java
│       │   │               ├── ui/
│       │   │               │   ├── adapter/
│       │   │               │   │   └── MissionAdapter.java
│       │   │               │   ├── common/
│       │   │               │   │   ├── Deleter.java
│       │   │               │   │   ├── ProgressDrawable.java
│       │   │               │   │   └── ToolbarActivity.java
│       │   │               │   └── fragment/
│       │   │               │       └── MissionsFragment.java
│       │   │               └── util/
│       │   │                   └── Utility.java
│       │   └── res/
│       │       ├── animator/
│       │       │   ├── custom_fade_in.xml
│       │       │   └── custom_fade_out.xml
│       │       ├── drawable/
│       │       │   ├── background_oval_black_transparent.xml
│       │       │   ├── dashed_border_black.xml
│       │       │   ├── dashed_border_dark.xml
│       │       │   ├── dashed_border_light.xml
│       │       │   ├── drawer_header_bottom_background.xml
│       │       │   ├── ic_add.xml
│       │       │   ├── ic_add_circle_outline.xml
│       │       │   ├── ic_apps.xml
│       │       │   ├── ic_arrow_back.xml
│       │       │   ├── ic_arrow_drop_down.xml
│       │       │   ├── ic_arrow_drop_up.xml
│       │       │   ├── ic_art_track.xml
│       │       │   ├── ic_asterisk.xml
│       │       │   ├── ic_attach_money.xml
│       │       │   ├── ic_backup.xml
│       │       │   ├── ic_bookmark.xml
│       │       │   ├── ic_bookmark_white.xml
│       │       │   ├── ic_brightness_high.xml
│       │       │   ├── ic_brightness_low.xml
│       │       │   ├── ic_brightness_medium.xml
│       │       │   ├── ic_bug_report.xml
│       │       │   ├── ic_campaign.xml
│       │       │   ├── ic_cast.xml
│       │       │   ├── ic_checklist.xml
│       │       │   ├── ic_child_care.xml
│       │       │   ├── ic_circle.xml
│       │       │   ├── ic_close.xml
│       │       │   ├── ic_cloud.xml
│       │       │   ├── ic_cloud_download.xml
│       │       │   ├── ic_comment.xml
│       │       │   ├── ic_computer.xml
│       │       │   ├── ic_crop_portrait.xml
│       │       │   ├── ic_delete.xml
│       │       │   ├── ic_description.xml
│       │       │   ├── ic_directions_bike.xml
│       │       │   ├── ic_directions_car.xml
│       │       │   ├── ic_done.xml
│       │       │   ├── ic_drag_handle.xml
│       │       │   ├── ic_expand_more.xml
│       │       │   ├── ic_explore.xml
│       │       │   ├── ic_fastfood.xml
│       │       │   ├── ic_favorite.xml
│       │       │   ├── ic_file_download.xml
│       │       │   ├── ic_filter_list.xml
│       │       │   ├── ic_fitness_center.xml
│       │       │   ├── ic_fullscreen.xml
│       │       │   ├── ic_fullscreen_exit.xml
│       │       │   ├── ic_headset.xml
│       │       │   ├── ic_headset_shadow.xml
│       │       │   ├── ic_heart.xml
│       │       │   ├── ic_help.xml
│       │       │   ├── ic_history.xml
│       │       │   ├── ic_history_white.xml
│       │       │   ├── ic_home.xml
│       │       │   ├── ic_hourglass_top.xml
│       │       │   ├── ic_info_outline.xml
│       │       │   ├── ic_insert_emoticon.xml
│       │       │   ├── ic_language.xml
│       │       │   ├── ic_list.xml
│       │       │   ├── ic_live_tv.xml
│       │       │   ├── ic_menu_book.xml
│       │       │   ├── ic_mic.xml
│       │       │   ├── ic_more_vert.xml
│       │       │   ├── ic_motorcycle.xml
│       │       │   ├── ic_movie.xml
│       │       │   ├── ic_music_note.xml
│       │       │   ├── ic_next.xml
│       │       │   ├── ic_notifications.xml
│       │       │   ├── ic_palette.xml
│       │       │   ├── ic_pause.xml
│       │       │   ├── ic_people.xml
│       │       │   ├── ic_person.xml
│       │       │   ├── ic_pets.xml
│       │       │   ├── ic_picture_in_picture.xml
│       │       │   ├── ic_pin.xml
│       │       │   ├── ic_placeholder_bandcamp.xml
│       │       │   ├── ic_placeholder_media_ccc.xml
│       │       │   ├── ic_placeholder_peertube.xml
│       │       │   ├── ic_play_arrow.xml
│       │       │   ├── ic_play_arrow_shadow.xml
│       │       │   ├── ic_play_seek_triangle.xml
│       │       │   ├── ic_playlist_add.xml
│       │       │   ├── ic_playlist_add_check.xml
│       │       │   ├── ic_playlist_play.xml
│       │       │   ├── ic_podcasts.xml
│       │       │   ├── ic_previous.xml
│       │       │   ├── ic_public.xml
│       │       │   ├── ic_radio.xml
│       │       │   ├── ic_refresh.xml
│       │       │   ├── ic_repeat.xml
│       │       │   ├── ic_replay.xml
│       │       │   ├── ic_restaurant.xml
│       │       │   ├── ic_rss_feed.xml
│       │       │   ├── ic_save.xml
│       │       │   ├── ic_school.xml
│       │       │   ├── ic_search.xml
│       │       │   ├── ic_search_add.xml
│       │       │   ├── ic_select_all.xml
│       │       │   ├── ic_settings.xml
│       │       │   ├── ic_settings_backup_restore.xml
│       │       │   ├── ic_share.xml
│       │       │   ├── ic_shopping_cart.xml
│       │       │   ├── ic_shuffle.xml
│       │       │   ├── ic_smart_display.xml
│       │       │   ├── ic_sort.xml
│       │       │   ├── ic_stars.xml
│       │       │   ├── ic_subscriptions.xml
│       │       │   ├── ic_subtitles.xml
│       │       │   ├── ic_telescope.xml
│       │       │   ├── ic_thumb_down.xml
│       │       │   ├── ic_thumb_up.xml
│       │       │   ├── ic_trending_up.xml
│       │       │   ├── ic_tv.xml
│       │       │   ├── ic_videogame_asset.xml
│       │       │   ├── ic_visibility_on.xml
│       │       │   ├── ic_volume_down.xml
│       │       │   ├── ic_volume_mute.xml
│       │       │   ├── ic_volume_off.xml
│       │       │   ├── ic_volume_up.xml
│       │       │   ├── ic_watch_later.xml
│       │       │   ├── ic_wb_sunny.xml
│       │       │   ├── ic_whatshot.xml
│       │       │   ├── ic_work.xml
│       │       │   ├── not_available_monkey.xml
│       │       │   ├── placeholder_person.xml
│       │       │   ├── placeholder_thumbnail_playlist.xml
│       │       │   ├── placeholder_thumbnail_video.xml
│       │       │   ├── player_controls_background.xml
│       │       │   ├── player_controls_top_background.xml
│       │       │   ├── progress_circular_white.xml
│       │       │   ├── progress_soundcloud_horizontal_dark.xml
│       │       │   ├── progress_soundcloud_horizontal_light.xml
│       │       │   ├── progress_youtube_horizontal_dark.xml
│       │       │   ├── progress_youtube_horizontal_light.xml
│       │       │   ├── selector_checked_dark.xml
│       │       │   ├── selector_checked_light.xml
│       │       │   ├── selector_dark.xml
│       │       │   ├── selector_focused_dark.xml
│       │       │   ├── selector_focused_light.xml
│       │       │   ├── selector_light.xml
│       │       │   ├── splash_background.xml
│       │       │   ├── splash_foreground.xml
│       │       │   ├── toolbar_shadow_dark.xml
│       │       │   └── toolbar_shadow_light.xml
│       │       ├── drawable-mdpi/
│       │       │   └── volunteer_activism_ic.xml
│       │       ├── drawable-night/
│       │       │   ├── ic_heart.xml
│       │       │   └── splash_background.xml
│       │       ├── drawable-night-v23/
│       │       │   └── splash_background.xml
│       │       ├── drawable-v23/
│       │       │   └── splash_background.xml
│       │       ├── layout/
│       │       │   ├── activity_about.xml
│       │       │   ├── activity_downloader.xml
│       │       │   ├── activity_error.xml
│       │       │   ├── activity_main.xml
│       │       │   ├── activity_player_queue_control.xml
│       │       │   ├── activity_recaptcha.xml
│       │       │   ├── chip.xml
│       │       │   ├── comment_replies_header.xml
│       │       │   ├── dialog_edit_text.xml
│       │       │   ├── dialog_feed_group_create.xml
│       │       │   ├── dialog_feed_group_reorder.xml
│       │       │   ├── dialog_playback_parameter.xml
│       │       │   ├── dialog_playlists.xml
│       │       │   ├── dialog_title.xml
│       │       │   ├── download_dialog.xml
│       │       │   ├── download_loading_dialog.xml
│       │       │   ├── drawer_header.xml
│       │       │   ├── drawer_layout.xml
│       │       │   ├── error_panel.xml
│       │       │   ├── feed_group_add_new_grid_item.xml
│       │       │   ├── feed_group_add_new_item.xml
│       │       │   ├── feed_group_card_grid_item.xml
│       │       │   ├── feed_group_card_item.xml
│       │       │   ├── feed_group_reorder_item.xml
│       │       │   ├── feed_item_carousel.xml
│       │       │   ├── fragment_about.xml
│       │       │   ├── fragment_blank.xml
│       │       │   ├── fragment_bookmarks.xml
│       │       │   ├── fragment_channel.xml
│       │       │   ├── fragment_channel_tab.xml
│       │       │   ├── fragment_channel_videos.xml
│       │       │   ├── fragment_channels_notifications.xml
│       │       │   ├── fragment_choose_tabs.xml
│       │       │   ├── fragment_comments.xml
│       │       │   ├── fragment_description.xml
│       │       │   ├── fragment_empty.xml
│       │       │   ├── fragment_feed.xml
│       │       │   ├── fragment_import.xml
│       │       │   ├── fragment_instance_list.xml
│       │       │   ├── fragment_kiosk.xml
│       │       │   ├── fragment_licenses.xml
│       │       │   ├── fragment_main.xml
│       │       │   ├── fragment_playlist.xml
│       │       │   ├── fragment_related_items.xml
│       │       │   ├── fragment_search.xml
│       │       │   ├── fragment_subscription.xml
│       │       │   ├── fragment_video_detail.xml
│       │       │   ├── instance_spinner_item.xml
│       │       │   ├── instance_spinner_layout.xml
│       │       │   ├── item_instance.xml
│       │       │   ├── item_metadata.xml
│       │       │   ├── item_metadata_tags.xml
│       │       │   ├── item_notification_config.xml
│       │       │   ├── item_search_suggestion.xml
│       │       │   ├── item_software_component.xml
│       │       │   ├── item_stream_segment.xml
│       │       │   ├── list_channel_card_item.xml
│       │       │   ├── list_channel_grid_item.xml
│       │       │   ├── list_channel_item.xml
│       │       │   ├── list_channel_mini_item.xml
│       │       │   ├── list_choose_tabs.xml
│       │       │   ├── list_choose_tabs_dialog.xml
│       │       │   ├── list_comment_item.xml
│       │       │   ├── list_empty_view.xml
│       │       │   ├── list_empty_view_subscriptions.xml
│       │       │   ├── list_playlist_bookmark_item.xml
│       │       │   ├── list_playlist_card_item.xml
│       │       │   ├── list_playlist_grid_item.xml
│       │       │   ├── list_playlist_item.xml
│       │       │   ├── list_playlist_mini_item.xml
│       │       │   ├── list_radio_icon_item.xml
│       │       │   ├── list_stream_card_item.xml
│       │       │   ├── list_stream_grid_item.xml
│       │       │   ├── list_stream_item.xml
│       │       │   ├── list_stream_mini_item.xml
│       │       │   ├── list_stream_playlist_card_item.xml
│       │       │   ├── list_stream_playlist_grid_item.xml
│       │       │   ├── list_stream_playlist_item.xml
│       │       │   ├── local_playlist_header.xml
│       │       │   ├── main_bg.xml
│       │       │   ├── mission_item.xml
│       │       │   ├── mission_item_linear.xml
│       │       │   ├── missions.xml
│       │       │   ├── missions_header.xml
│       │       │   ├── picker_icon_item.xml
│       │       │   ├── picker_subscription_item.xml
│       │       │   ├── pignate_footer.xml
│       │       │   ├── play_queue_item.xml
│       │       │   ├── player.xml
│       │       │   ├── player_fast_seek_overlay.xml
│       │       │   ├── player_fast_seek_seconds_view.xml
│       │       │   ├── player_popup_close_overlay.xml
│       │       │   ├── playlist_control.xml
│       │       │   ├── playlist_header.xml
│       │       │   ├── related_items_header.xml
│       │       │   ├── select_channel_fragment.xml
│       │       │   ├── select_channel_item.xml
│       │       │   ├── select_feed_group_fragment.xml
│       │       │   ├── select_feed_group_item.xml
│       │       │   ├── select_kiosk_fragment.xml
│       │       │   ├── select_kiosk_item.xml
│       │       │   ├── select_playlist_fragment.xml
│       │       │   ├── settings_category_header_layout.xml
│       │       │   ├── settings_category_header_title.xml
│       │       │   ├── settings_layout.xml
│       │       │   ├── settings_notification.xml
│       │       │   ├── settings_notification_action.xml
│       │       │   ├── settings_preferencesearch_fragment.xml
│       │       │   ├── settings_preferencesearch_list_item_result.xml
│       │       │   ├── single_choice_dialog_view.xml
│       │       │   ├── statistic_playlist_control.xml
│       │       │   ├── stream_quality_item.xml
│       │       │   ├── subscription_groups_header.xml
│       │       │   ├── subscription_header.xml
│       │       │   ├── toolbar_layout.xml
│       │       │   └── toolbar_search_layout.xml
│       │       ├── layout-land/
│       │       │   ├── activity_player_queue_control.xml
│       │       │   └── list_stream_card_item.xml
│       │       ├── layout-large-land/
│       │       │   └── fragment_video_detail.xml
│       │       ├── menu/
│       │       │   ├── dialog_url.xml
│       │       │   ├── download_menu.xml
│       │       │   ├── drawer_items.xml
│       │       │   ├── error_menu.xml
│       │       │   ├── menu_channel.xml
│       │       │   ├── menu_chooser_fragment.xml
│       │       │   ├── menu_feed_fragment.xml
│       │       │   ├── menu_feed_group_dialog.xml
│       │       │   ├── menu_history.xml
│       │       │   ├── menu_local_playlist.xml
│       │       │   ├── menu_main_fragment.xml
│       │       │   ├── menu_notifications_channels.xml
│       │       │   ├── menu_play_queue.xml
│       │       │   ├── menu_play_queue_bg.xml
│       │       │   ├── menu_play_queue_item.xml
│       │       │   ├── menu_playlist.xml
│       │       │   ├── menu_recaptcha.xml
│       │       │   ├── menu_settings_main_fragment.xml
│       │       │   └── mission.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   └── ic_launcher.xml
│       │       ├── resources.properties
│       │       ├── values/
│       │       │   ├── attrs.xml
│       │       │   ├── bools.xml
│       │       │   ├── colors.xml
│       │       │   ├── colors_services.xml
│       │       │   ├── dimens.xml
│       │       │   ├── donottranslate.xml
│       │       │   ├── settings_keys.xml
│       │       │   ├── strings.xml
│       │       │   ├── styles.xml
│       │       │   ├── styles_misc.xml
│       │       │   └── styles_services.xml
│       │       ├── values-ace/
│       │       │   └── strings.xml
│       │       ├── values-aeb/
│       │       │   └── strings.xml
│       │       ├── values-af/
│       │       │   └── strings.xml
│       │       ├── values-ang/
│       │       │   └── strings.xml
│       │       ├── values-ar/
│       │       │   └── strings.xml
│       │       ├── values-ar-rLY/
│       │       │   └── strings.xml
│       │       ├── values-ars/
│       │       │   └── strings.xml
│       │       ├── values-as/
│       │       │   └── strings.xml
│       │       ├── values-ay/
│       │       │   └── strings.xml
│       │       ├── values-ayc/
│       │       │   └── strings.xml
│       │       ├── values-az/
│       │       │   └── strings.xml
│       │       ├── values-azb/
│       │       │   └── strings.xml
│       │       ├── values-b+ast/
│       │       │   └── strings.xml
│       │       ├── values-b+uz+Latn/
│       │       │   └── strings.xml
│       │       ├── values-bar/
│       │       │   └── strings.xml
│       │       ├── values-be/
│       │       │   └── strings.xml
│       │       ├── values-ber/
│       │       │   └── strings.xml
│       │       ├── values-bg/
│       │       │   └── strings.xml
│       │       ├── values-bm/
│       │       │   └── strings.xml
│       │       ├── values-bn/
│       │       │   └── strings.xml
│       │       ├── values-bn-rBD/
│       │       │   └── strings.xml
│       │       ├── values-bn-rIN/
│       │       │   └── strings.xml
│       │       ├── values-bqi/
│       │       │   └── strings.xml
│       │       ├── values-br/
│       │       │   └── strings.xml
│       │       ├── values-bs/
│       │       │   └── strings.xml
│       │       ├── values-ca/
│       │       │   └── strings.xml
│       │       ├── values-ckb/
│       │       │   └── strings.xml
│       │       ├── values-cs/
│       │       │   └── strings.xml
│       │       ├── values-cy/
│       │       │   └── strings.xml
│       │       ├── values-da/
│       │       │   └── strings.xml
│       │       ├── values-de/
│       │       │   └── strings.xml
│       │       ├── values-dum/
│       │       │   └── strings.xml
│       │       ├── values-el/
│       │       │   └── strings.xml
│       │       ├── values-en-rGB/
│       │       │   └── strings.xml
│       │       ├── values-enm/
│       │       │   └── strings.xml
│       │       ├── values-eo/
│       │       │   └── strings.xml
│       │       ├── values-es/
│       │       │   └── strings.xml
│       │       ├── values-et/
│       │       │   └── strings.xml
│       │       ├── values-eu/
│       │       │   └── strings.xml
│       │       ├── values-fa/
│       │       │   └── strings.xml
│       │       ├── values-fi/
│       │       │   └── strings.xml
│       │       ├── values-fil/
│       │       │   └── strings.xml
│       │       ├── values-fr/
│       │       │   └── strings.xml
│       │       ├── values-frc/
│       │       │   └── strings.xml
│       │       ├── values-gd/
│       │       │   └── strings.xml
│       │       ├── values-gl/
│       │       │   └── strings.xml
│       │       ├── values-gu/
│       │       │   └── strings.xml
│       │       ├── values-he/
│       │       │   └── strings.xml
│       │       ├── values-hi/
│       │       │   └── strings.xml
│       │       ├── values-hr/
│       │       │   └── strings.xml
│       │       ├── values-hu/
│       │       │   └── strings.xml
│       │       ├── values-hy/
│       │       │   └── strings.xml
│       │       ├── values-ia/
│       │       │   └── strings.xml
│       │       ├── values-in/
│       │       │   └── strings.xml
│       │       ├── values-is/
│       │       │   └── strings.xml
│       │       ├── values-it/
│       │       │   └── strings.xml
│       │       ├── values-ja/
│       │       │   └── strings.xml
│       │       ├── values-ji/
│       │       │   └── strings.xml
│       │       ├── values-jv/
│       │       │   └── strings.xml
│       │       ├── values-ka/
│       │       │   └── strings.xml
│       │       ├── values-kab/
│       │       │   └── strings.xml
│       │       ├── values-kk/
│       │       │   └── strings.xml
│       │       ├── values-kmr/
│       │       │   └── strings.xml
│       │       ├── values-kn/
│       │       │   └── strings.xml
│       │       ├── values-ko/
│       │       │   └── strings.xml
│       │       ├── values-ks/
│       │       │   └── strings.xml
│       │       ├── values-ku/
│       │       │   └── strings.xml
│       │       ├── values-la/
│       │       │   └── strings.xml
│       │       ├── values-land/
│       │       │   └── dimens.xml
│       │       ├── values-lmo/
│       │       │   └── strings.xml
│       │       ├── values-lt/
│       │       │   └── strings.xml
│       │       ├── values-lv/
│       │       │   └── strings.xml
│       │       ├── values-mk/
│       │       │   └── strings.xml
│       │       ├── values-ml/
│       │       │   └── strings.xml
│       │       ├── values-mn/
│       │       │   └── strings.xml
│       │       ├── values-mr/
│       │       │   └── strings.xml
│       │       ├── values-ms/
│       │       │   └── strings.xml
│       │       ├── values-my/
│       │       │   └── strings.xml
│       │       ├── values-nap/
│       │       │   └── strings.xml
│       │       ├── values-nb-rNO/
│       │       │   └── strings.xml
│       │       ├── values-nds/
│       │       │   └── strings.xml
│       │       ├── values-ne/
│       │       │   └── strings.xml
│       │       ├── values-night/
│       │       │   ├── colors.xml
│       │       │   └── styles.xml
│       │       ├── values-nl/
│       │       │   └── strings.xml
│       │       ├── values-nl-rBE/
│       │       │   └── strings.xml
│       │       ├── values-nn/
│       │       │   └── strings.xml
│       │       ├── values-nqo/
│       │       │   └── strings.xml
│       │       ├── values-oc/
│       │       │   └── strings.xml
│       │       ├── values-or/
│       │       │   └── strings.xml
│       │       ├── values-pa/
│       │       │   └── strings.xml
│       │       ├── values-pa-rPK/
│       │       │   └── strings.xml
│       │       ├── values-pl/
│       │       │   └── strings.xml
│       │       ├── values-pt/
│       │       │   └── strings.xml
│       │       ├── values-pt-rBR/
│       │       │   └── strings.xml
│       │       ├── values-pt-rPT/
│       │       │   └── strings.xml
│       │       ├── values-ro/
│       │       │   └── strings.xml
│       │       ├── values-rom/
│       │       │   └── strings.xml
│       │       ├── values-ru/
│       │       │   └── strings.xml
│       │       ├── values-ryu/
│       │       │   └── strings.xml
│       │       ├── values-sat/
│       │       │   └── strings.xml
│       │       ├── values-sc/
│       │       │   └── strings.xml
│       │       ├── values-scn/
│       │       │   └── strings.xml
│       │       ├── values-si/
│       │       │   └── strings.xml
│       │       ├── values-sk/
│       │       │   └── strings.xml
│       │       ├── values-sl/
│       │       │   └── strings.xml
│       │       ├── values-so/
│       │       │   └── strings.xml
│       │       ├── values-sq/
│       │       │   └── strings.xml
│       │       ├── values-sr/
│       │       │   └── strings.xml
│       │       ├── values-sv/
│       │       │   └── strings.xml
│       │       ├── values-sw/
│       │       │   └── strings.xml
│       │       ├── values-sw600dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw600dp-land/
│       │       │   └── dimens.xml
│       │       ├── values-ta/
│       │       │   └── strings.xml
│       │       ├── values-te/
│       │       │   └── strings.xml
│       │       ├── values-th/
│       │       │   └── strings.xml
│       │       ├── values-ti/
│       │       │   └── strings.xml
│       │       ├── values-tl/
│       │       │   └── strings.xml
│       │       ├── values-tok/
│       │       │   └── strings.xml
│       │       ├── values-tr/
│       │       │   └── strings.xml
│       │       ├── values-tt/
│       │       │   └── strings.xml
│       │       ├── values-tzm/
│       │       │   └── strings.xml
│       │       ├── values-uk/
│       │       │   └── strings.xml
│       │       ├── values-und/
│       │       │   └── strings.xml
│       │       ├── values-ur/
│       │       │   └── strings.xml
│       │       ├── values-v27/
│       │       │   └── styles.xml
│       │       ├── values-v29/
│       │       │   └── styles.xml
│       │       ├── values-v35/
│       │       │   └── styles.xml
│       │       ├── values-vi/
│       │       │   └── strings.xml
│       │       ├── values-vmf/
│       │       │   └── strings.xml
│       │       ├── values-w820dp/
│       │       │   └── dimens.xml
│       │       ├── values-zh-rCN/
│       │       │   └── strings.xml
│       │       ├── values-zh-rHK/
│       │       │   └── strings.xml
│       │       ├── values-zh-rTW/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           ├── appearance_settings.xml
│       │           ├── automotive_app_desc.xml
│       │           ├── backup_restore_settings.xml
│       │           ├── content_settings.xml
│       │           ├── debug_settings.xml
│       │           ├── download_settings.xml
│       │           ├── exoplayer_settings.xml
│       │           ├── history_settings.xml
│       │           ├── main_settings.xml
│       │           ├── notifications_settings.xml
│       │           ├── player_notification_settings.xml
│       │           ├── update_settings.xml
│       │           └── video_audio_settings.xml
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── schabi/
│           │           └── newpipe/
│           │               ├── NewVersionManagerTest.kt
│           │               ├── database/
│           │               │   └── playlist/
│           │               │       └── PlaylistLocalItemTest.kt
│           │               ├── error/
│           │               │   └── ReCaptchaActivityTest.kt
│           │               ├── ktx/
│           │               │   └── ThrowableExtensionsTest.kt
│           │               ├── local/
│           │               │   ├── playlist/
│           │               │   │   └── ExportPlaylistTest.kt
│           │               │   └── subscription/
│           │               │       ├── FeedGroupIconTest.kt
│           │               │       └── services/
│           │               │           └── ImportExportJsonHelperTest.java
│           │               ├── player/
│           │               │   └── playqueue/
│           │               │       ├── PlayQueueItemTest.java
│           │               │       └── PlayQueueTest.java
│           │               ├── settings/
│           │               │   ├── ImportAllCombinationsTest.kt
│           │               │   ├── ImportExportManagerTest.kt
│           │               │   └── tabs/
│           │               │       ├── TabTest.java
│           │               │       └── TabsJsonHelperTest.java
│           │               ├── streams/
│           │               │   └── SrtFromTtmlWriterTest.java
│           │               └── util/
│           │                   ├── ListHelperTest.java
│           │                   ├── LocalizationTest.kt
│           │                   ├── QuadraticSliderStrategyTest.java
│           │                   ├── external_communication/
│           │                   │   └── TimestampExtractorTest.java
│           │                   ├── image/
│           │                   │   └── ImageStrategyTest.java
│           │                   └── urlfinder/
│           │                       └── UrlFinderTest.kt
│           └── resources/
│               ├── import_export_test.json
│               └── settings/
│                   └── README.md
├── build.gradle.kts
├── buildSrc/
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── kotlin/
│               └── CheckDependenciesOrder.kt
├── checkstyle/
│   ├── checkstyle.xml
│   └── suppressions.xml
├── doc/
│   ├── README.ar.md
│   ├── README.asm.md
│   ├── README.de.md
│   ├── README.es.md
│   ├── README.fr.md
│   ├── README.hi.md
│   ├── README.it.md
│   ├── README.ja.md
│   ├── README.ko.md
│   ├── README.pa.md
│   ├── README.pl.md
│   ├── README.pt_BR.md
│   ├── README.ro.md
│   ├── README.ru.md
│   ├── README.ryu.md
│   ├── README.so.md
│   ├── README.sr.md
│   ├── README.tr.md
│   ├── README.zh_TW.md
│   └── gradle.md
├── fastlane/
│   └── metadata/
│       └── android/
│           ├── ar/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ar_LY/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ast/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── az/
│           │   ├── changelogs/
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 991.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── azb/
│           │   └── short_description.txt
│           ├── bar/
│           │   └── short_description.txt
│           ├── be/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   └── 992.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bg/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bm/
│           │   └── short_description.txt
│           ├── bn/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 953.txt
│           │   │   ├── 956.txt
│           │   │   ├── 962.txt
│           │   │   └── 963.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bn_BD/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bs/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ca/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ckb/
│           │   ├── changelogs/
│           │   │   └── 960.txt
│           │   └── short_description.txt
│           ├── cs/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── cy/
│           │   ├── changelogs/
│           │   │   └── 63.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── da/
│           │   ├── changelogs/
│           │   │   └── 63.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── de/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── el/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 910.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 996.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── en-US/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── en_GB/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── eo/
│           │   ├── changelogs/
│           │   │   └── 63.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── es/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── et/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 962.txt
│           │   │   ├── 967.txt
│           │   │   ├── 969.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── eu/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fa/
│           │   ├── changelogs/
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 870.txt
│           │   │   ├── 910.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 985.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fi/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 830.txt
│           │   │   ├── 957.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   └── 975.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fil/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fr/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── gl/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── he/
│           │   ├── changelogs/
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 973.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 988.txt
│           │   │   ├── 995.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── hi/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── hr/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── hu/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ia/
│           │   └── short_description.txt
│           ├── id/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── is/
│           │   ├── changelogs/
│           │   │   └── 997.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── it/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ja/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   └── 960.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── jv/
│           │   ├── changelogs/
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   └── 860.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ka/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 996.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── kab/
│           │   └── short_description.txt
│           ├── kk/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   └── 65.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── kn-IN/
│           │   ├── changelogs/
│           │   │   ├── 830.txt
│           │   │   └── 850.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ko/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ku/
│           │   └── short_description.txt
│           ├── lmo/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── lt/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 820.txt
│           │   │   └── 830.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── lv/
│           │   ├── changelogs/
│           │   │   ├── 1001.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 950.txt
│           │   │   ├── 956.txt
│           │   │   ├── 963.txt
│           │   │   ├── 982.txt
│           │   │   ├── 985.txt
│           │   │   ├── 989.txt
│           │   │   ├── 996.txt
│           │   │   └── 998.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── mk/
│           │   ├── changelogs/
│           │   │   ├── 1001.txt
│           │   │   ├── 850.txt
│           │   │   └── 982.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ml/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   └── 968.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ms/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 790.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   └── 954.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── nb-NO/
│           │   ├── changelogs/
│           │   │   ├── 954.txt
│           │   │   ├── 956.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 962.txt
│           │   │   ├── 964.txt
│           │   │   ├── 986.txt
│           │   │   └── 992.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ne/
│           │   └── short_description.txt
│           ├── nl/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 985.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── nl-BE/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 910.txt
│           │   │   ├── 950.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   └── 957.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── nqo/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   └── 68.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── or/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pa/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pa-PK/
│           │   └── short_description.txt
│           ├── pl/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   └── 997.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pt/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pt-BR/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 971.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 976.txt
│           │   │   ├── 978.txt
│           │   │   ├── 982.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 989.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pt-PT/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ro/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 770.txt
│           │   │   └── 953.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ru/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sat/
│           │   └── short_description.txt
│           ├── sc/
│           │   ├── changelogs/
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 959.txt
│           │   │   └── 960.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── si/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sk/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sl/
│           │   ├── changelogs/
│           │   │   └── 991.txt
│           │   └── short_description.txt
│           ├── so/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sq/
│           │   ├── changelogs/
│           │   │   └── 1000.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sr/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 956.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   └── 996.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sv/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ta/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── te/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   └── 65.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── th/
│           │   ├── changelogs/
│           │   │   └── 1000.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ti/
│           │   ├── changelogs/
│           │   │   └── 850.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── tl/
│           │   └── short_description.txt
│           ├── tok/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── tr/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 910.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 982.txt
│           │   │   ├── 985.txt
│           │   │   ├── 987.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── uk/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── und/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ur/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 956.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── uz-Latn/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   └── 957.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── vi/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── zh-Hans/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── zh-Hant/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 964.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           └── zh_Hant_HK/
│               ├── changelogs/
│               │   ├── 1000.txt
│               │   ├── 1001.txt
│               │   ├── 1002.txt
│               │   ├── 1003.txt
│               │   ├── 1004.txt
│               │   ├── 1005.txt
│               │   ├── 1007.txt
│               │   ├── 63.txt
│               │   ├── 64.txt
│               │   ├── 65.txt
│               │   ├── 66.txt
│               │   ├── 68.txt
│               │   ├── 981.txt
│               │   ├── 983.txt
│               │   ├── 984.txt
│               │   ├── 985.txt
│               │   ├── 986.txt
│               │   ├── 987.txt
│               │   ├── 988.txt
│               │   ├── 989.txt
│               │   ├── 990.txt
│               │   ├── 991.txt
│               │   ├── 992.txt
│               │   ├── 993.txt
│               │   ├── 994.txt
│               │   ├── 995.txt
│               │   ├── 996.txt
│               │   ├── 997.txt
│               │   ├── 998.txt
│               │   └── 999.txt
│               ├── full_description.txt
│               └── short_description.txt
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
#
# SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>
# SPDX-License-Identifier: GPL-3.0-or-later
#

root = true

[*.{kt,kts}]
ktlint_code_style = android_studio
# https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming
ktlint_function_naming_ignore_when_annotated_with = Composable

ktlint_standard_class-signature = disabled
ktlint_standard_function-expression-body = disabled
ktlint_standard_max-line-length = disabled
ktlint_standard_mixed-condition-operators = disabled
ktlint_standard_package-name = disabled
ktlint_standard_property-naming = disabled


================================================
FILE: .github/CONTRIBUTING.md
================================================
### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code. Only bugfix PRs will be accepted. More details will be announced soon!

NewPipe contribution guidelines
===============================

## AI policy

* Using generative AI to develop new features or making larger code changes is generally prohibited. Please refrain from contributions which are heavily depending on AI generated source code because they are usually lacking a fundamental understanding of the overall project structure and thus come with poor quality. However, you are allowed to use gen. AI if you
  * are aware of the project structure,
  * ensure that the generated code follows the project structure,
  * fully understand the generated code, and
  * review the generated code completely.
* Using AI to find the root cause of bugs and generating small fixes might be acceptable. However, gen. AI often does not fix the underlying problem but is trying to fix the symptoms. If you are using AI to fix bugs, ensure that the root cause is tackled.
* The use of AI to generate documentation is allowed. We ask you to thoroughly check the quality of generated documentation – wrong, misleading or uninformative documentation is useless and wastes the reader's time. Ensure that reasoning is documented.
* Using generative AI to write or fill in PR or issue templates is prohibited. Those texts are often lengthy and miss critical information.
* PRs and issues that do not follow this AI policy can be closed without further explanation.


## Crash reporting

Report crashes through the **automated crash report system** of NewPipe.
This way all the data needed for debugging is included in your bug report for GitHub.
You'll see *exactly* what is sent, be able to add **your comments**, and then send it.

## Issue reporting/feature requests

* **Already reported**? Browse the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) to make sure your issue/feature hasn't been reported/requested.
* **Already fixed**? Check whether your issue/feature is already fixed/implemented.
* **Still relevant**? Check if the issue still exists in the latest release/beta version.
* **Can you fix it**? If you are an Android/Java developer, you are always welcome to fix an issue or implement a feature yourself. PRs welcome! See [Code contribution](#code-contribution) for more info.
* **Is it in English**? Issues in other languages will be ignored unless someone translates them.
* **Is it one issue**? Multiple issues require multiple reports, that can be linked to track their statuses.
* **The template**: Fill it out, everyone wins. Your issue has a chance of getting fixed.


## Translation

* NewPipe is translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). Log in there with your GitHub account, or register.
* Add the language you want to translate if it is not there already: see [How to add a new language](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-add-a-new-language-to-NewPipe) in the wiki.
* NewPipe uses the [PrettyTime](https://github.com/ocpsoft/prettytime) library to display localized versions of dates and times. It needs to be translated, too. Read [these instructions to add a new language](https://www.ocpsoft.org/prettytime/#section-14) and [this issue](https://github.com/TeamNewPipe/NewPipe/issues/9134) for more info.

## Code contribution

### Guidelines

* Stick to NewPipe's *style conventions* of [checkStyle](https://github.com/checkstyle/checkstyle) and [ktlint](https://github.com/pinterest/ktlint). They run each time you build the project.
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy).
* In particular **do not bring non-free software** (e.g. binary blobs) into the project. Make sure you do not introduce any closed-source library from Google.

### Before starting development

* If you want to help out with an existing bug report or feature request, **leave a comment** on that issue saying you want to try your hand at it.
* If there is no existing issue for what you want to work on, **open a new one**  describing the changes you are planning to introduce. This gives the team and the community a chance to give **feedback** before you spend time on something that is already in development, should be done differently, or should be avoided completely.
* Please show **intention to maintain your features** and code after you contribute a PR. Unmaintained code is a hassle for core developers. If you do not intend to maintain features you plan to contribute, please rethink your submission, or clearly state that in the PR description.
* Create PRs that cover only **one specific issue/solution/bug**. Do not create PRs that are huge monoliths and could have been split into multiple independent contributions.
* NewPipe uses [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor) to fetch data from services. If you need to change something there, you must test your changes in NewPipe. Telling NewPipe to use your extractor version can be accomplished by editing the `app/build.gradle` file: the comments under the "NewPipe libraries" section of `dependencies` will help you out.

### Creating a Pull Request (PR)

* Make changes on a **separate branch** with a meaningful name, not on the _master_ branch or the _dev_ branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request (PR) on GitHub.
* Please **test** (compile and run) your code before submitting changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!
* Respond if someone requests changes or otherwise raises issues about your PRs.
* Try to figure out yourself why builds on our CI fail.
* Make sure your PR is **up-to-date** with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you must *rebase* your branch on the `dev` branch manually and resolve the conflicts on your own. You can find help [on the wiki](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-merge-a-PR). Doing this makes the maintainers' job way easier.

## IDE setup & building the app

### Basic setup

NewPipe is developed using [Android Studio](https://developer.android.com/studio/). Learn more about how to install it and how it works in the [official documentation](https://developer.android.com/studio/intro). In particular, make sure you have accepted Android Studio's SDK licences. Once Android Studio is ready, setting up the NewPipe project is fairly simple:
- Clone the NewPipe repository with `git clone https://github.com/TeamNewPipe/NewPipe.git` (or use the link from your own fork, if you want to open a PR).
- Open the folder you just cloned with Android Studio.
- Build and run it just like you would do with any other app, with the green triangle in the top bar.

You may find [SonarLint](https://www.sonarlint.org/intellij)'s **inspections** useful in helping you to write good code and prevent bugs.

### checkStyle setup

The [checkStyle](https://github.com/checkstyle/checkstyle) plugin verifies that Java code abides by the project style. It runs automatically each time you build the project. If you want to view errors directly in the editor, instead of having to skim through the build output, you can install an Android Studio plugin:
- Go to `File -> Settings -> Plugins`, search for `checkstyle` and install `CheckStyle-IDEA`.
- Go to `File -> Settings -> Tools -> Checkstyle`.
- Add NewPipe's configuration file by clicking the `+` in the right toolbar of the "Configuration File" list.
- Under the "Use a local Checkstyle file" bullet, click on `Browse` and, enter `checkstyle` folder under the project's root path and pick the file named `checkstyle.xml`.
- Enable "Store relative to project location" so that moving the directory around does not create issues.
- Insert a description in the top bar, then click `Next` and then `Finish`.
- Activate the configuration file you just added by enabling the checkbox on the left.
- Click `Ok` and you are done.

### ktlint setup

The [ktlint](https://github.com/pinterest/ktlint) plugin does the same job as checkStyle for Kotlin files. Installing the related plugin is as simple as going to `File -> Settings -> Plugins`, searching for `ktlint` and installing `Ktlint (unofficial)`.

## Communication

* You can use a Matrix account to join the NewPipe channel at [#newpipe:matrix.newpipe-ev.de](https://matrix.to/#/#newpipe:matrix.newpipe-ev.de). Some convenient clients, available both for phone and desktop, are listed at that link.
* Alternatively, the #newpipe channel on Libera Chat (`ircs://irc.libera.chat:6697/newpipe`) can also be joined, as it is bridged to the Matrix room. [Click here for webchat](https://web.libera.chat/#newpipe)!
* You can post your suggestions, changes, ideas etc. on either GitHub or Matrix (including via IRC).


================================================
FILE: .github/DISCUSSION_TEMPLATE/questions.yml
================================================
body:
  - type: markdown
    attributes:
      value: |
        Thanks for taking the time to fill out this form! :hugs:

        Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe).

  - type: checkboxes
    id: checklist
    attributes:
      label: "Checklist"
      options:
        - label: "I made sure that there are *no existing issues or discussions* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
          required: true
        - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my question isn't listed."
          required: true
        - label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise."
          required: true
        - label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
          required: true

  - type: textarea
    id: what-is-the-question
    attributes:
      label: What is/are your question(s)?
    validations:
      required: true

  - type: textarea
    id: additional-information
    attributes:
      label: Additional information
      description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.


================================================
FILE: .github/FUNDING.yml
================================================
liberapay: TeamNewPipe
custom: 'https://newpipe.net/donate/'


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report
description: Create a bug report to help us improve
labels: [bug, needs triage]
body:
  - type: markdown
    attributes:
      value: |
        Thank you for helping to make NewPipe better by reporting a bug. :hugs:

        Please fill in as much information as possible about your bug so that we don't have to play "information ping-pong" and can help you immediately.

  - type: checkboxes
    id: checklist
    attributes:
      label: "Checklist"
      options:
        - label: "I am able to reproduce the bug with the latest version given here: [CLICK THIS LINK](https://github.com/TeamNewPipe/NewPipe/releases/latest)."
          required: true
        - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
          required: true
        - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed."
          required: true
        - label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise."
          required: true
        - label: "This issue contains only one bug."
          required: true
        - label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
          required: true
        - label: "I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this bug report is not generated by AI."
          required: true

  - type: input
    id: app-version
    attributes:
     label: Affected version
     description: "In which NewPipe version did you encounter the bug?"
     placeholder: "x.xx.x - Can be seen in the app from the 'About' section in the sidebar"
    validations:
      required: true

  - type: textarea
    id: steps-to-reproduce
    attributes:
      label: Steps to reproduce the bug
      description: |
        What did you do for the bug to show up?

        If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.
      placeholder: |
        1. Go to '...'
        2. Press on '....'
        3. Swipe down to '....'
    validations:
      required: true

  - type: textarea
    id: expected-behavior
    attributes:
      label: Expected behavior
      description: |
        Tell us what you expect to happen.

  - type: textarea
    id: actual-behavior
    attributes:
      label: Actual behavior
      description: |
        Tell us what happens with the steps given above.

  - type: textarea
    id: screen-media
    attributes:
      label: Screenshots/Screen recordings
      description: |
        A picture or video is worth a thousand words.

        If applicable, add screenshots or a screen recording to help explain your problem.
        GitHub supports uploading them directly in the text box.
        If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead.

        :heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE.
        Instead, follow the instructions in the "Logs" section below.

  - type: textarea
    id: logs
    attributes:
      label: Logs
      description: |
        If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on "Copy formatted report" at the bottom and paste it here.

  - type: input
    id: device-os-info
    attributes:
     label: Affected Android/Custom ROM version
     description: |
      With what operating system (+ version) did you encounter the bug?
     placeholder: "Example: Android 12 / LineageOS 18.1"

  - type: input
    id: device-model-info
    attributes:
     label: Affected device model
     description: |
      On what device did you encounter the bug?
     placeholder: "Example: Huawei P20 lite (ANE-LX1) / Samsung Galaxy S20"

  - type: textarea
    id: additional-information
    attributes:
      label: Additional information
      description: |
        Any other information you'd like to include, for instance that 
        * the affected device is foldable or a TV
        * you have disabled all animations on your device
        * your cat disabled your network connection
        * ...



================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: ❓ Question
    url: https://github.com/TeamNewPipe/NewPipe/discussions/new?category=questions
    about: Ask about anything NewPipe-related
  - name: 💬 Matrix
    url: https://matrix.to/#/#newpipe:matrix.newpipe-ev.de
    about: Chat with us via Matrix for quick Q/A
  - name: 💬 IRC
    url: https://web.libera.chat/#newpipe
    about: Chat with us via IRC for quick Q/A


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest an idea for this project
labels: [feature request, needs triage]
body:
  - type: markdown
    attributes:
      value: |
        Thank you for helping to make NewPipe better by suggesting a feature. :hugs:

        Your ideas are highly welcome! The app is made for you, the users, after all.
  - type: checkboxes
    id: checklist
    attributes:
      label: "Checklist"
      options:
        - label: "I made sure that there are *no existing issues* - [open](https://github.com/TeamNewPipe/NewPipe/issues) or [closed](https://github.com/TeamNewPipe/NewPipe/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to."
          required: true
        - label: "I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed."
          required: true
        - label: "I'm aware that this is a request for NewPipe itself and that requests for adding a new service need to be made at [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor/issues)."
          required: true
        - label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise."
          required: true
        - label: "This issue contains only one feature request."
          required: true
        - label: "I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md)."
          required: true
        - label: "I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this request is not generated by AI."
          required: true


  - type: textarea
    id: feature-description
    attributes:
      label: Feature description
      description: |
        Explain how you want the app's look or behavior to change to suit your needs.
    validations:
      required: true

  - type: textarea
    id: why-is-the-feature-requested
    attributes:
      label: Why do you want this feature?
      description: |
        Describe any problem or limitation you come across while using the app which would be solved by this feature.
    validations:
      required: true

  - type: textarea
    id: additional-information
    attributes:
      label: Additional information
      description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!-- Hey there. Thank you so much for improving NewPipe, and filling out the details. Having roughly the same layout helps everyone considerably :)-->

#### What is it?
- [ ] Bugfix (user facing)
- [ ] Feature (user facing) ⚠️ **Your PR must target the [`refactor`](https://github.com/TeamNewPipe/NewPipe/tree/refactor) branch**
- [ ] Codebase improvement (dev facing)
- [ ] Meta improvement to the project (dev facing)

#### Description of the changes in your PR
<!-- While bullet points are the norm in this section, feel free to write free-form text instead of a list -->
- record videos
- create clones
- take over the world

#### Before/After Screenshots/Screen Record
<!-- If your PR changes the app's UI in any way, please include screenshots or a video showing exactly what changed, so that developers and users can pinpoint it easily. Delete this if it doesn't apply to your PR.-->
- Before:
- After:

#### Fixes the following issue(s)
<!-- Prefix issues with "Fixes" so that GitHub closes them when the PR is merged (note that each "Fixes #" should be in its own item). Also add any other relevant links. -->
- Fixes #

#### Relies on the following changes
<!-- Delete this if it doesn't apply to your PR. -->
- 

#### APK testing
<!-- Use a new, meaningfully named branch. The name is used as a suffix for the app ID to allow installing and testing multiple versions of NewPipe, e.g. "commentfix", if your PR implements a bugfix for comments. (No names like "patch-0" and "feature-1".)  -->
<!-- Remove the following line if you directly link the APK created by the CI pipeline. Directly linking is preferred if you need to let users test.-->
The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR. You can find more info and a video demonstration [on this wiki page](https://github.com/TeamNewPipe/NewPipe/wiki/Download-APK-for-PR).

#### Due diligence
- [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md).
- [ ] The proposed changes follow the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md#ai-policy).
- [ ] I tested the changes using an emulator or a physical device.


================================================
FILE: .github/changed-lines-count-labeler.yml
================================================
# Add 'size/small' label to any changes with less than 50 lines
size/small:
  max: 49

# Add 'size/medium' label to any changes between 50 and 249 lines
size/medium:
  min: 50
  max: 249

# Add 'size/large' label to any changes between 250 and 749 lines
size/large:
  min: 250
  max: 749

# Add 'size/giant' label to any changes for more than 749 lines
size/giant:
  min: 750


================================================
FILE: .github/workflows/backport-pr.yml
================================================
name: Backport merged pull request
on:
  issue_comment:
    types: [created]
permissions:
  contents: write # for comment creation on original PR
  pull-requests: write
jobs:
  backport:
    name: Backport pull request
    runs-on: ubuntu-latest

    # Only run when the comment starts with the `/backport` command on a PR and
    # the commenter has write access to the repository. We do not want to allow
    # everybody to trigger backports and create branches in our repository.
    if: >
        github.event.issue.pull_request &&
        startsWith(github.event.comment.body, '/backport ') &&
        (
        github.event.comment.author_association == 'OWNER' ||
        github.event.comment.author_association == 'COLLABORATOR' ||
        github.event.comment.author_association == 'MEMBER'
        )
    steps:
      - uses: actions/checkout@v6
      - name: Get backport metadata
        # the target branch is the first argument after `/backport`
        env:
          COMMENT_BODY: ${{ github.event.comment.body }}
        run: |
          set -euo pipefail
          body="$COMMENT_BODY"
          
          line=${body%%$'\n'*} # Get the first line
          if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then
            echo "BACKPORT_TARGET=${BASH_REMATCH[1]}" >> "$GITHUB_ENV"
          else
            echo "Usage: /backport <target-branch>" >&2
            exit 1
          fi

      - name: Create backport pull request
        uses: korthout/backport-action@v4
        with:
          add_labels: 'backport'
          copy_labels_pattern: '.*'
          label_pattern: ''
          target_branches: ${{ env.BACKPORT_TARGET }}

================================================
FILE: .github/workflows/build-release-apk.yml
================================================
name: "Build unsigned release APK on master"

on:
  workflow_dispatch:

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
        with:
          ref: 'master'

      - uses: actions/setup-java@v5
        with:
          distribution: 'temurin'
          java-version: '21'
          cache: 'gradle'

      - name: "Build release APK"
        run: ./gradlew assembleRelease --stacktrace

      - name: "Rename APK"
        run: |
          VERSION_NAME="$(jq -r ".elements[0].versionName" "app/build/outputs/apk/release/output-metadata.json")"
          echo "Version name: $VERSION_NAME" >> "$GITHUB_STEP_SUMMARY"
          echo '```json' >> "$GITHUB_STEP_SUMMARY"
          cat "app/build/outputs/apk/release/output-metadata.json" >> "$GITHUB_STEP_SUMMARY"
          echo >> "$GITHUB_STEP_SUMMARY"
          echo '```' >> "$GITHUB_STEP_SUMMARY"
          # assume there is only one APK in that folder
          mv app/build/outputs/apk/release/*.apk "app/build/outputs/apk/release/NewPipe_v$VERSION_NAME.apk"

      - name: "Upload APK"
        uses: actions/upload-artifact@v6
        with:
          name: app
          path: app/build/outputs/apk/release/*.apk


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  workflow_dispatch:
  pull_request:
    branches:
      - dev
      - master
      - refactor
      - release**
    paths-ignore:
      - 'README.md'
      - 'doc/**'
      - 'fastlane/**'
      - 'assets/**'
      - '.github/**/*.md'
      - '.github/FUNDING.yml'
      - '.github/ISSUE_TEMPLATE/**'
  push:
    branches:
      - dev
      - master
    paths-ignore:
      - 'README.md'
      - 'doc/**'
      - 'fastlane/**'
      - 'assets/**'
      - '.github/**/*.md'
      - '.github/FUNDING.yml'
      - '.github/ISSUE_TEMPLATE/**'

jobs:
  build-and-test-jvm:
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v6
      - uses: gradle/actions/wrapper-validation@v5

      - name: create and checkout branch
        # push events already checked out the branch
        if: github.event_name == 'pull_request'
        env:
          BRANCH: ${{ github.head_ref }}
        run: git checkout -B "$BRANCH"

      - name: set up JDK
        uses: actions/setup-java@v5
        with:
          java-version: 21
          distribution: "temurin"
          cache: 'gradle'

      - name: Build debug APK and run jvm tests
        run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint

      - name: Upload APK
        uses: actions/upload-artifact@v6
        with:
          name: app
          path: app/build/outputs/apk/debug/*.apk

  test-android:
    runs-on: ubuntu-latest
    timeout-minutes: 20
    strategy:
      matrix:
        include:
          - api-level: 21
            target: default
            arch: x86
          - api-level: 35
            target: default
            arch: x86_64

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v6

      - name: Enable KVM
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm

      - name: set up JDK
        uses: actions/setup-java@v5
        with:
          java-version: 21
          distribution: "temurin"
          cache: 'gradle'

      - name: Run android tests
        uses: reactivecircus/android-emulator-runner@v2
        with:
          api-level: ${{ matrix.api-level }}
          target: ${{ matrix.target }}
          arch: ${{ matrix.arch }}
          script: ./gradlew connectedCheck --stacktrace

      - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553
        uses: actions/upload-artifact@v6
        if: failure()
        with:
          name: android-test-report-api${{ matrix.api-level }}
          path: app/build/reports/androidTests/connected/**

  sonar:
    if: ${{ false }} # the key has expired and needs to be regenerated by the sonar admins
    runs-on: ubuntu-latest

    permissions:
      contents: read

    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis

      - name: Set up JDK
        uses: actions/setup-java@v5
        with:
          java-version: 21
          distribution: "temurin"
          cache: 'gradle'

      - name: Cache SonarCloud packages
        uses: actions/cache@v5
        with:
          path: ~/.sonar/cache
          key: ${{ runner.os }}-sonar
          restore-keys: ${{ runner.os }}-sonar

      - name: Build and analyze
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        run: ./gradlew build sonar --info


================================================
FILE: .github/workflows/image-minimizer.js
================================================
/*
 * Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise
 */
module.exports = async ({github, context}) => {
    const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';
    const IGNORE_ALT_NAME_END = 'ignoreImageMinify';
    // Targeted maximum height
    const IMG_MAX_HEIGHT_PX = 600;
    // maximum width of GitHub issues/comments
    const IMG_MAX_WIDTH_PX = 800;
    // all images that have a lower aspect ratio (-> have a smaller width) than this will be minimized
    const MIN_ASPECT_RATIO = IMG_MAX_WIDTH_PX / IMG_MAX_HEIGHT_PX

    // Get the body of the image
    let initialBody = null;
    if (context.eventName == 'issue_comment') {
        initialBody = context.payload.comment.body;
    } else if (context.eventName == 'issues') {
        initialBody = context.payload.issue.body;
    } else if (context.eventName == 'pull_request') {
        initialBody = context.payload.pull_request.body;
    } else {
        console.log('Aborting: No body found');
        return;
    }
    console.log(`Found body: \n${initialBody}\n`);

    // Check if we should ignore the currently processing element
    if (initialBody.includes(IGNORE_KEY)) {
        console.log('Ignoring: Body contains IGNORE_KEY');
        return;
    }

    // Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com/<number>/<variousHexStringsAnd->.<fileExtension>)
    const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\!\[([^\]]*)\]\((https:\/\/[-a-z0-9]+\.githubusercontent\.com\/\d+\/[-0-9a-f]{32,512}\.(jpg|gif|png))\)/gm;
    const REGEX_ASSETS_IMAGE_LOOKUP = /\!\[([^\]]*)\]\((https:\/\/github\.com\/(?:user-attachments\/assets|[-\w\d]+\/[-\w\d]+\/assets\/\d+)\/[\-0-9a-f]{32,512})\)/gm;

    // Check if we found something
    let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody)
        || REGEX_ASSETS_IMAGE_LOOKUP.test(initialBody);
    if (!foundSimpleImages) {
        console.log('Found no simple images to process');
        return;
    }

    console.log('Found at least one simple image to process');

    // Require the probe lib for getting the image dimensions
    const probe = require('probe-image-size');
    
    var wasMatchModified = false;

    // Try to find and replace the images with minimized ones
    let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync);
    newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOOKUP, minimizeAsync);
    
    if (!wasMatchModified) {
        console.log('Nothing was modified. Skipping update');
        return;
    }

    // Update the corresponding element
    if (context.eventName == 'issue_comment') {
        console.log('Updating comment with id', context.payload.comment.id);
        await github.rest.issues.updateComment({
            comment_id: context.payload.comment.id,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: newBody
        })
    } else if (context.eventName == 'issues') {
        console.log('Updating issue', context.payload.issue.number);
        await github.rest.issues.update({
            issue_number: context.payload.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: newBody
        });
    } else if (context.eventName == 'pull_request') {
        console.log('Updating pull request', context.payload.pull_request.number);
        await github.rest.pulls.update({
            pull_number: context.payload.pull_request.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: newBody
        });
    }

    // Async replace function from https://stackoverflow.com/a/48032528
    async function replaceAsync(str, regex, asyncFn) {
        const promises = [];
        str.replace(regex, (match, ...args) => {
            const promise = asyncFn(match, ...args);
            promises.push(promise);
        });
        const data = await Promise.all(promises);
        return str.replace(regex, () => data.shift());
    }

    async function minimizeAsync(match, g1, g2) {
            console.log(`Found match '${match}'`);

            if (g1.endsWith(IGNORE_ALT_NAME_END)) {
                console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`);
                return match;
            }

            let probeAspectRatio = 0;
            let shouldModify = false;
            try {
                console.log(`Probing ${g2}`);
                let probeResult = await probe(g2);
                if (probeResult == null) {
                    throw 'No probeResult';
                }
                if (probeResult.hUnits != 'px') {
                    throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;
                }
                if (probeResult.height <= 0) {
                    throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`;
                }
                if (probeResult.wUnits != 'px') {
                    throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`;
                }
                if (probeResult.width <= 0) {
                    throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`;
                }
                console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`);

                probeAspectRatio = probeResult.width / probeResult.height;
                shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO;
            } catch(e) {
                console.log('Probing failed:', e);
                // Immediately abort
                return match;
            }

            if (shouldModify) {
                wasMatchModified = true;
                console.log(`Modifying match '${match}'`);
                return `<img alt="${g1}" src="${g2}" width=${Math.min(600, Math.floor(IMG_MAX_HEIGHT_PX * probeAspectRatio))} />`;
            }

            console.log(`Match '${match}' is ok/will not be modified`);
            return match;
        }
}


================================================
FILE: .github/workflows/image-minimizer.yml
================================================
name: Image Minimizer

on:
  issue_comment:
    types: [created, edited]
  issues:
    types: [opened, edited]
  pull_request:
    types: [opened, edited]

permissions:
  issues: write
  pull-requests: write

jobs:
  try-minimize:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: 16

      - name: Install probe-image-size
        run: npm i probe-image-size@7.2.3 --ignore-scripts

      - name: Minimize simple images
        uses: actions/github-script@v8
        timeout-minutes: 3
        with:
          script: |
            const script = require('.github/workflows/image-minimizer.js');
            await script({github, context});


================================================
FILE: .github/workflows/no-response.yml
================================================
name: No Response

# Both `issue_comment` and `scheduled` event types are required for this Action
# to work properly.
on:
  issue_comment:
    types: [created]
  schedule:
    # Run daily at midnight.
    - cron: '0 0 * * *'

permissions:
  issues: write
  pull-requests: write

jobs:
  noResponse:
    runs-on: ubuntu-latest
    steps:
      - uses: lee-dohm/no-response@v0.5.0
        with:
          token: ${{ github.token }}
          daysUntilClose: 14
          responseRequiredLabel: waiting for author


================================================
FILE: .github/workflows/pr-labeler.yml
================================================
name: "PR size labeler"
on: [pull_request_target]
permissions:
  contents: read
  pull-requests: write

jobs:
  changed-lines-count-labeler:
    runs-on: ubuntu-latest
    name: Automatically labelling pull requests based on the changed lines count
    permissions:
      pull-requests: write
    steps:
    - name: Set a label
      uses: TeamNewPipe/changed-lines-count-labeler@main
      with:
        repo-token: ${{ secrets.GITHUB_TOKEN }}
        configuration-path: .github/changed-lines-count-labeler.yml


================================================
FILE: .gitignore
================================================
.gradle/
local.properties
.DS_Store
build/
captures/
.idea/
*.iml
*~
.weblate
.kotlin
*.class
app/debug/
app/release/

# vscode / eclipse files
*.classpath
*.project
*.settings
bin/
.vscode/
*.code-workspace


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
<h3 align="center">We are <i>rewriting</i> large chunks of the codebase, to bring about <a href="https://newpipe.net/blog/pinned/announcement/newpipe-0.27.6-rewrite-team-states/#the-refactor">a modern and stable NewPipe</a>! You can download nightly builds <a href="https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases">here</a>.</h3>
<h4 align="center">Please work on the <code>refactor</code> branch if you want to contribute <i>new features</i>. The current codebase is in maintenance mode and will only receive <i>bugfixes</i>.</h4>

<p align="center"><a href="https://newpipe.net"><img src="assets/new_pipe_icon_5.png" width="150"></a></p> 
<h2 align="center"><b>NewPipe</b></h2>
<h4 align="center">A libre lightweight streaming front-end for Android.</h4>

<p align="center"><a href="https://f-droid.org/packages/org.schabi.newpipe/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg" alt="Get it on F-Droid" width=206/></a></p>

<p align="center">
<a href="https://github.com/TeamNewPipe/NewPipe/releases" alt="GitHub NewPipe releases"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg" ></a>
<a href="https://github.com/TeamNewPipe/NewPipe-nightly/releases" alt="GitHub NewPipe nightly releases"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly"></a>
<a href="https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases" alt="GitHub NewPipe refactor nightly releases"><img src="https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly"></a>
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
<a href="https://github.com/TeamNewPipe/NewPipe/actions" alt="Build Status"><img src="https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push"></a>
<a href="https://hosted.weblate.org/engage/newpipe/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg"></a>
</p>

<p align="center">
<a href="https://web.libera.chat/#newpipe" alt="IRC channel: #newpipe"><img src="https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg"></a>
<a href="https://matrix.to/#/#newpipe:matrix.newpipe-ev.de" alt="Matrix channel: #newpipe"><img src="https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue"></a>
</p>

<hr>
<p align="center"><a href="#screenshots">Screenshots</a> &bull; <a href="#supported-services">Supported Services</a> &bull; <a href="#description">Description</a> &bull; <a href="#features">Features</a> &bull; <a href="#installation-and-updates">Installation and updates</a> &bull; <a href="#contribution">Contribution</a> &bull; <a href="#donate">Donate</a> &bull; <a href="#license">License</a></p>
<p align="center"><a href="https://newpipe.net">Website</a> &bull; <a href="https://newpipe.net/blog/">Blog</a> &bull; <a href="https://newpipe.net/FAQ/">FAQ</a> &bull; <a href="https://newpipe.net/press/">Press</a></p>
<hr>

*Read this document in other languages: [Deutsch](doc/README.de.md), [English](README.md), [Español](doc/README.es.md), [Français](doc/README.fr.md), [हिन्दी](doc/README.hi.md), [Italiano](doc/README.it.md), [한국어](doc/README.ko.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [ਪੰਜਾਬੀ ](doc/README.pa.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Soomaali](doc/README.so.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md), [অসমীয়া](doc/README.asm.md), [Српски](doc/README.sr.md), [العربية](README.ar.md)* 

> [!warning]
> <b>THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE.</b>
> 
> <b>PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS.</b>

## Screenshots

[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/00.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/01.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/02.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/03.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/04.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/05.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/06.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/07.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/08.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)
<br/><br/>
[<img src="fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png" width=405>](fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)
[<img src="fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png" width=405>](fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)

### Supported Services

NewPipe currently supports these services:

<!-- We link to the service websites separately to avoid people accidentally opening a website they didn't want to. -->
* YouTube ([website](https://www.youtube.com/)) and YouTube Music ([website](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))
* PeerTube ([website](https://joinpeertube.org/)) and all its instances (open the website to know what that means!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))
* Bandcamp ([website](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))
* SoundCloud ([website](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))
* media.ccc.de ([website](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))

As you can see, NewPipe supports multiple video and audio services. Though it started off with YouTube, other people have added more services over the years, making NewPipe more and more versatile!

Partially due to circumstance, and partially due to its popularity, YouTube is the best supported out of these services. If you use or are familiar with any of these other services, please help us improve support for them! We're looking for maintainers for SoundCloud and PeerTube.

If you intend to add a new service, please get in touch with us first! Our [docs](https://teamnewpipe.github.io/documentation/) provide more information on how a new service can be added to the app and to the [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor).

## Description

NewPipe works by fetching the required data from the official API (e.g. PeerTube) of the service you're using. If the official API is restricted (e.g. YouTube) for our purposes, or is proprietary, the app parses the website or uses an internal API instead. This means that you don't need an account on any service to use NewPipe.

Also, since they are free and open source software, neither the app nor the Extractor use any proprietary libraries or frameworks, such as Google Play Services. This means you can use NewPipe on devices or custom ROMs that do not have Google apps installed.

### Features

* Watch videos at resolutions up to 4K
* Listen to audio in the background, only loading the audio stream to save data
* Popup mode (floating player, aka Picture-in-Picture)
* Watch live streams
* Show/hide subtitles/closed captions
* Search videos and audios (on YouTube, you can specify the content language as well)
* Enqueue videos (and optionally save them as local playlists)
* Show/hide general information about videos (such as description and tags)
* Show/hide next/related videos
* Show/hide comments
* Search videos, audios, channels, playlists and albums
* Browse videos and audios within a channel
* Subscribe to channels (yes, without logging into any account!)
* Get notifications about new videos from channels you're subscribed to
* Create and edit channel groups (for easier browsing and management)
* Browse video feeds generated from your channel groups
* View and search your watch history
* Search and watch playlists (these are remote playlists, which means they're fetched from the service you're browsing)
* Create and edit local playlists (these are created and saved within the app, and have nothing to do with any service)
* Download videos/audios/subtitles (closed captions)
* Open in Kodi
* Watch/Block age-restricted material

<!-- Hidden span to keep old links compatible. You should remove this span if you're translating the README into another language.-->
<span id="updates"></span>

## Installation and updates
You can install NewPipe using one of the following methods:
 1. Add our custom repo to F-Droid and install it from there. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/
 2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases), [compare the signing key](#apk-info) and install it.
 3. Update via F-Droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, and then push the update to users.
 4. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods.
 5. If you're interested in a specific feature or bugfix provided in a Pull Request in this repo, you can also download its APK from within the PR. Read the PR description for instructions. The great thing about PR-specific APKs is that they're installed side-by-side the official app, so you don't have to worry about losing your data or messing anything up.

We recommend method 1 for most users. APKs installed using method 1 or 2 are compatible with each other (meaning that if you installed NewPipe using either method 1 or 2, you can also update NewPipe using the other), but not with those installed using method 3. This is due to the same signing key (ours) being used for 1 and 2, but a different signing key (F-Droid's) being used for 3. Building a debug APK using method 4 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app. When using method 5, each APK is signed with a different random key supplied by GitHub Actions, so you cannot even update it. You will have to backup and restore the app data each time you wish to use a new APK.

In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality breaks and F-Droid doesn't have the latest update yet), we recommend following this procedure:
1. Back up your data via Settings > Backup and Restore > Export Database so you keep your history, subscriptions, and playlists
2. Uninstall NewPipe
3. Download the APK from the new source and install it
4. Import the data from step 1 via Settings > Backup and Restore > Import Database

> [!Note]
> When you're importing a database into the official app, always make sure that it is the one you exported _from_ the official app. If you import a database exported from an APK other than the official app, it may break things. Such an action is unsupported, and you should only do so when you're absolutely certain you know what you're doing.

### APK Info

This is the SHA fingerprint of NewPipe's signing key to verify downloaded APKs which are signed by us. The fingerprint is also available on [NewPipe's website](https://newpipe.net#download). This is relevant for method 2.
```
CB:84:06:9B:D6:81:16:BA:FA:E5:EE:4E:E5:B0:8A:56:7A:A6:D8:98:40:4E:7C:B1:2F:9E:75:6D:F5:CF:5C:AB
```

## Contribution
Whether you have ideas, translations, design changes, code cleaning, or even major code changes, help is always welcome. The app gets better and better with each contribution, no matter how big or small! If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTING.md).

<a href="https://hosted.weblate.org/engage/newpipe/">
<img src="https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png" alt="Translation status" />
</a>

## Donate
If you like NewPipe, you're welcome to send a donation. We prefer Liberapay, as it is both open-source and non-profit. For further info on donating to NewPipe, please visit our [website](https://newpipe.net/donate).

<table>
  <tr>
    <td><a href="https://liberapay.com/TeamNewPipe/"><img src="https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg" alt="Liberapay" width="80px" ></a></td>
    <td><a href="https://liberapay.com/TeamNewPipe/"><img src="assets/liberapay_qr_code.png" alt="Visit NewPipe at liberapay.com" width="100px"></a></td>
    <td><a href="https://liberapay.com/TeamNewPipe/donate"><img src="assets/liberapay_donate_button.svg" alt="Donate via Liberapay" height="35px"></a></td>
  </tr>
</table>

## Privacy Policy

The NewPipe project aims to provide a private, anonymous experience for using web-based media services. Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or leave a comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/).

## License
[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  

NewPipe is Free Software: You can use, study, share, and improve it at will. Specifically you can redistribute and/or modify it under the terms of the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.


================================================
FILE: app/build.gradle.kts
================================================
/*
 * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

import com.android.build.api.dsl.ApplicationExtension

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
    alias(libs.plugins.jetbrains.kotlin.kapt)
    alias(libs.plugins.google.ksp)
    alias(libs.plugins.jetbrains.kotlin.parcelize)
    alias(libs.plugins.jetbrains.kotlinx.serialization)
    alias(libs.plugins.sonarqube)
    checkstyle
}

val gitWorkingBranch = providers.exec {
    commandLine("git", "rev-parse", "--abbrev-ref", "HEAD")
}.standardOutput.asText.map { it.trim() }

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

kotlin {
    compilerOptions {
        // TODO: Drop annotation default target when it is stable
        freeCompilerArgs.addAll(
            "-Xannotation-default-target=param-property"
        )
    }
}

configure<ApplicationExtension> {
    compileSdk = 36
    namespace = "org.schabi.newpipe"

    defaultConfig {
        applicationId = "org.schabi.newpipe"
        resValue("string", "app_name", "NewPipe")
        minSdk = 21
        targetSdk = 35

        versionCode = System.getProperty("versionCodeOverride")?.toInt() ?: 1009

        versionName = "0.28.4"
        System.getProperty("versionNameSuffix")?.let { versionNameSuffix = it }

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            isDebuggable = true

            // suffix the app id and the app name with git branch name
            val defaultBranches = listOf("master", "dev")
            val workingBranch = gitWorkingBranch.getOrElse("")
            val normalizedWorkingBranch = workingBranch
                .replaceFirst("^[^A-Za-z]+".toRegex(), "")
                .replace("[^0-9A-Za-z]+".toRegex(), "")

            if (normalizedWorkingBranch.isEmpty() || workingBranch in defaultBranches) {
                // default values when branch name could not be determined or is master or dev
                applicationIdSuffix = ".debug"
                resValue("string", "app_name", "NewPipe Debug")
            } else {
                applicationIdSuffix = ".debug.$normalizedWorkingBranch"
                resValue("string", "app_name", "NewPipe $workingBranch")
            }
        }

        release {
            System.getProperty("packageSuffix")?.let { suffix ->
                applicationIdSuffix = suffix
                resValue("string", "app_name", "NewPipe $suffix")
            }
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

    lint {
        lintConfig = file("lint.xml")
        // Continue the debug build even when errors are found
        abortOnError = false
    }

    compileOptions {
        // Flag to enable support for the new language APIs
        isCoreLibraryDesugaringEnabled = true
        encoding = "utf-8"
    }

    sourceSets {
        getByName("androidTest") {
            assets.directories += "$projectDir/schemas"
        }
    }

    androidResources {
        generateLocaleConfig = true
    }

    buildFeatures {
        viewBinding = true
        buildConfig = true
        resValues = true
    }

    packaging {
        resources {
            // remove two files which belong to jsoup
            // no idea how they ended up in the META-INF dir...
            excludes += setOf(
                "META-INF/README.md",
                "META-INF/CHANGES",
                "META-INF/COPYRIGHT" // "COPYRIGHT" belongs to RxJava...
            )
        }
    }
}

ksp {
    arg("room.schemaLocation", "$projectDir/schemas")
}


// Custom dependency configuration for ktlint
val ktlint by configurations.creating

// https://checkstyle.org/#JRE_and_JDK
tasks.withType<Checkstyle>().configureEach {
    javaLauncher = javaToolchains.launcherFor {
        languageVersion = JavaLanguageVersion.of(21)
    }
}

checkstyle {
    configDirectory = rootProject.file("checkstyle")
    isIgnoreFailures = false
    isShowViolations = true
    toolVersion = libs.versions.checkstyle.get()
}

tasks.register<Checkstyle>("runCheckstyle") {
    source("src")
    include("**/*.java")
    exclude("**/gen/**")
    exclude("**/R.java")
    exclude("**/BuildConfig.java")
    exclude("main/java/us/shandian/giga/**")

    classpath = configurations.getByName("checkstyle")

    isShowViolations = true

    reports {
        xml.required = true
        html.required = true
    }
}

val outputDir = project.layout.buildDirectory.dir("reports/ktlint/")
val inputFiles = fileTree("src") { include("**/*.kt") }

tasks.register<JavaExec>("runKtlint") {
    inputs.files(inputFiles)
    outputs.dir(outputDir)
    mainClass.set("com.pinterest.ktlint.Main")
    classpath = configurations.getByName("ktlint")
    args = listOf("--editorconfig=../.editorconfig", "src/**/*.kt")
    jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED")
}

tasks.register<JavaExec>("formatKtlint") {
    inputs.files(inputFiles)
    outputs.dir(outputDir)
    mainClass.set("com.pinterest.ktlint.Main")
    classpath = configurations.getByName("ktlint")
    args = listOf("--editorconfig=../.editorconfig", "-F", "src/**/*.kt")
    jvmArgs = listOf("--add-opens", "java.base/java.lang=ALL-UNNAMED")
}

tasks.register<CheckDependenciesOrder>("checkDependenciesOrder") {
    tomlFile = layout.projectDirectory.file("../gradle/libs.versions.toml")
}

afterEvaluate {
    tasks.named("preDebugBuild").configure {
        if (!System.getProperties().containsKey("skipFormatKtlint")) {
            dependsOn("formatKtlint")
        }
        dependsOn("runCheckstyle", "runKtlint", "checkDependenciesOrder")
    }
}

sonar {
    properties {
        property("sonar.projectKey", "TeamNewPipe_NewPipe")
        property("sonar.organization", "teamnewpipe")
        property("sonar.host.url", "https://sonarcloud.io")
    }
}

dependencies {
    /** Desugaring **/
    coreLibraryDesugaring(libs.android.desugar)

    /** NewPipe libraries **/
    implementation(libs.newpipe.nanojson)
    implementation(libs.newpipe.extractor)
    implementation(libs.newpipe.filepicker)

    /** Checkstyle **/
    checkstyle(libs.puppycrawl.checkstyle)
    ktlint(libs.pinterest.ktlint)

    /** AndroidX **/
    implementation(libs.androidx.appcompat)
    implementation(libs.androidx.cardview)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.androidx.core)
    implementation(libs.androidx.documentfile)
    implementation(libs.androidx.fragment)
    implementation(libs.androidx.lifecycle.livedata)
    implementation(libs.androidx.lifecycle.viewmodel)
    implementation(libs.androidx.localbroadcastmanager)
    implementation(libs.androidx.media)
    implementation(libs.androidx.preference)
    implementation(libs.androidx.recyclerview)
    implementation(libs.androidx.room.runtime)
    implementation(libs.androidx.room.rxjava3)
    ksp(libs.androidx.room.compiler)
    implementation(libs.androidx.swiperefreshlayout)
    implementation(libs.androidx.viewpager2)
    implementation(libs.androidx.work.runtime)
    implementation(libs.androidx.work.rxjava3)
    implementation(libs.google.android.material)
    implementation(libs.androidx.webkit)

    // Coroutines interop
    implementation(libs.kotlinx.coroutines.rx3)

    // Kotlinx Serialization
    implementation(libs.kotlinx.serialization.json)

    /** Third-party libraries **/
    implementation(libs.livefront.bridge)
    implementation(libs.evernote.statesaver.core)
    kapt(libs.evernote.statesaver.compiler)

    // HTML parser
    implementation(libs.jsoup)

    // HTTP client
    implementation(libs.squareup.okhttp)

    // Media player
    implementation(libs.google.exoplayer.core)
    implementation(libs.google.exoplayer.dash)
    implementation(libs.google.exoplayer.database)
    implementation(libs.google.exoplayer.datasource)
    implementation(libs.google.exoplayer.hls)
    implementation(libs.google.exoplayer.mediasession)
    implementation(libs.google.exoplayer.smoothstreaming)
    implementation(libs.google.exoplayer.ui)

    // Manager for complex RecyclerView layouts
    implementation(libs.lisawray.groupie.core)
    implementation(libs.lisawray.groupie.viewbinding)

    // Image loading
    implementation(libs.coil.compose)
    implementation(libs.coil.network.okhttp)

    // Markdown library for Android
    implementation(libs.noties.markwon.core)
    implementation(libs.noties.markwon.linkify)

    // Crash reporting
    implementation(libs.acra.core)
    compileOnly(libs.google.autoservice.annotations)
    ksp(libs.zacsweers.autoservice.compiler)

    // Properly restarting
    implementation(libs.jakewharton.phoenix)

    // Reactive extensions for Java VM
    implementation(libs.reactivex.rxjava)
    implementation(libs.reactivex.rxandroid)
    // RxJava binding APIs for Android UI widgets
    implementation(libs.jakewharton.rxbinding)

    // Date and time formatting
    implementation(libs.ocpsoft.prettytime)

    /** Debugging **/
    // Memory leak detection
    debugImplementation(libs.squareup.leakcanary.watcher)
    debugImplementation(libs.squareup.leakcanary.plumber)
    debugImplementation(libs.squareup.leakcanary.core)
    // Debug bridge for Android
    debugImplementation(libs.facebook.stetho.core)
    debugImplementation(libs.facebook.stetho.okhttp3)

    /** Testing **/
    testImplementation(libs.junit)
    testImplementation(libs.mockito.core)

    androidTestImplementation(libs.androidx.junit)
    androidTestImplementation(libs.androidx.runner)
    androidTestImplementation(libs.androidx.room.testing)
    androidTestImplementation(libs.assertj.core)
}


================================================
FILE: app/lint.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>
  ~ SPDX-License-Identifier: GPL-3.0-or-later
  -->
<lint>
    <issue id="MissingTranslation" severity="ignore" />
    <issue id="MissingQuantity" severity="ignore" />
    <issue id="ImpliedQuantity" severity="ignore" />
</lint>


================================================
FILE: app/proguard-rules.pro
================================================
# https://developer.android.com/build/shrink-code

## Helps debug release versions
-dontobfuscate

## Rules for NewPipeExtractor
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
## Rules for Rhino and Rhino Engine
-keep class org.mozilla.javascript.* { *; }
-keep class org.mozilla.javascript.** { *; }
-keep class org.mozilla.javascript.engine.** { *; }
-keep class org.mozilla.classfile.ClassFileWriter
-dontwarn org.mozilla.javascript.JavaToJSONConverters
-dontwarn org.mozilla.javascript.tools.**
-keep class javax.script.** { *; }
-dontwarn javax.script.**
-keep class jdk.dynalink.** { *; }
-dontwarn jdk.dynalink.**
# Rules for jsoup
# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex
# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs
# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed
-dontwarn com.google.re2j.**

## Rules for ExoPlayer
-keep class com.google.android.exoplayer2.** { *; }

## Rules for OkHttp. Copy pasted from https://github.com/square/okhttp
-dontwarn okhttp3.**
-dontwarn okio.**

## See https://github.com/TeamNewPipe/NewPipe/pull/1441
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    !static !transient <fields>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
}

## For some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml)
-keep class org.schabi.newpipe.settings.notifications.** { *; }

# Prevent R8 from stripping or renaming Protobuf internal fields
-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite {
    <fields>;
}

## Keep Kotlinx Serialization classes
-keepclassmembers class kotlinx.serialization.json.** {
    *** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
    kotlinx.serialization.KSerializer serializer(...);
}
-keep,includedescriptorclasses class org.schabi.newpipe.**$$serializer { *; }
-keepclassmembers class org.schabi.newpipe.** {
    *** Companion;
}
-keepclasseswithmembers class org.schabi.newpipe.** {
    kotlinx.serialization.KSerializer serializer(...);
}


================================================
FILE: app/sampledata/channels.json
================================================
{
  "data": [
    {
      "name": "BBC",
      "additional": "12K subscribers•233 videos",
      "description": "The BBC is the world’s leading public service broadcaster. We’re impartial and independent, and every day we create distinctive, world-class programmes and content which inform, educate and entertain millions of people in the UK and around the world. SUBSCRIBE to our YouTube channel to get the best of BBC entertainment and comedy programmes, stories from science and nature documentaries, and much more! https://bit.ly/2IXqEIn Get ALL your fresh TV, and sofa-hugging box sets on iPlayer https://bbc.in/2J18jYJ"
    },
    {
      "name": "Linus Tech Tips",
      "additional": "1M subscribers•233 videos",
      "description": "Looking for a Tech YouTuber?\n\nLinus Tech Tips is a passionate team of \"professionally curious\" experts in consumer technology and video production which aims to inform and educate people of all ages through our entertaining videos. We create product reviews, step-by-step computer build guides, and a variety of other tech-focused content.\n\nSchedule:\nNew videos every Saturday to Thursday @ 10:00am Pacific\nLive WAN Show podcasts every Friday @ ~5:00pm Pacific"
    },
    {
      "name": "Marques Brownlee",
      "additional": "13 subscribers•12K videos",
      "description": "MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!\n\nbusiness@MKBHD.com\n\nNYC"
    }
  ]
}

================================================
FILE: app/schemas/org.schabi.newpipe.database.AppDatabase/2.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 2,
    "identityHash": "b7856223e2595ddf20a3ce6243ce9527",
    "entities": [
      {
        "tableName": "subscriptions",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "avatarUrl",
            "columnName": "avatar_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "subscriberCount",
            "columnName": "subscriber_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "description",
            "columnName": "description",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_subscriptions_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "search_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "creationDate",
            "columnName": "creation_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "search",
            "columnName": "search",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_search_history_search",
            "unique": false,
            "columnNames": [
              "search"
            ],
            "createSql": "CREATE  INDEX `index_search_history_search` ON `${TABLE_NAME}` (`search`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "streams",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, `stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, `thumbnail_url` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "title",
            "columnName": "title",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "streamType",
            "columnName": "stream_type",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "duration",
            "columnName": "duration",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_streams_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "stream_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "accessDate",
            "columnName": "access_date",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "repeatCount",
            "columnName": "repeat_count",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "access_date"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_stream_history_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE  INDEX `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "stream_state",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "progressTime",
            "columnName": "progress_time",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE  INDEX `index_playlists_name` ON `${TABLE_NAME}` (`name`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "playlist_stream_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "playlistUid",
            "columnName": "playlist_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "index",
            "columnName": "join_index",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "playlist_id",
            "join_index"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_playlist_stream_join_playlist_id_join_index",
            "unique": true,
            "columnNames": [
              "playlist_id",
              "join_index"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)"
          },
          {
            "name": "index_playlist_stream_join_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE  INDEX `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "playlists",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "playlist_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "remote_playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "streamCount",
            "columnName": "stream_count",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_remote_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE  INDEX `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)"
          },
          {
            "name": "index_remote_playlists_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      }
    ],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"b7856223e2595ddf20a3ce6243ce9527\")"
    ]
  }
}

================================================
FILE: app/schemas/org.schabi.newpipe.database.AppDatabase/3.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 3,
    "identityHash": "9f825b1ee281480bedd38b971feac327",
    "entities": [
      {
        "tableName": "subscriptions",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "avatarUrl",
            "columnName": "avatar_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "subscriberCount",
            "columnName": "subscriber_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "description",
            "columnName": "description",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_subscriptions_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "search_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "creationDate",
            "columnName": "creation_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "search",
            "columnName": "search",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_search_history_search",
            "unique": false,
            "columnNames": [
              "search"
            ],
            "createSql": "CREATE  INDEX `index_search_history_search` ON `${TABLE_NAME}` (`search`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "streams",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "title",
            "columnName": "title",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "streamType",
            "columnName": "stream_type",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "duration",
            "columnName": "duration",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "viewCount",
            "columnName": "view_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "textualUploadDate",
            "columnName": "textual_upload_date",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploadDate",
            "columnName": "upload_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "isUploadDateApproximation",
            "columnName": "is_upload_date_approximation",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_streams_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "stream_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "accessDate",
            "columnName": "access_date",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "repeatCount",
            "columnName": "repeat_count",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "access_date"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_stream_history_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE  INDEX `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "stream_state",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "progressTime",
            "columnName": "progress_time",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE  INDEX `index_playlists_name` ON `${TABLE_NAME}` (`name`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "playlist_stream_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "playlistUid",
            "columnName": "playlist_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "index",
            "columnName": "join_index",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "playlist_id",
            "join_index"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_playlist_stream_join_playlist_id_join_index",
            "unique": true,
            "columnNames": [
              "playlist_id",
              "join_index"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)"
          },
          {
            "name": "index_playlist_stream_join_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE  INDEX `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "playlists",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "playlist_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "remote_playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "streamCount",
            "columnName": "stream_count",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_remote_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE  INDEX `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)"
          },
          {
            "name": "index_remote_playlists_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "feed",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "streamId",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_feed_subscription_id",
            "unique": false,
            "columnNames": [
              "subscription_id"
            ],
            "createSql": "CREATE  INDEX `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "feed_group",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "icon",
            "columnName": "icon_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "sortOrder",
            "columnName": "sort_order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_feed_group_sort_order",
            "unique": false,
            "columnNames": [
              "sort_order"
            ],
            "createSql": "CREATE  INDEX `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "feed_group_subscription_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "feedGroupId",
            "columnName": "group_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "group_id",
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_feed_group_subscription_join_subscription_id",
            "unique": false,
            "columnNames": [
              "subscription_id"
            ],
            "createSql": "CREATE  INDEX `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "feed_group",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "group_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "feed_last_updated",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "lastUpdated",
            "columnName": "last_updated",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9f825b1ee281480bedd38b971feac327')"
    ]
  }
}

================================================
FILE: app/schemas/org.schabi.newpipe.database.AppDatabase/4.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 4,
    "identityHash": "d8070091972a7011bce18aed62f80b90",
    "entities": [
      {
        "tableName": "subscriptions",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "avatarUrl",
            "columnName": "avatar_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "subscriberCount",
            "columnName": "subscriber_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "description",
            "columnName": "description",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_subscriptions_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "search_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "creationDate",
            "columnName": "creation_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "search",
            "columnName": "search",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_search_history_search",
            "unique": false,
            "columnNames": [
              "search"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "streams",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "title",
            "columnName": "title",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "streamType",
            "columnName": "stream_type",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "duration",
            "columnName": "duration",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "uploaderUrl",
            "columnName": "uploader_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "viewCount",
            "columnName": "view_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "textualUploadDate",
            "columnName": "textual_upload_date",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploadDate",
            "columnName": "upload_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "isUploadDateApproximation",
            "columnName": "is_upload_date_approximation",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_streams_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "stream_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "accessDate",
            "columnName": "access_date",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "repeatCount",
            "columnName": "repeat_count",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "access_date"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_stream_history_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "stream_state",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "progressMillis",
            "columnName": "progress_time",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "playlist_stream_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "playlistUid",
            "columnName": "playlist_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "index",
            "columnName": "join_index",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "playlist_id",
            "join_index"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_playlist_stream_join_playlist_id_join_index",
            "unique": true,
            "columnNames": [
              "playlist_id",
              "join_index"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)"
          },
          {
            "name": "index_playlist_stream_join_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "playlists",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "playlist_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "remote_playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "streamCount",
            "columnName": "stream_count",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_remote_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)"
          },
          {
            "name": "index_remote_playlists_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "feed",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "streamId",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_feed_subscription_id",
            "unique": false,
            "columnNames": [
              "subscription_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "feed_group",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "icon",
            "columnName": "icon_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "sortOrder",
            "columnName": "sort_order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_feed_group_sort_order",
            "unique": false,
            "columnNames": [
              "sort_order"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "feed_group_subscription_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "feedGroupId",
            "columnName": "group_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "group_id",
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_feed_group_subscription_join_subscription_id",
            "unique": false,
            "columnNames": [
              "subscription_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "feed_group",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "group_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "feed_last_updated",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "lastUpdated",
            "columnName": "last_updated",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd8070091972a7011bce18aed62f80b90')"
    ]
  }
}

================================================
FILE: app/schemas/org.schabi.newpipe.database.AppDatabase/5.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 5,
    "identityHash": "096731b513bb71dd44517639f4a2c1e3",
    "entities": [
      {
        "tableName": "subscriptions",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "avatarUrl",
            "columnName": "avatar_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "subscriberCount",
            "columnName": "subscriber_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "description",
            "columnName": "description",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "notificationMode",
            "columnName": "notification_mode",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_subscriptions_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "search_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)",
        "fields": [
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "creationDate",
            "columnName": "creation_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "search",
            "columnName": "search",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_search_history_search",
            "unique": false,
            "columnNames": [
              "search"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "streams",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "title",
            "columnName": "title",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "streamType",
            "columnName": "stream_type",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "duration",
            "columnName": "duration",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "uploaderUrl",
            "columnName": "uploader_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "viewCount",
            "columnName": "view_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "textualUploadDate",
            "columnName": "textual_upload_date",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploadDate",
            "columnName": "upload_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "isUploadDateApproximation",
            "columnName": "is_upload_date_approximation",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_streams_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "stream_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "accessDate",
            "columnName": "access_date",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "repeatCount",
            "columnName": "repeat_count",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "access_date"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_stream_history_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "stream_state",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "progressMillis",
            "columnName": "progress_time",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "playlist_stream_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "playlistUid",
            "columnName": "playlist_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "index",
            "columnName": "join_index",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "playlist_id",
            "join_index"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_playlist_stream_join_playlist_id_join_index",
            "unique": true,
            "columnNames": [
              "playlist_id",
              "join_index"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)"
          },
          {
            "name": "index_playlist_stream_join_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "playlists",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "playlist_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "remote_playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "streamCount",
            "columnName": "stream_count",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_remote_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)"
          },
          {
            "name": "index_remote_playlists_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "feed",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `subscription_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "streamId",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_feed_subscription_id",
            "unique": false,
            "columnNames": [
              "subscription_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "feed_group",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `icon_id` INTEGER NOT NULL, `sort_order` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "icon",
            "columnName": "icon_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "sortOrder",
            "columnName": "sort_order",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_feed_group_sort_order",
            "unique": false,
            "columnNames": [
              "sort_order"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "feed_group_subscription_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`group_id` INTEGER NOT NULL, `subscription_id` INTEGER NOT NULL, PRIMARY KEY(`group_id`, `subscription_id`), FOREIGN KEY(`group_id`) REFERENCES `feed_group`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "feedGroupId",
            "columnName": "group_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "group_id",
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_feed_group_subscription_join_subscription_id",
            "unique": false,
            "columnNames": [
              "subscription_id"
            ],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "feed_group",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "group_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "feed_last_updated",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`subscription_id` INTEGER NOT NULL, `last_updated` INTEGER, PRIMARY KEY(`subscription_id`), FOREIGN KEY(`subscription_id`) REFERENCES `subscriptions`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "subscriptionId",
            "columnName": "subscription_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "lastUpdated",
            "columnName": "last_updated",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "subscription_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "subscriptions",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "subscription_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      }
    ],
    "views": [],
    "setupQueries": [
      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '096731b513bb71dd44517639f4a2c1e3')"
    ]
  }
}

================================================
FILE: app/schemas/org.schabi.newpipe.database.AppDatabase/6.json
================================================
{
  "formatVersion": 1,
  "database": {
    "version": 6,
    "identityHash": "4084aa342aef315dc7b558770a7755a9",
    "entities": [
      {
        "tableName": "subscriptions",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `name` TEXT, `avatar_url` TEXT, `subscriber_count` INTEGER, `description` TEXT, `notification_mode` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "avatarUrl",
            "columnName": "avatar_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "subscriberCount",
            "columnName": "subscriber_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "description",
            "columnName": "description",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "notificationMode",
            "columnName": "notification_mode",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_subscriptions_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "orders": [],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "search_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)",
        "fields": [
          {
            "fieldPath": "creationDate",
            "columnName": "creation_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "search",
            "columnName": "search",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "id",
            "columnName": "id",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "id"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_search_history_search",
            "unique": false,
            "columnNames": [
              "search"
            ],
            "orders": [],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "streams",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `stream_type` TEXT NOT NULL, `duration` INTEGER NOT NULL, `uploader` TEXT NOT NULL, `uploader_url` TEXT, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "title",
            "columnName": "title",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "streamType",
            "columnName": "stream_type",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "duration",
            "columnName": "duration",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": true
          },
          {
            "fieldPath": "uploaderUrl",
            "columnName": "uploader_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "viewCount",
            "columnName": "view_count",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "textualUploadDate",
            "columnName": "textual_upload_date",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploadDate",
            "columnName": "upload_date",
            "affinity": "INTEGER",
            "notNull": false
          },
          {
            "fieldPath": "isUploadDateApproximation",
            "columnName": "is_upload_date_approximation",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_streams_service_id_url",
            "unique": true,
            "columnNames": [
              "service_id",
              "url"
            ],
            "orders": [],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "stream_history",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, `repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "accessDate",
            "columnName": "access_date",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "repeatCount",
            "columnName": "repeat_count",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id",
            "access_date"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_stream_history_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "orders": [],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "stream_state",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )",
        "fields": [
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "progressMillis",
            "columnName": "progress_time",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "stream_id"
          ],
          "autoGenerate": false
        },
        "indices": [],
        "foreignKeys": [
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "isThumbnailPermanent",
            "columnName": "is_thumbnail_permanent",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "orders": [],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)"
          }
        ],
        "foreignKeys": []
      },
      {
        "tableName": "playlist_stream_join",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, `join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)",
        "fields": [
          {
            "fieldPath": "playlistUid",
            "columnName": "playlist_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "streamUid",
            "columnName": "stream_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "index",
            "columnName": "join_index",
            "affinity": "INTEGER",
            "notNull": true
          }
        ],
        "primaryKey": {
          "columnNames": [
            "playlist_id",
            "join_index"
          ],
          "autoGenerate": false
        },
        "indices": [
          {
            "name": "index_playlist_stream_join_playlist_id_join_index",
            "unique": true,
            "columnNames": [
              "playlist_id",
              "join_index"
            ],
            "orders": [],
            "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)"
          },
          {
            "name": "index_playlist_stream_join_stream_id",
            "unique": false,
            "columnNames": [
              "stream_id"
            ],
            "orders": [],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)"
          }
        ],
        "foreignKeys": [
          {
            "table": "playlists",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "playlist_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          },
          {
            "table": "streams",
            "onDelete": "CASCADE",
            "onUpdate": "CASCADE",
            "columns": [
              "stream_id"
            ],
            "referencedColumns": [
              "uid"
            ]
          }
        ]
      },
      {
        "tableName": "remote_playlists",
        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, `thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)",
        "fields": [
          {
            "fieldPath": "uid",
            "columnName": "uid",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "serviceId",
            "columnName": "service_id",
            "affinity": "INTEGER",
            "notNull": true
          },
          {
            "fieldPath": "name",
            "columnName": "name",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "url",
            "columnName": "url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "thumbnailUrl",
            "columnName": "thumbnail_url",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "uploader",
            "columnName": "uploader",
            "affinity": "TEXT",
            "notNull": false
          },
          {
            "fieldPath": "streamCount",
            "columnName": "stream_count",
            "affinity": "INTEGER",
            "notNull": false
          }
        ],
        "primaryKey": {
          "columnNames": [
            "uid"
          ],
          "autoGenerate": true
        },
        "indices": [
          {
            "name": "index_remote_playlists_name",
            "unique": false,
            "columnNames": [
              "name"
            ],
            "orders": [],
            "createSql": "CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)"
          },
          {
            "name": "index_remote_playlists_service_id_url",
            "unique": true,
            "columnNames": [
        
Download .txt
gitextract_066mfw7c/

├── .editorconfig
├── .github/
│   ├── CONTRIBUTING.md
│   ├── DISCUSSION_TEMPLATE/
│   │   └── questions.yml
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── changed-lines-count-labeler.yml
│   └── workflows/
│       ├── backport-pr.yml
│       ├── build-release-apk.yml
│       ├── ci.yml
│       ├── image-minimizer.js
│       ├── image-minimizer.yml
│       ├── no-response.yml
│       └── pr-labeler.yml
├── .gitignore
├── LICENSE
├── README.md
├── app/
│   ├── build.gradle.kts
│   ├── lint.xml
│   ├── proguard-rules.pro
│   ├── sampledata/
│   │   └── channels.json
│   ├── schemas/
│   │   └── org.schabi.newpipe.database.AppDatabase/
│   │       ├── 2.json
│   │       ├── 3.json
│   │       ├── 4.json
│   │       ├── 5.json
│   │       ├── 6.json
│   │       ├── 7.json
│   │       ├── 8.json
│   │       └── 9.json
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── org/
│       │           └── schabi/
│       │               └── newpipe/
│       │                   ├── database/
│       │                   │   ├── DatabaseMigrationTest.kt
│       │                   │   └── FeedDAOTest.kt
│       │                   ├── error/
│       │                   │   └── ErrorInfoTest.java
│       │                   ├── local/
│       │                   │   ├── history/
│       │                   │   │   └── HistoryRecordManagerTest.kt
│       │                   │   ├── playlist/
│       │                   │   │   └── LocalPlaylistManagerTest.kt
│       │                   │   └── subscription/
│       │                   │       └── SubscriptionManagerTest.java
│       │                   ├── testUtil/
│       │                   │   ├── TestDatabase.kt
│       │                   │   └── TrampolineSchedulerRule.kt
│       │                   └── util/
│       │                       └── StreamItemAdapterTest.kt
│       ├── debug/
│       │   ├── AndroidManifest.xml
│       │   └── java/
│       │       └── org/
│       │           └── schabi/
│       │               └── newpipe/
│       │                   ├── DebugApp.kt
│       │                   └── settings/
│       │                       └── DebugSettingsBVDLeakCanary.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   ├── apache2.html
│       │   │   ├── epl1.html
│       │   │   ├── gpl_3.html
│       │   │   ├── mit.html
│       │   │   ├── mpl2.html
│       │   │   └── po_token.html
│       │   ├── java/
│       │   │   ├── androidx/
│       │   │   │   └── fragment/
│       │   │   │       └── app/
│       │   │   │           └── FragmentStatePagerAdapterMenuWorkaround.java
│       │   │   ├── com/
│       │   │   │   └── google/
│       │   │   │       └── android/
│       │   │   │           └── material/
│       │   │   │               └── appbar/
│       │   │   │                   └── FlingBehavior.java
│       │   │   ├── org/
│       │   │   │   ├── apache/
│       │   │   │   │   └── commons/
│       │   │   │   │       └── text/
│       │   │   │   │           └── similarity/
│       │   │   │   │               └── FuzzyScore.java
│       │   │   │   └── schabi/
│       │   │   │       └── newpipe/
│       │   │   │           ├── App.kt
│       │   │   │           ├── BaseFragment.java
│       │   │   │           ├── DownloaderImpl.java
│       │   │   │           ├── ExitActivity.kt
│       │   │   │           ├── MainActivity.java
│       │   │   │           ├── NewPipeDatabase.kt
│       │   │   │           ├── NewVersionWorker.kt
│       │   │   │           ├── PanicResponderActivity.java
│       │   │   │           ├── QueueItemMenuUtil.java
│       │   │   │           ├── RouterActivity.java
│       │   │   │           ├── about/
│       │   │   │           │   ├── AboutActivity.kt
│       │   │   │           │   ├── License.kt
│       │   │   │           │   ├── LicenseFragment.kt
│       │   │   │           │   ├── LicenseFragmentHelper.kt
│       │   │   │           │   ├── SoftwareComponent.kt
│       │   │   │           │   └── StandardLicenses.kt
│       │   │   │           ├── database/
│       │   │   │           │   ├── AppDatabase.kt
│       │   │   │           │   ├── BasicDAO.kt
│       │   │   │           │   ├── Converters.kt
│       │   │   │           │   ├── LocalItem.kt
│       │   │   │           │   ├── Migrations.kt
│       │   │   │           │   ├── feed/
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── FeedDAO.kt
│       │   │   │           │   │   │   └── FeedGroupDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── FeedEntity.kt
│       │   │   │           │   │       ├── FeedGroupEntity.kt
│       │   │   │           │   │       ├── FeedGroupSubscriptionEntity.kt
│       │   │   │           │   │       └── FeedLastUpdatedEntity.kt
│       │   │   │           │   ├── history/
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── SearchHistoryDAO.kt
│       │   │   │           │   │   │   └── StreamHistoryDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── SearchHistoryEntry.kt
│       │   │   │           │   │       ├── StreamHistoryEntity.kt
│       │   │   │           │   │       └── StreamHistoryEntry.kt
│       │   │   │           │   ├── playlist/
│       │   │   │           │   │   ├── PlaylistDuplicatesEntry.kt
│       │   │   │           │   │   ├── PlaylistLocalItem.kt
│       │   │   │           │   │   ├── PlaylistMetadataEntry.kt
│       │   │   │           │   │   ├── PlaylistStreamEntry.kt
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── PlaylistDAO.kt
│       │   │   │           │   │   │   ├── PlaylistRemoteDAO.kt
│       │   │   │           │   │   │   └── PlaylistStreamDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── PlaylistEntity.kt
│       │   │   │           │   │       ├── PlaylistRemoteEntity.kt
│       │   │   │           │   │       └── PlaylistStreamEntity.kt
│       │   │   │           │   ├── stream/
│       │   │   │           │   │   ├── StreamStatisticsEntry.kt
│       │   │   │           │   │   ├── StreamWithState.kt
│       │   │   │           │   │   ├── dao/
│       │   │   │           │   │   │   ├── StreamDAO.kt
│       │   │   │           │   │   │   └── StreamStateDAO.kt
│       │   │   │           │   │   └── model/
│       │   │   │           │   │       ├── StreamEntity.kt
│       │   │   │           │   │       └── StreamStateEntity.kt
│       │   │   │           │   └── subscription/
│       │   │   │           │       ├── NotificationMode.kt
│       │   │   │           │       ├── SubscriptionDAO.kt
│       │   │   │           │       └── SubscriptionEntity.kt
│       │   │   │           ├── download/
│       │   │   │           │   ├── DownloadActivity.java
│       │   │   │           │   ├── DownloadDialog.java
│       │   │   │           │   └── LoadingDialog.java
│       │   │   │           ├── error/
│       │   │   │           │   ├── AcraReportSender.java
│       │   │   │           │   ├── AcraReportSenderFactory.java
│       │   │   │           │   ├── ErrorActivity.kt
│       │   │   │           │   ├── ErrorInfo.kt
│       │   │   │           │   ├── ErrorPanelHelper.kt
│       │   │   │           │   ├── ErrorUtil.kt
│       │   │   │           │   ├── ReCaptchaActivity.java
│       │   │   │           │   └── UserAction.kt
│       │   │   │           ├── fragments/
│       │   │   │           │   ├── BackPressable.java
│       │   │   │           │   ├── BaseStateFragment.java
│       │   │   │           │   ├── BlankFragment.java
│       │   │   │           │   ├── EmptyFragment.java
│       │   │   │           │   ├── MainFragment.java
│       │   │   │           │   ├── OnScrollBelowItemsListener.java
│       │   │   │           │   ├── ViewContract.java
│       │   │   │           │   ├── detail/
│       │   │   │           │   │   ├── BaseDescriptionFragment.java
│       │   │   │           │   │   ├── DescriptionFragment.java
│       │   │   │           │   │   ├── StackItem.java
│       │   │   │           │   │   ├── TabAdapter.java
│       │   │   │           │   │   ├── VideoDetailFragment.java
│       │   │   │           │   │   └── VideoDetailPlayerCrasher.java
│       │   │   │           │   └── list/
│       │   │   │           │       ├── BaseListFragment.java
│       │   │   │           │       ├── BaseListInfoFragment.java
│       │   │   │           │       ├── ListViewContract.java
│       │   │   │           │       ├── channel/
│       │   │   │           │       │   ├── ChannelAboutFragment.java
│       │   │   │           │       │   ├── ChannelFragment.java
│       │   │   │           │       │   └── ChannelTabFragment.java
│       │   │   │           │       ├── comments/
│       │   │   │           │       │   ├── CommentRepliesFragment.java
│       │   │   │           │       │   ├── CommentRepliesInfo.java
│       │   │   │           │       │   └── CommentsFragment.java
│       │   │   │           │       ├── kiosk/
│       │   │   │           │       │   ├── DefaultKioskFragment.java
│       │   │   │           │       │   └── KioskFragment.java
│       │   │   │           │       ├── playlist/
│       │   │   │           │       │   ├── PlaylistControlViewHolder.java
│       │   │   │           │       │   └── PlaylistFragment.java
│       │   │   │           │       ├── search/
│       │   │   │           │       │   ├── SearchFragment.java
│       │   │   │           │       │   ├── SuggestionItem.kt
│       │   │   │           │       │   └── SuggestionListAdapter.kt
│       │   │   │           │       └── videos/
│       │   │   │           │           ├── RelatedItemsFragment.java
│       │   │   │           │           └── RelatedItemsInfo.java
│       │   │   │           ├── info_list/
│       │   │   │           │   ├── InfoItemBuilder.kt
│       │   │   │           │   ├── InfoListAdapter.java
│       │   │   │           │   ├── ItemViewMode.kt
│       │   │   │           │   ├── StreamSegmentAdapter.kt
│       │   │   │           │   ├── StreamSegmentItem.kt
│       │   │   │           │   ├── dialog/
│       │   │   │           │   │   ├── InfoItemDialog.java
│       │   │   │           │   │   ├── StreamDialogDefaultEntry.java
│       │   │   │           │   │   └── StreamDialogEntry.java
│       │   │   │           │   └── holder/
│       │   │   │           │       ├── ChannelCardInfoItemHolder.java
│       │   │   │           │       ├── ChannelGridInfoItemHolder.java
│       │   │   │           │       ├── ChannelInfoItemHolder.java
│       │   │   │           │       ├── ChannelMiniInfoItemHolder.java
│       │   │   │           │       ├── CommentInfoItemHolder.java
│       │   │   │           │       ├── InfoItemHolder.java
│       │   │   │           │       ├── PlaylistCardInfoItemHolder.java
│       │   │   │           │       ├── PlaylistGridInfoItemHolder.java
│       │   │   │           │       ├── PlaylistInfoItemHolder.java
│       │   │   │           │       ├── PlaylistMiniInfoItemHolder.java
│       │   │   │           │       ├── StreamCardInfoItemHolder.java
│       │   │   │           │       ├── StreamGridInfoItemHolder.java
│       │   │   │           │       ├── StreamInfoItemHolder.java
│       │   │   │           │       └── StreamMiniInfoItemHolder.java
│       │   │   │           ├── ktx/
│       │   │   │           │   ├── Bitmap.kt
│       │   │   │           │   ├── Bundle.kt
│       │   │   │           │   ├── SharedPreferences.kt
│       │   │   │           │   ├── TextView.kt
│       │   │   │           │   ├── Throwable.kt
│       │   │   │           │   └── View.kt
│       │   │   │           ├── local/
│       │   │   │           │   ├── BaseLocalListFragment.java
│       │   │   │           │   ├── HeaderFooterHolder.java
│       │   │   │           │   ├── LocalItemBuilder.java
│       │   │   │           │   ├── LocalItemListAdapter.java
│       │   │   │           │   ├── bookmark/
│       │   │   │           │   │   ├── BookmarkFragment.java
│       │   │   │           │   │   └── MergedPlaylistManager.java
│       │   │   │           │   ├── dialog/
│       │   │   │           │   │   ├── PlaylistAppendDialog.java
│       │   │   │           │   │   ├── PlaylistCreationDialog.java
│       │   │   │           │   │   └── PlaylistDialog.java
│       │   │   │           │   ├── feed/
│       │   │   │           │   │   ├── FeedDatabaseManager.kt
│       │   │   │           │   │   ├── FeedFragment.kt
│       │   │   │           │   │   ├── FeedState.kt
│       │   │   │           │   │   ├── FeedViewModel.kt
│       │   │   │           │   │   ├── item/
│       │   │   │           │   │   │   └── StreamItem.kt
│       │   │   │           │   │   ├── notifications/
│       │   │   │           │   │   │   ├── NotificationHelper.kt
│       │   │   │           │   │   │   ├── NotificationWorker.kt
│       │   │   │           │   │   │   └── ScheduleOptions.kt
│       │   │   │           │   │   └── service/
│       │   │   │           │   │       ├── FeedEventManager.kt
│       │   │   │           │   │       ├── FeedLoadManager.kt
│       │   │   │           │   │       ├── FeedLoadService.kt
│       │   │   │           │   │       ├── FeedLoadState.kt
│       │   │   │           │   │       ├── FeedResultsHolder.kt
│       │   │   │           │   │       └── FeedUpdateInfo.kt
│       │   │   │           │   ├── history/
│       │   │   │           │   │   ├── HistoryRecordManager.java
│       │   │   │           │   │   └── StatisticsPlaylistFragment.java
│       │   │   │           │   ├── holder/
│       │   │   │           │   │   ├── LocalBookmarkPlaylistItemHolder.java
│       │   │   │           │   │   ├── LocalItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistCardItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistGridItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistStreamCardItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistStreamGridItemHolder.java
│       │   │   │           │   │   ├── LocalPlaylistStreamItemHolder.java
│       │   │   │           │   │   ├── LocalStatisticStreamCardItemHolder.java
│       │   │   │           │   │   ├── LocalStatisticStreamGridItemHolder.java
│       │   │   │           │   │   ├── LocalStatisticStreamItemHolder.java
│       │   │   │           │   │   ├── PlaylistItemHolder.java
│       │   │   │           │   │   ├── RemoteBookmarkPlaylistItemHolder.java
│       │   │   │           │   │   ├── RemotePlaylistCardItemHolder.java
│       │   │   │           │   │   ├── RemotePlaylistGridItemHolder.java
│       │   │   │           │   │   └── RemotePlaylistItemHolder.java
│       │   │   │           │   ├── playlist/
│       │   │   │           │   │   ├── ExportPlaylist.kt
│       │   │   │           │   │   ├── LocalPlaylistFragment.java
│       │   │   │           │   │   ├── LocalPlaylistManager.java
│       │   │   │           │   │   ├── PlayListShareMode.kt
│       │   │   │           │   │   └── RemotePlaylistManager.kt
│       │   │   │           │   └── subscription/
│       │   │   │           │       ├── FeedGroupIcon.kt
│       │   │   │           │       ├── ImportConfirmationDialog.java
│       │   │   │           │       ├── SubscriptionFragment.kt
│       │   │   │           │       ├── SubscriptionManager.kt
│       │   │   │           │       ├── SubscriptionViewModel.kt
│       │   │   │           │       ├── SubscriptionsImportExportHelper.kt
│       │   │   │           │       ├── SubscriptionsImportFragment.java
│       │   │   │           │       ├── dialog/
│       │   │   │           │       │   ├── FeedGroupDialog.kt
│       │   │   │           │       │   ├── FeedGroupDialogViewModel.kt
│       │   │   │           │       │   ├── FeedGroupReorderDialog.kt
│       │   │   │           │       │   └── FeedGroupReorderDialogViewModel.kt
│       │   │   │           │       ├── item/
│       │   │   │           │       │   ├── ChannelItem.kt
│       │   │   │           │       │   ├── FeedGroupAddNewGridItem.kt
│       │   │   │           │       │   ├── FeedGroupAddNewItem.kt
│       │   │   │           │       │   ├── FeedGroupCardGridItem.kt
│       │   │   │           │       │   ├── FeedGroupCardItem.kt
│       │   │   │           │       │   ├── FeedGroupCarouselItem.kt
│       │   │   │           │       │   ├── FeedGroupReorderItem.kt
│       │   │   │           │       │   ├── GroupsHeader.kt
│       │   │   │           │       │   ├── Header.kt
│       │   │   │           │       │   ├── ImportSubscriptionsHintPlaceholderItem.kt
│       │   │   │           │       │   ├── PickerIconItem.kt
│       │   │   │           │       │   └── PickerSubscriptionItem.kt
│       │   │   │           │       └── workers/
│       │   │   │           │           ├── ImportExportJsonHelper.kt
│       │   │   │           │           ├── SubscriptionData.kt
│       │   │   │           │           ├── SubscriptionExportWorker.kt
│       │   │   │           │           └── SubscriptionImportWorker.kt
│       │   │   │           ├── player/
│       │   │   │           │   ├── AudioServiceLeakFix.java
│       │   │   │           │   ├── PlayQueueActivity.java
│       │   │   │           │   ├── Player.java
│       │   │   │           │   ├── PlayerIntentType.kt
│       │   │   │           │   ├── PlayerService.java
│       │   │   │           │   ├── PlayerType.kt
│       │   │   │           │   ├── datasource/
│       │   │   │           │   │   ├── NonUriHlsDataSourceFactory.java
│       │   │   │           │   │   └── YoutubeHttpDataSource.java
│       │   │   │           │   ├── event/
│       │   │   │           │   │   ├── OnKeyDownListener.java
│       │   │   │           │   │   ├── PlayerEventListener.java
│       │   │   │           │   │   ├── PlayerServiceEventListener.java
│       │   │   │           │   │   └── PlayerServiceExtendedEventListener.java
│       │   │   │           │   ├── gesture/
│       │   │   │           │   │   ├── BasePlayerGestureListener.kt
│       │   │   │           │   │   ├── CustomBottomSheetBehavior.java
│       │   │   │           │   │   ├── DisplayPortion.kt
│       │   │   │           │   │   ├── DoubleTapListener.kt
│       │   │   │           │   │   ├── MainPlayerGestureListener.kt
│       │   │   │           │   │   └── PopupPlayerGestureListener.kt
│       │   │   │           │   ├── helper/
│       │   │   │           │   │   ├── AudioReactor.java
│       │   │   │           │   │   ├── CacheFactory.java
│       │   │   │           │   │   ├── CustomMediaCodecVideoRenderer.java
│       │   │   │           │   │   ├── CustomRenderersFactory.java
│       │   │   │           │   │   ├── LoadController.java
│       │   │   │           │   │   ├── LockManager.java
│       │   │   │           │   │   ├── PlaybackParameterDialog.java
│       │   │   │           │   │   ├── PlayerDataSource.java
│       │   │   │           │   │   ├── PlayerHelper.java
│       │   │   │           │   │   ├── PlayerHolder.java
│       │   │   │           │   │   ├── PlayerSemitoneHelper.java
│       │   │   │           │   │   └── YoutubeDashLiveManifestParser.java
│       │   │   │           │   ├── mediabrowser/
│       │   │   │           │   │   ├── MediaBrowserCommon.kt
│       │   │   │           │   │   ├── MediaBrowserImpl.kt
│       │   │   │           │   │   ├── MediaBrowserPlaybackPreparer.kt
│       │   │   │           │   │   └── PackageValidator.kt
│       │   │   │           │   ├── mediaitem/
│       │   │   │           │   │   ├── ExceptionTag.java
│       │   │   │           │   │   ├── MediaItemTag.java
│       │   │   │           │   │   ├── PlaceholderTag.java
│       │   │   │           │   │   └── StreamInfoTag.java
│       │   │   │           │   ├── mediasession/
│       │   │   │           │   │   ├── MediaSessionPlayerUi.java
│       │   │   │           │   │   ├── PlayQueueNavigator.java
│       │   │   │           │   │   └── SessionConnectorActionProvider.java
│       │   │   │           │   ├── mediasource/
│       │   │   │           │   │   ├── FailedMediaSource.java
│       │   │   │           │   │   ├── LoadedMediaSource.java
│       │   │   │           │   │   ├── ManagedMediaSource.java
│       │   │   │           │   │   ├── ManagedMediaSourcePlaylist.java
│       │   │   │           │   │   └── PlaceholderMediaSource.java
│       │   │   │           │   ├── notification/
│       │   │   │           │   │   ├── NotificationActionData.java
│       │   │   │           │   │   ├── NotificationConstants.java
│       │   │   │           │   │   ├── NotificationPlayerUi.java
│       │   │   │           │   │   └── NotificationUtil.java
│       │   │   │           │   ├── playback/
│       │   │   │           │   │   ├── MediaSourceManager.java
│       │   │   │           │   │   ├── PlaybackListener.java
│       │   │   │           │   │   └── SurfaceHolderCallback.java
│       │   │   │           │   ├── playqueue/
│       │   │   │           │   │   ├── AbstractInfoPlayQueue.java
│       │   │   │           │   │   ├── ChannelTabPlayQueue.java
│       │   │   │           │   │   ├── PlayQueue.java
│       │   │   │           │   │   ├── PlayQueueAdapter.java
│       │   │   │           │   │   ├── PlayQueueEvent.kt
│       │   │   │           │   │   ├── PlayQueueItem.java
│       │   │   │           │   │   ├── PlayQueueItemBuilder.java
│       │   │   │           │   │   ├── PlayQueueItemHolder.java
│       │   │   │           │   │   ├── PlayQueueItemTouchCallback.java
│       │   │   │           │   │   ├── PlaylistPlayQueue.java
│       │   │   │           │   │   └── SinglePlayQueue.java
│       │   │   │           │   ├── resolver/
│       │   │   │           │   │   ├── AudioPlaybackResolver.java
│       │   │   │           │   │   ├── PlaybackResolver.java
│       │   │   │           │   │   ├── Resolver.java
│       │   │   │           │   │   └── VideoPlaybackResolver.java
│       │   │   │           │   ├── seekbarpreview/
│       │   │   │           │   │   ├── SeekbarPreviewThumbnailHelper.java
│       │   │   │           │   │   └── SeekbarPreviewThumbnailHolder.java
│       │   │   │           │   └── ui/
│       │   │   │           │       ├── BackgroundPlayerUi.java
│       │   │   │           │       ├── MainPlayerUi.java
│       │   │   │           │       ├── PlayerUi.java
│       │   │   │           │       ├── PlayerUiList.java
│       │   │   │           │       ├── PopupPlayerUi.java
│       │   │   │           │       └── VideoPlayerUi.java
│       │   │   │           ├── settings/
│       │   │   │           │   ├── AppearanceSettingsFragment.java
│       │   │   │           │   ├── BackupRestoreSettingsFragment.java
│       │   │   │           │   ├── BasePreferenceFragment.java
│       │   │   │           │   ├── ContentSettingsFragment.java
│       │   │   │           │   ├── DebugSettingsFragment.java
│       │   │   │           │   ├── DownloadSettingsFragment.java
│       │   │   │           │   ├── ExoPlayerSettingsFragment.java
│       │   │   │           │   ├── HistorySettingsFragment.java
│       │   │   │           │   ├── MainSettingsFragment.java
│       │   │   │           │   ├── NewPipeSettings.java
│       │   │   │           │   ├── NotificationSettingsFragment.kt
│       │   │   │           │   ├── NotificationsSettingsFragment.kt
│       │   │   │           │   ├── PeertubeInstanceListFragment.java
│       │   │   │           │   ├── PlayerNotificationSettingsFragment.kt
│       │   │   │           │   ├── SelectChannelFragment.java
│       │   │   │           │   ├── SelectFeedGroupFragment.java
│       │   │   │           │   ├── SelectKioskFragment.java
│       │   │   │           │   ├── SelectPlaylistFragment.java
│       │   │   │           │   ├── SettingsActivity.java
│       │   │   │           │   ├── SettingsResourceRegistry.java
│       │   │   │           │   ├── UpdateSettingsFragment.java
│       │   │   │           │   ├── VideoAudioSettingsFragment.java
│       │   │   │           │   ├── custom/
│       │   │   │           │   │   ├── DurationListPreference.kt
│       │   │   │           │   │   ├── NotificationActionsPreference.java
│       │   │   │           │   │   └── NotificationSlot.java
│       │   │   │           │   ├── export/
│       │   │   │           │   │   ├── BackupFileLocator.kt
│       │   │   │           │   │   ├── ImportExportManager.kt
│       │   │   │           │   │   └── PreferencesObjectInputStream.kt
│       │   │   │           │   ├── migration/
│       │   │   │           │   │   ├── MigrationManager.java
│       │   │   │           │   │   └── SettingMigrations.java
│       │   │   │           │   ├── notifications/
│       │   │   │           │   │   ├── NotificationModeConfigAdapter.kt
│       │   │   │           │   │   └── NotificationModeConfigFragment.kt
│       │   │   │           │   ├── preferencesearch/
│       │   │   │           │   │   ├── PreferenceFuzzySearchFunction.java
│       │   │   │           │   │   ├── PreferenceParser.java
│       │   │   │           │   │   ├── PreferenceSearchAdapter.java
│       │   │   │           │   │   ├── PreferenceSearchConfiguration.java
│       │   │   │           │   │   ├── PreferenceSearchFragment.java
│       │   │   │           │   │   ├── PreferenceSearchItem.kt
│       │   │   │           │   │   ├── PreferenceSearchResultHighlighter.java
│       │   │   │           │   │   ├── PreferenceSearchResultListener.kt
│       │   │   │           │   │   ├── PreferenceSearcher.java
│       │   │   │           │   │   └── package-info.java
│       │   │   │           │   └── tabs/
│       │   │   │           │       ├── AddTabDialog.java
│       │   │   │           │       ├── ChooseTabsFragment.java
│       │   │   │           │       ├── Tab.java
│       │   │   │           │       ├── TabsJsonHelper.java
│       │   │   │           │       └── TabsManager.java
│       │   │   │           ├── streams/
│       │   │   │           │   ├── DataReader.java
│       │   │   │           │   ├── Mp4DashReader.java
│       │   │   │           │   ├── Mp4FromDashWriter.java
│       │   │   │           │   ├── OggFromWebMWriter.java
│       │   │   │           │   ├── SrtFromTtmlWriter.java
│       │   │   │           │   ├── WebMReader.java
│       │   │   │           │   ├── WebMWriter.java
│       │   │   │           │   └── io/
│       │   │   │           │       ├── NoFileManagerSafeGuard.java
│       │   │   │           │       ├── SharpInputStream.java
│       │   │   │           │       ├── SharpOutputStream.java
│       │   │   │           │       ├── SharpStream.java
│       │   │   │           │       ├── StoredDirectoryHelper.java
│       │   │   │           │       └── StoredFileHelper.java
│       │   │   │           ├── util/
│       │   │   │           │   ├── AudioTrackAdapter.java
│       │   │   │           │   ├── BridgeStateSaverInitializer.java
│       │   │   │           │   ├── ChannelTabHelper.java
│       │   │   │           │   ├── Constants.kt
│       │   │   │           │   ├── DependentPreferenceHelper.kt
│       │   │   │           │   ├── DeviceUtils.java
│       │   │   │           │   ├── ExtractorHelper.java
│       │   │   │           │   ├── FallbackViewHolder.java
│       │   │   │           │   ├── FilePickerActivityHelper.java
│       │   │   │           │   ├── FilenameUtils.kt
│       │   │   │           │   ├── InfoCache.java
│       │   │   │           │   ├── KeyboardUtil.java
│       │   │   │           │   ├── KioskTranslator.kt
│       │   │   │           │   ├── ListHelper.java
│       │   │   │           │   ├── Localization.java
│       │   │   │           │   ├── NavigationHelper.java
│       │   │   │           │   ├── NewPipeTextViewHelper.kt
│       │   │   │           │   ├── OnClickGesture.java
│       │   │   │           │   ├── PeertubeHelper.kt
│       │   │   │           │   ├── PermissionHelper.java
│       │   │   │           │   ├── PlayButtonHelper.kt
│       │   │   │           │   ├── ReleaseVersionUtil.kt
│       │   │   │           │   ├── SavedState.kt
│       │   │   │           │   ├── SecondaryStreamHelper.java
│       │   │   │           │   ├── SerializedCache.java
│       │   │   │           │   ├── ServiceHelper.kt
│       │   │   │           │   ├── SimpleOnSeekBarChangeListener.kt
│       │   │   │           │   ├── SliderStrategy.java
│       │   │   │           │   ├── SparseItemUtil.java
│       │   │   │           │   ├── StateSaver.java
│       │   │   │           │   ├── StreamItemAdapter.java
│       │   │   │           │   ├── StreamTypeUtil.kt
│       │   │   │           │   ├── ThemeHelper.java
│       │   │   │           │   ├── ZipHelper.java
│       │   │   │           │   ├── debounce/
│       │   │   │           │   │   ├── DebounceSavable.java
│       │   │   │           │   │   └── DebounceSaver.java
│       │   │   │           │   ├── external_communication/
│       │   │   │           │   │   ├── KoreUtils.java
│       │   │   │           │   │   └── ShareUtils.java
│       │   │   │           │   ├── image/
│       │   │   │           │   │   ├── CoilHelper.kt
│       │   │   │           │   │   ├── ImageStrategy.kt
│       │   │   │           │   │   └── PreferredImageQuality.kt
│       │   │   │           │   ├── potoken/
│       │   │   │           │   │   ├── JavaScriptUtil.kt
│       │   │   │           │   │   ├── PoTokenException.kt
│       │   │   │           │   │   ├── PoTokenGenerator.kt
│       │   │   │           │   │   ├── PoTokenProviderImpl.kt
│       │   │   │           │   │   └── PoTokenWebView.kt
│       │   │   │           │   ├── text/
│       │   │   │           │   │   ├── HashtagLongPressClickableSpan.java
│       │   │   │           │   │   ├── InternalUrlsHandler.java
│       │   │   │           │   │   ├── LongPressClickableSpan.java
│       │   │   │           │   │   ├── LongPressLinkMovementMethod.java
│       │   │   │           │   │   ├── TextEllipsizer.java
│       │   │   │           │   │   ├── TextLinkifier.java
│       │   │   │           │   │   ├── TextViewExtensions.kt
│       │   │   │           │   │   ├── TimestampExtractor.java
│       │   │   │           │   │   ├── TimestampLongPressClickableSpan.kt
│       │   │   │           │   │   ├── TouchUtils.java
│       │   │   │           │   │   └── UrlLongPressClickableSpan.java
│       │   │   │           │   └── urlfinder/
│       │   │   │           │       ├── PatternsCompat.java
│       │   │   │           │       └── UrlFinder.kt
│       │   │   │           └── views/
│       │   │   │               ├── AnimatedProgressBar.java
│       │   │   │               ├── CustomCollapsingToolbarLayout.java
│       │   │   │               ├── ExpandableSurfaceView.java
│       │   │   │               ├── FocusAwareCoordinator.java
│       │   │   │               ├── FocusAwareDrawerLayout.java
│       │   │   │               ├── FocusAwareSeekBar.java
│       │   │   │               ├── FocusOverlayView.java
│       │   │   │               ├── NewPipeEditText.java
│       │   │   │               ├── NewPipeRecyclerView.java
│       │   │   │               ├── NewPipeTextView.java
│       │   │   │               ├── ScrollableTabLayout.java
│       │   │   │               ├── SimpleWindowCallback.kt
│       │   │   │               ├── SuperScrollLayoutManager.java
│       │   │   │               └── player/
│       │   │   │                   ├── CircleClipTapView.kt
│       │   │   │                   ├── PlayerFastSeekOverlay.kt
│       │   │   │                   └── SecondsView.kt
│       │   │   └── us/
│       │   │       └── shandian/
│       │   │           └── giga/
│       │   │               ├── get/
│       │   │               │   ├── DownloadInitializer.java
│       │   │               │   ├── DownloadMission.java
│       │   │               │   ├── DownloadMissionRecover.java
│       │   │               │   ├── DownloadRunnable.java
│       │   │               │   ├── DownloadRunnableFallback.java
│       │   │               │   ├── FinishedMission.java
│       │   │               │   ├── Mission.java
│       │   │               │   ├── MissionRecoveryInfo.kt
│       │   │               │   └── sqlite/
│       │   │               │       └── FinishedMissionStore.java
│       │   │               ├── io/
│       │   │               │   ├── ChunkFileInputStream.java
│       │   │               │   ├── CircularFileWriter.java
│       │   │               │   ├── FileStream.java
│       │   │               │   ├── FileStreamSAF.java
│       │   │               │   └── ProgressReport.java
│       │   │               ├── postprocessing/
│       │   │               │   ├── M4aNoDash.java
│       │   │               │   ├── Mp4FromDashMuxer.java
│       │   │               │   ├── OggFromWebmDemuxer.java
│       │   │               │   ├── Postprocessing.java
│       │   │               │   ├── TtmlConverter.java
│       │   │               │   └── WebMMuxer.java
│       │   │               ├── service/
│       │   │               │   ├── DownloadManager.java
│       │   │               │   ├── DownloadManagerService.java
│       │   │               │   └── MissionState.java
│       │   │               ├── ui/
│       │   │               │   ├── adapter/
│       │   │               │   │   └── MissionAdapter.java
│       │   │               │   ├── common/
│       │   │               │   │   ├── Deleter.java
│       │   │               │   │   ├── ProgressDrawable.java
│       │   │               │   │   └── ToolbarActivity.java
│       │   │               │   └── fragment/
│       │   │               │       └── MissionsFragment.java
│       │   │               └── util/
│       │   │                   └── Utility.java
│       │   └── res/
│       │       ├── animator/
│       │       │   ├── custom_fade_in.xml
│       │       │   └── custom_fade_out.xml
│       │       ├── drawable/
│       │       │   ├── background_oval_black_transparent.xml
│       │       │   ├── dashed_border_black.xml
│       │       │   ├── dashed_border_dark.xml
│       │       │   ├── dashed_border_light.xml
│       │       │   ├── drawer_header_bottom_background.xml
│       │       │   ├── ic_add.xml
│       │       │   ├── ic_add_circle_outline.xml
│       │       │   ├── ic_apps.xml
│       │       │   ├── ic_arrow_back.xml
│       │       │   ├── ic_arrow_drop_down.xml
│       │       │   ├── ic_arrow_drop_up.xml
│       │       │   ├── ic_art_track.xml
│       │       │   ├── ic_asterisk.xml
│       │       │   ├── ic_attach_money.xml
│       │       │   ├── ic_backup.xml
│       │       │   ├── ic_bookmark.xml
│       │       │   ├── ic_bookmark_white.xml
│       │       │   ├── ic_brightness_high.xml
│       │       │   ├── ic_brightness_low.xml
│       │       │   ├── ic_brightness_medium.xml
│       │       │   ├── ic_bug_report.xml
│       │       │   ├── ic_campaign.xml
│       │       │   ├── ic_cast.xml
│       │       │   ├── ic_checklist.xml
│       │       │   ├── ic_child_care.xml
│       │       │   ├── ic_circle.xml
│       │       │   ├── ic_close.xml
│       │       │   ├── ic_cloud.xml
│       │       │   ├── ic_cloud_download.xml
│       │       │   ├── ic_comment.xml
│       │       │   ├── ic_computer.xml
│       │       │   ├── ic_crop_portrait.xml
│       │       │   ├── ic_delete.xml
│       │       │   ├── ic_description.xml
│       │       │   ├── ic_directions_bike.xml
│       │       │   ├── ic_directions_car.xml
│       │       │   ├── ic_done.xml
│       │       │   ├── ic_drag_handle.xml
│       │       │   ├── ic_expand_more.xml
│       │       │   ├── ic_explore.xml
│       │       │   ├── ic_fastfood.xml
│       │       │   ├── ic_favorite.xml
│       │       │   ├── ic_file_download.xml
│       │       │   ├── ic_filter_list.xml
│       │       │   ├── ic_fitness_center.xml
│       │       │   ├── ic_fullscreen.xml
│       │       │   ├── ic_fullscreen_exit.xml
│       │       │   ├── ic_headset.xml
│       │       │   ├── ic_headset_shadow.xml
│       │       │   ├── ic_heart.xml
│       │       │   ├── ic_help.xml
│       │       │   ├── ic_history.xml
│       │       │   ├── ic_history_white.xml
│       │       │   ├── ic_home.xml
│       │       │   ├── ic_hourglass_top.xml
│       │       │   ├── ic_info_outline.xml
│       │       │   ├── ic_insert_emoticon.xml
│       │       │   ├── ic_language.xml
│       │       │   ├── ic_list.xml
│       │       │   ├── ic_live_tv.xml
│       │       │   ├── ic_menu_book.xml
│       │       │   ├── ic_mic.xml
│       │       │   ├── ic_more_vert.xml
│       │       │   ├── ic_motorcycle.xml
│       │       │   ├── ic_movie.xml
│       │       │   ├── ic_music_note.xml
│       │       │   ├── ic_next.xml
│       │       │   ├── ic_notifications.xml
│       │       │   ├── ic_palette.xml
│       │       │   ├── ic_pause.xml
│       │       │   ├── ic_people.xml
│       │       │   ├── ic_person.xml
│       │       │   ├── ic_pets.xml
│       │       │   ├── ic_picture_in_picture.xml
│       │       │   ├── ic_pin.xml
│       │       │   ├── ic_placeholder_bandcamp.xml
│       │       │   ├── ic_placeholder_media_ccc.xml
│       │       │   ├── ic_placeholder_peertube.xml
│       │       │   ├── ic_play_arrow.xml
│       │       │   ├── ic_play_arrow_shadow.xml
│       │       │   ├── ic_play_seek_triangle.xml
│       │       │   ├── ic_playlist_add.xml
│       │       │   ├── ic_playlist_add_check.xml
│       │       │   ├── ic_playlist_play.xml
│       │       │   ├── ic_podcasts.xml
│       │       │   ├── ic_previous.xml
│       │       │   ├── ic_public.xml
│       │       │   ├── ic_radio.xml
│       │       │   ├── ic_refresh.xml
│       │       │   ├── ic_repeat.xml
│       │       │   ├── ic_replay.xml
│       │       │   ├── ic_restaurant.xml
│       │       │   ├── ic_rss_feed.xml
│       │       │   ├── ic_save.xml
│       │       │   ├── ic_school.xml
│       │       │   ├── ic_search.xml
│       │       │   ├── ic_search_add.xml
│       │       │   ├── ic_select_all.xml
│       │       │   ├── ic_settings.xml
│       │       │   ├── ic_settings_backup_restore.xml
│       │       │   ├── ic_share.xml
│       │       │   ├── ic_shopping_cart.xml
│       │       │   ├── ic_shuffle.xml
│       │       │   ├── ic_smart_display.xml
│       │       │   ├── ic_sort.xml
│       │       │   ├── ic_stars.xml
│       │       │   ├── ic_subscriptions.xml
│       │       │   ├── ic_subtitles.xml
│       │       │   ├── ic_telescope.xml
│       │       │   ├── ic_thumb_down.xml
│       │       │   ├── ic_thumb_up.xml
│       │       │   ├── ic_trending_up.xml
│       │       │   ├── ic_tv.xml
│       │       │   ├── ic_videogame_asset.xml
│       │       │   ├── ic_visibility_on.xml
│       │       │   ├── ic_volume_down.xml
│       │       │   ├── ic_volume_mute.xml
│       │       │   ├── ic_volume_off.xml
│       │       │   ├── ic_volume_up.xml
│       │       │   ├── ic_watch_later.xml
│       │       │   ├── ic_wb_sunny.xml
│       │       │   ├── ic_whatshot.xml
│       │       │   ├── ic_work.xml
│       │       │   ├── not_available_monkey.xml
│       │       │   ├── placeholder_person.xml
│       │       │   ├── placeholder_thumbnail_playlist.xml
│       │       │   ├── placeholder_thumbnail_video.xml
│       │       │   ├── player_controls_background.xml
│       │       │   ├── player_controls_top_background.xml
│       │       │   ├── progress_circular_white.xml
│       │       │   ├── progress_soundcloud_horizontal_dark.xml
│       │       │   ├── progress_soundcloud_horizontal_light.xml
│       │       │   ├── progress_youtube_horizontal_dark.xml
│       │       │   ├── progress_youtube_horizontal_light.xml
│       │       │   ├── selector_checked_dark.xml
│       │       │   ├── selector_checked_light.xml
│       │       │   ├── selector_dark.xml
│       │       │   ├── selector_focused_dark.xml
│       │       │   ├── selector_focused_light.xml
│       │       │   ├── selector_light.xml
│       │       │   ├── splash_background.xml
│       │       │   ├── splash_foreground.xml
│       │       │   ├── toolbar_shadow_dark.xml
│       │       │   └── toolbar_shadow_light.xml
│       │       ├── drawable-mdpi/
│       │       │   └── volunteer_activism_ic.xml
│       │       ├── drawable-night/
│       │       │   ├── ic_heart.xml
│       │       │   └── splash_background.xml
│       │       ├── drawable-night-v23/
│       │       │   └── splash_background.xml
│       │       ├── drawable-v23/
│       │       │   └── splash_background.xml
│       │       ├── layout/
│       │       │   ├── activity_about.xml
│       │       │   ├── activity_downloader.xml
│       │       │   ├── activity_error.xml
│       │       │   ├── activity_main.xml
│       │       │   ├── activity_player_queue_control.xml
│       │       │   ├── activity_recaptcha.xml
│       │       │   ├── chip.xml
│       │       │   ├── comment_replies_header.xml
│       │       │   ├── dialog_edit_text.xml
│       │       │   ├── dialog_feed_group_create.xml
│       │       │   ├── dialog_feed_group_reorder.xml
│       │       │   ├── dialog_playback_parameter.xml
│       │       │   ├── dialog_playlists.xml
│       │       │   ├── dialog_title.xml
│       │       │   ├── download_dialog.xml
│       │       │   ├── download_loading_dialog.xml
│       │       │   ├── drawer_header.xml
│       │       │   ├── drawer_layout.xml
│       │       │   ├── error_panel.xml
│       │       │   ├── feed_group_add_new_grid_item.xml
│       │       │   ├── feed_group_add_new_item.xml
│       │       │   ├── feed_group_card_grid_item.xml
│       │       │   ├── feed_group_card_item.xml
│       │       │   ├── feed_group_reorder_item.xml
│       │       │   ├── feed_item_carousel.xml
│       │       │   ├── fragment_about.xml
│       │       │   ├── fragment_blank.xml
│       │       │   ├── fragment_bookmarks.xml
│       │       │   ├── fragment_channel.xml
│       │       │   ├── fragment_channel_tab.xml
│       │       │   ├── fragment_channel_videos.xml
│       │       │   ├── fragment_channels_notifications.xml
│       │       │   ├── fragment_choose_tabs.xml
│       │       │   ├── fragment_comments.xml
│       │       │   ├── fragment_description.xml
│       │       │   ├── fragment_empty.xml
│       │       │   ├── fragment_feed.xml
│       │       │   ├── fragment_import.xml
│       │       │   ├── fragment_instance_list.xml
│       │       │   ├── fragment_kiosk.xml
│       │       │   ├── fragment_licenses.xml
│       │       │   ├── fragment_main.xml
│       │       │   ├── fragment_playlist.xml
│       │       │   ├── fragment_related_items.xml
│       │       │   ├── fragment_search.xml
│       │       │   ├── fragment_subscription.xml
│       │       │   ├── fragment_video_detail.xml
│       │       │   ├── instance_spinner_item.xml
│       │       │   ├── instance_spinner_layout.xml
│       │       │   ├── item_instance.xml
│       │       │   ├── item_metadata.xml
│       │       │   ├── item_metadata_tags.xml
│       │       │   ├── item_notification_config.xml
│       │       │   ├── item_search_suggestion.xml
│       │       │   ├── item_software_component.xml
│       │       │   ├── item_stream_segment.xml
│       │       │   ├── list_channel_card_item.xml
│       │       │   ├── list_channel_grid_item.xml
│       │       │   ├── list_channel_item.xml
│       │       │   ├── list_channel_mini_item.xml
│       │       │   ├── list_choose_tabs.xml
│       │       │   ├── list_choose_tabs_dialog.xml
│       │       │   ├── list_comment_item.xml
│       │       │   ├── list_empty_view.xml
│       │       │   ├── list_empty_view_subscriptions.xml
│       │       │   ├── list_playlist_bookmark_item.xml
│       │       │   ├── list_playlist_card_item.xml
│       │       │   ├── list_playlist_grid_item.xml
│       │       │   ├── list_playlist_item.xml
│       │       │   ├── list_playlist_mini_item.xml
│       │       │   ├── list_radio_icon_item.xml
│       │       │   ├── list_stream_card_item.xml
│       │       │   ├── list_stream_grid_item.xml
│       │       │   ├── list_stream_item.xml
│       │       │   ├── list_stream_mini_item.xml
│       │       │   ├── list_stream_playlist_card_item.xml
│       │       │   ├── list_stream_playlist_grid_item.xml
│       │       │   ├── list_stream_playlist_item.xml
│       │       │   ├── local_playlist_header.xml
│       │       │   ├── main_bg.xml
│       │       │   ├── mission_item.xml
│       │       │   ├── mission_item_linear.xml
│       │       │   ├── missions.xml
│       │       │   ├── missions_header.xml
│       │       │   ├── picker_icon_item.xml
│       │       │   ├── picker_subscription_item.xml
│       │       │   ├── pignate_footer.xml
│       │       │   ├── play_queue_item.xml
│       │       │   ├── player.xml
│       │       │   ├── player_fast_seek_overlay.xml
│       │       │   ├── player_fast_seek_seconds_view.xml
│       │       │   ├── player_popup_close_overlay.xml
│       │       │   ├── playlist_control.xml
│       │       │   ├── playlist_header.xml
│       │       │   ├── related_items_header.xml
│       │       │   ├── select_channel_fragment.xml
│       │       │   ├── select_channel_item.xml
│       │       │   ├── select_feed_group_fragment.xml
│       │       │   ├── select_feed_group_item.xml
│       │       │   ├── select_kiosk_fragment.xml
│       │       │   ├── select_kiosk_item.xml
│       │       │   ├── select_playlist_fragment.xml
│       │       │   ├── settings_category_header_layout.xml
│       │       │   ├── settings_category_header_title.xml
│       │       │   ├── settings_layout.xml
│       │       │   ├── settings_notification.xml
│       │       │   ├── settings_notification_action.xml
│       │       │   ├── settings_preferencesearch_fragment.xml
│       │       │   ├── settings_preferencesearch_list_item_result.xml
│       │       │   ├── single_choice_dialog_view.xml
│       │       │   ├── statistic_playlist_control.xml
│       │       │   ├── stream_quality_item.xml
│       │       │   ├── subscription_groups_header.xml
│       │       │   ├── subscription_header.xml
│       │       │   ├── toolbar_layout.xml
│       │       │   └── toolbar_search_layout.xml
│       │       ├── layout-land/
│       │       │   ├── activity_player_queue_control.xml
│       │       │   └── list_stream_card_item.xml
│       │       ├── layout-large-land/
│       │       │   └── fragment_video_detail.xml
│       │       ├── menu/
│       │       │   ├── dialog_url.xml
│       │       │   ├── download_menu.xml
│       │       │   ├── drawer_items.xml
│       │       │   ├── error_menu.xml
│       │       │   ├── menu_channel.xml
│       │       │   ├── menu_chooser_fragment.xml
│       │       │   ├── menu_feed_fragment.xml
│       │       │   ├── menu_feed_group_dialog.xml
│       │       │   ├── menu_history.xml
│       │       │   ├── menu_local_playlist.xml
│       │       │   ├── menu_main_fragment.xml
│       │       │   ├── menu_notifications_channels.xml
│       │       │   ├── menu_play_queue.xml
│       │       │   ├── menu_play_queue_bg.xml
│       │       │   ├── menu_play_queue_item.xml
│       │       │   ├── menu_playlist.xml
│       │       │   ├── menu_recaptcha.xml
│       │       │   ├── menu_settings_main_fragment.xml
│       │       │   └── mission.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   └── ic_launcher.xml
│       │       ├── resources.properties
│       │       ├── values/
│       │       │   ├── attrs.xml
│       │       │   ├── bools.xml
│       │       │   ├── colors.xml
│       │       │   ├── colors_services.xml
│       │       │   ├── dimens.xml
│       │       │   ├── donottranslate.xml
│       │       │   ├── settings_keys.xml
│       │       │   ├── strings.xml
│       │       │   ├── styles.xml
│       │       │   ├── styles_misc.xml
│       │       │   └── styles_services.xml
│       │       ├── values-ace/
│       │       │   └── strings.xml
│       │       ├── values-aeb/
│       │       │   └── strings.xml
│       │       ├── values-af/
│       │       │   └── strings.xml
│       │       ├── values-ang/
│       │       │   └── strings.xml
│       │       ├── values-ar/
│       │       │   └── strings.xml
│       │       ├── values-ar-rLY/
│       │       │   └── strings.xml
│       │       ├── values-ars/
│       │       │   └── strings.xml
│       │       ├── values-as/
│       │       │   └── strings.xml
│       │       ├── values-ay/
│       │       │   └── strings.xml
│       │       ├── values-ayc/
│       │       │   └── strings.xml
│       │       ├── values-az/
│       │       │   └── strings.xml
│       │       ├── values-azb/
│       │       │   └── strings.xml
│       │       ├── values-b+ast/
│       │       │   └── strings.xml
│       │       ├── values-b+uz+Latn/
│       │       │   └── strings.xml
│       │       ├── values-bar/
│       │       │   └── strings.xml
│       │       ├── values-be/
│       │       │   └── strings.xml
│       │       ├── values-ber/
│       │       │   └── strings.xml
│       │       ├── values-bg/
│       │       │   └── strings.xml
│       │       ├── values-bm/
│       │       │   └── strings.xml
│       │       ├── values-bn/
│       │       │   └── strings.xml
│       │       ├── values-bn-rBD/
│       │       │   └── strings.xml
│       │       ├── values-bn-rIN/
│       │       │   └── strings.xml
│       │       ├── values-bqi/
│       │       │   └── strings.xml
│       │       ├── values-br/
│       │       │   └── strings.xml
│       │       ├── values-bs/
│       │       │   └── strings.xml
│       │       ├── values-ca/
│       │       │   └── strings.xml
│       │       ├── values-ckb/
│       │       │   └── strings.xml
│       │       ├── values-cs/
│       │       │   └── strings.xml
│       │       ├── values-cy/
│       │       │   └── strings.xml
│       │       ├── values-da/
│       │       │   └── strings.xml
│       │       ├── values-de/
│       │       │   └── strings.xml
│       │       ├── values-dum/
│       │       │   └── strings.xml
│       │       ├── values-el/
│       │       │   └── strings.xml
│       │       ├── values-en-rGB/
│       │       │   └── strings.xml
│       │       ├── values-enm/
│       │       │   └── strings.xml
│       │       ├── values-eo/
│       │       │   └── strings.xml
│       │       ├── values-es/
│       │       │   └── strings.xml
│       │       ├── values-et/
│       │       │   └── strings.xml
│       │       ├── values-eu/
│       │       │   └── strings.xml
│       │       ├── values-fa/
│       │       │   └── strings.xml
│       │       ├── values-fi/
│       │       │   └── strings.xml
│       │       ├── values-fil/
│       │       │   └── strings.xml
│       │       ├── values-fr/
│       │       │   └── strings.xml
│       │       ├── values-frc/
│       │       │   └── strings.xml
│       │       ├── values-gd/
│       │       │   └── strings.xml
│       │       ├── values-gl/
│       │       │   └── strings.xml
│       │       ├── values-gu/
│       │       │   └── strings.xml
│       │       ├── values-he/
│       │       │   └── strings.xml
│       │       ├── values-hi/
│       │       │   └── strings.xml
│       │       ├── values-hr/
│       │       │   └── strings.xml
│       │       ├── values-hu/
│       │       │   └── strings.xml
│       │       ├── values-hy/
│       │       │   └── strings.xml
│       │       ├── values-ia/
│       │       │   └── strings.xml
│       │       ├── values-in/
│       │       │   └── strings.xml
│       │       ├── values-is/
│       │       │   └── strings.xml
│       │       ├── values-it/
│       │       │   └── strings.xml
│       │       ├── values-ja/
│       │       │   └── strings.xml
│       │       ├── values-ji/
│       │       │   └── strings.xml
│       │       ├── values-jv/
│       │       │   └── strings.xml
│       │       ├── values-ka/
│       │       │   └── strings.xml
│       │       ├── values-kab/
│       │       │   └── strings.xml
│       │       ├── values-kk/
│       │       │   └── strings.xml
│       │       ├── values-kmr/
│       │       │   └── strings.xml
│       │       ├── values-kn/
│       │       │   └── strings.xml
│       │       ├── values-ko/
│       │       │   └── strings.xml
│       │       ├── values-ks/
│       │       │   └── strings.xml
│       │       ├── values-ku/
│       │       │   └── strings.xml
│       │       ├── values-la/
│       │       │   └── strings.xml
│       │       ├── values-land/
│       │       │   └── dimens.xml
│       │       ├── values-lmo/
│       │       │   └── strings.xml
│       │       ├── values-lt/
│       │       │   └── strings.xml
│       │       ├── values-lv/
│       │       │   └── strings.xml
│       │       ├── values-mk/
│       │       │   └── strings.xml
│       │       ├── values-ml/
│       │       │   └── strings.xml
│       │       ├── values-mn/
│       │       │   └── strings.xml
│       │       ├── values-mr/
│       │       │   └── strings.xml
│       │       ├── values-ms/
│       │       │   └── strings.xml
│       │       ├── values-my/
│       │       │   └── strings.xml
│       │       ├── values-nap/
│       │       │   └── strings.xml
│       │       ├── values-nb-rNO/
│       │       │   └── strings.xml
│       │       ├── values-nds/
│       │       │   └── strings.xml
│       │       ├── values-ne/
│       │       │   └── strings.xml
│       │       ├── values-night/
│       │       │   ├── colors.xml
│       │       │   └── styles.xml
│       │       ├── values-nl/
│       │       │   └── strings.xml
│       │       ├── values-nl-rBE/
│       │       │   └── strings.xml
│       │       ├── values-nn/
│       │       │   └── strings.xml
│       │       ├── values-nqo/
│       │       │   └── strings.xml
│       │       ├── values-oc/
│       │       │   └── strings.xml
│       │       ├── values-or/
│       │       │   └── strings.xml
│       │       ├── values-pa/
│       │       │   └── strings.xml
│       │       ├── values-pa-rPK/
│       │       │   └── strings.xml
│       │       ├── values-pl/
│       │       │   └── strings.xml
│       │       ├── values-pt/
│       │       │   └── strings.xml
│       │       ├── values-pt-rBR/
│       │       │   └── strings.xml
│       │       ├── values-pt-rPT/
│       │       │   └── strings.xml
│       │       ├── values-ro/
│       │       │   └── strings.xml
│       │       ├── values-rom/
│       │       │   └── strings.xml
│       │       ├── values-ru/
│       │       │   └── strings.xml
│       │       ├── values-ryu/
│       │       │   └── strings.xml
│       │       ├── values-sat/
│       │       │   └── strings.xml
│       │       ├── values-sc/
│       │       │   └── strings.xml
│       │       ├── values-scn/
│       │       │   └── strings.xml
│       │       ├── values-si/
│       │       │   └── strings.xml
│       │       ├── values-sk/
│       │       │   └── strings.xml
│       │       ├── values-sl/
│       │       │   └── strings.xml
│       │       ├── values-so/
│       │       │   └── strings.xml
│       │       ├── values-sq/
│       │       │   └── strings.xml
│       │       ├── values-sr/
│       │       │   └── strings.xml
│       │       ├── values-sv/
│       │       │   └── strings.xml
│       │       ├── values-sw/
│       │       │   └── strings.xml
│       │       ├── values-sw600dp/
│       │       │   └── dimens.xml
│       │       ├── values-sw600dp-land/
│       │       │   └── dimens.xml
│       │       ├── values-ta/
│       │       │   └── strings.xml
│       │       ├── values-te/
│       │       │   └── strings.xml
│       │       ├── values-th/
│       │       │   └── strings.xml
│       │       ├── values-ti/
│       │       │   └── strings.xml
│       │       ├── values-tl/
│       │       │   └── strings.xml
│       │       ├── values-tok/
│       │       │   └── strings.xml
│       │       ├── values-tr/
│       │       │   └── strings.xml
│       │       ├── values-tt/
│       │       │   └── strings.xml
│       │       ├── values-tzm/
│       │       │   └── strings.xml
│       │       ├── values-uk/
│       │       │   └── strings.xml
│       │       ├── values-und/
│       │       │   └── strings.xml
│       │       ├── values-ur/
│       │       │   └── strings.xml
│       │       ├── values-v27/
│       │       │   └── styles.xml
│       │       ├── values-v29/
│       │       │   └── styles.xml
│       │       ├── values-v35/
│       │       │   └── styles.xml
│       │       ├── values-vi/
│       │       │   └── strings.xml
│       │       ├── values-vmf/
│       │       │   └── strings.xml
│       │       ├── values-w820dp/
│       │       │   └── dimens.xml
│       │       ├── values-zh-rCN/
│       │       │   └── strings.xml
│       │       ├── values-zh-rHK/
│       │       │   └── strings.xml
│       │       ├── values-zh-rTW/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           ├── appearance_settings.xml
│       │           ├── automotive_app_desc.xml
│       │           ├── backup_restore_settings.xml
│       │           ├── content_settings.xml
│       │           ├── debug_settings.xml
│       │           ├── download_settings.xml
│       │           ├── exoplayer_settings.xml
│       │           ├── history_settings.xml
│       │           ├── main_settings.xml
│       │           ├── notifications_settings.xml
│       │           ├── player_notification_settings.xml
│       │           ├── update_settings.xml
│       │           └── video_audio_settings.xml
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── schabi/
│           │           └── newpipe/
│           │               ├── NewVersionManagerTest.kt
│           │               ├── database/
│           │               │   └── playlist/
│           │               │       └── PlaylistLocalItemTest.kt
│           │               ├── error/
│           │               │   └── ReCaptchaActivityTest.kt
│           │               ├── ktx/
│           │               │   └── ThrowableExtensionsTest.kt
│           │               ├── local/
│           │               │   ├── playlist/
│           │               │   │   └── ExportPlaylistTest.kt
│           │               │   └── subscription/
│           │               │       ├── FeedGroupIconTest.kt
│           │               │       └── services/
│           │               │           └── ImportExportJsonHelperTest.java
│           │               ├── player/
│           │               │   └── playqueue/
│           │               │       ├── PlayQueueItemTest.java
│           │               │       └── PlayQueueTest.java
│           │               ├── settings/
│           │               │   ├── ImportAllCombinationsTest.kt
│           │               │   ├── ImportExportManagerTest.kt
│           │               │   └── tabs/
│           │               │       ├── TabTest.java
│           │               │       └── TabsJsonHelperTest.java
│           │               ├── streams/
│           │               │   └── SrtFromTtmlWriterTest.java
│           │               └── util/
│           │                   ├── ListHelperTest.java
│           │                   ├── LocalizationTest.kt
│           │                   ├── QuadraticSliderStrategyTest.java
│           │                   ├── external_communication/
│           │                   │   └── TimestampExtractorTest.java
│           │                   ├── image/
│           │                   │   └── ImageStrategyTest.java
│           │                   └── urlfinder/
│           │                       └── UrlFinderTest.kt
│           └── resources/
│               ├── import_export_test.json
│               └── settings/
│                   └── README.md
├── build.gradle.kts
├── buildSrc/
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── kotlin/
│               └── CheckDependenciesOrder.kt
├── checkstyle/
│   ├── checkstyle.xml
│   └── suppressions.xml
├── doc/
│   ├── README.ar.md
│   ├── README.asm.md
│   ├── README.de.md
│   ├── README.es.md
│   ├── README.fr.md
│   ├── README.hi.md
│   ├── README.it.md
│   ├── README.ja.md
│   ├── README.ko.md
│   ├── README.pa.md
│   ├── README.pl.md
│   ├── README.pt_BR.md
│   ├── README.ro.md
│   ├── README.ru.md
│   ├── README.ryu.md
│   ├── README.so.md
│   ├── README.sr.md
│   ├── README.tr.md
│   ├── README.zh_TW.md
│   └── gradle.md
├── fastlane/
│   └── metadata/
│       └── android/
│           ├── ar/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ar_LY/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ast/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── az/
│           │   ├── changelogs/
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 991.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── azb/
│           │   └── short_description.txt
│           ├── bar/
│           │   └── short_description.txt
│           ├── be/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   └── 992.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bg/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bm/
│           │   └── short_description.txt
│           ├── bn/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 953.txt
│           │   │   ├── 956.txt
│           │   │   ├── 962.txt
│           │   │   └── 963.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bn_BD/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── bs/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ca/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ckb/
│           │   ├── changelogs/
│           │   │   └── 960.txt
│           │   └── short_description.txt
│           ├── cs/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── cy/
│           │   ├── changelogs/
│           │   │   └── 63.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── da/
│           │   ├── changelogs/
│           │   │   └── 63.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── de/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── el/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 910.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 996.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── en-US/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── en_GB/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── eo/
│           │   ├── changelogs/
│           │   │   └── 63.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── es/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── et/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 962.txt
│           │   │   ├── 967.txt
│           │   │   ├── 969.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── eu/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fa/
│           │   ├── changelogs/
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 870.txt
│           │   │   ├── 910.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 985.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fi/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 830.txt
│           │   │   ├── 957.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   └── 975.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fil/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 64.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── fr/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── gl/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── he/
│           │   ├── changelogs/
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 973.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 988.txt
│           │   │   ├── 995.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── hi/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── hr/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── hu/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ia/
│           │   └── short_description.txt
│           ├── id/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── is/
│           │   ├── changelogs/
│           │   │   └── 997.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── it/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ja/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   └── 960.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── jv/
│           │   ├── changelogs/
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   └── 860.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ka/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 996.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── kab/
│           │   └── short_description.txt
│           ├── kk/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   └── 65.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── kn-IN/
│           │   ├── changelogs/
│           │   │   ├── 830.txt
│           │   │   └── 850.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ko/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ku/
│           │   └── short_description.txt
│           ├── lmo/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── lt/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 820.txt
│           │   │   └── 830.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── lv/
│           │   ├── changelogs/
│           │   │   ├── 1001.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 950.txt
│           │   │   ├── 956.txt
│           │   │   ├── 963.txt
│           │   │   ├── 982.txt
│           │   │   ├── 985.txt
│           │   │   ├── 989.txt
│           │   │   ├── 996.txt
│           │   │   └── 998.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── mk/
│           │   ├── changelogs/
│           │   │   ├── 1001.txt
│           │   │   ├── 850.txt
│           │   │   └── 982.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ml/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   └── 968.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ms/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 790.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   └── 954.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── nb-NO/
│           │   ├── changelogs/
│           │   │   ├── 954.txt
│           │   │   ├── 956.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 962.txt
│           │   │   ├── 964.txt
│           │   │   ├── 986.txt
│           │   │   └── 992.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ne/
│           │   └── short_description.txt
│           ├── nl/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 985.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── nl-BE/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 910.txt
│           │   │   ├── 950.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   └── 957.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── nqo/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   └── 68.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── or/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pa/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pa-PK/
│           │   └── short_description.txt
│           ├── pl/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   └── 997.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pt/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pt-BR/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 971.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 976.txt
│           │   │   ├── 978.txt
│           │   │   ├── 982.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 989.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── pt-PT/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ro/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 770.txt
│           │   │   └── 953.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ru/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sat/
│           │   └── short_description.txt
│           ├── sc/
│           │   ├── changelogs/
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 959.txt
│           │   │   └── 960.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── si/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sk/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sl/
│           │   ├── changelogs/
│           │   │   └── 991.txt
│           │   └── short_description.txt
│           ├── so/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sq/
│           │   ├── changelogs/
│           │   │   └── 1000.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sr/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 956.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   └── 996.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── sv/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ta/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── te/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   └── 65.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── th/
│           │   ├── changelogs/
│           │   │   └── 1000.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ti/
│           │   ├── changelogs/
│           │   │   └── 850.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── tl/
│           │   └── short_description.txt
│           ├── tok/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── tr/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 910.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 982.txt
│           │   │   ├── 985.txt
│           │   │   ├── 987.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── uk/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── und/
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── ur/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   └── 956.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── uz-Latn/
│           │   ├── changelogs/
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 730.txt
│           │   │   ├── 770.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   └── 957.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── vi/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 950.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── zh-Hans/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1005.txt
│           │   │   ├── 1006.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 1008.txt
│           │   │   ├── 1009.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 66.txt
│           │   │   ├── 68.txt
│           │   │   ├── 69.txt
│           │   │   ├── 70.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 740.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 963.txt
│           │   │   ├── 964.txt
│           │   │   ├── 965.txt
│           │   │   ├── 966.txt
│           │   │   ├── 967.txt
│           │   │   ├── 968.txt
│           │   │   ├── 969.txt
│           │   │   ├── 970.txt
│           │   │   ├── 971.txt
│           │   │   ├── 972.txt
│           │   │   ├── 973.txt
│           │   │   ├── 974.txt
│           │   │   ├── 975.txt
│           │   │   ├── 976.txt
│           │   │   ├── 977.txt
│           │   │   ├── 978.txt
│           │   │   ├── 979.txt
│           │   │   ├── 980.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 983.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 994.txt
│           │   │   ├── 995.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           ├── zh-Hant/
│           │   ├── changelogs/
│           │   │   ├── 1000.txt
│           │   │   ├── 1001.txt
│           │   │   ├── 1002.txt
│           │   │   ├── 1003.txt
│           │   │   ├── 1004.txt
│           │   │   ├── 1007.txt
│           │   │   ├── 63.txt
│           │   │   ├── 64.txt
│           │   │   ├── 65.txt
│           │   │   ├── 71.txt
│           │   │   ├── 730.txt
│           │   │   ├── 750.txt
│           │   │   ├── 760.txt
│           │   │   ├── 770.txt
│           │   │   ├── 780.txt
│           │   │   ├── 790.txt
│           │   │   ├── 800.txt
│           │   │   ├── 810.txt
│           │   │   ├── 820.txt
│           │   │   ├── 830.txt
│           │   │   ├── 840.txt
│           │   │   ├── 850.txt
│           │   │   ├── 860.txt
│           │   │   ├── 870.txt
│           │   │   ├── 900.txt
│           │   │   ├── 910.txt
│           │   │   ├── 920.txt
│           │   │   ├── 930.txt
│           │   │   ├── 940.txt
│           │   │   ├── 950.txt
│           │   │   ├── 951.txt
│           │   │   ├── 952.txt
│           │   │   ├── 953.txt
│           │   │   ├── 954.txt
│           │   │   ├── 955.txt
│           │   │   ├── 956.txt
│           │   │   ├── 957.txt
│           │   │   ├── 958.txt
│           │   │   ├── 959.txt
│           │   │   ├── 960.txt
│           │   │   ├── 961.txt
│           │   │   ├── 962.txt
│           │   │   ├── 964.txt
│           │   │   ├── 981.txt
│           │   │   ├── 982.txt
│           │   │   ├── 984.txt
│           │   │   ├── 985.txt
│           │   │   ├── 986.txt
│           │   │   ├── 987.txt
│           │   │   ├── 988.txt
│           │   │   ├── 989.txt
│           │   │   ├── 990.txt
│           │   │   ├── 991.txt
│           │   │   ├── 992.txt
│           │   │   ├── 993.txt
│           │   │   ├── 996.txt
│           │   │   ├── 997.txt
│           │   │   ├── 998.txt
│           │   │   └── 999.txt
│           │   ├── full_description.txt
│           │   └── short_description.txt
│           └── zh_Hant_HK/
│               ├── changelogs/
│               │   ├── 1000.txt
│               │   ├── 1001.txt
│               │   ├── 1002.txt
│               │   ├── 1003.txt
│               │   ├── 1004.txt
│               │   ├── 1005.txt
│               │   ├── 1007.txt
│               │   ├── 63.txt
│               │   ├── 64.txt
│               │   ├── 65.txt
│               │   ├── 66.txt
│               │   ├── 68.txt
│               │   ├── 981.txt
│               │   ├── 983.txt
│               │   ├── 984.txt
│               │   ├── 985.txt
│               │   ├── 986.txt
│               │   ├── 987.txt
│               │   ├── 988.txt
│               │   ├── 989.txt
│               │   ├── 990.txt
│               │   ├── 991.txt
│               │   ├── 992.txt
│               │   ├── 993.txt
│               │   ├── 994.txt
│               │   ├── 995.txt
│               │   ├── 996.txt
│               │   ├── 997.txt
│               │   ├── 998.txt
│               │   └── 999.txt
│               ├── full_description.txt
│               └── short_description.txt
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
Download .txt
Showing preview only (343K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4018 symbols across 295 files)

FILE: .github/workflows/image-minimizer.js
  function replaceAsync (line 90) | async function replaceAsync(str, regex, asyncFn) {
  function minimizeAsync (line 100) | async function minimizeAsync(match, g1, g2) {

FILE: app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.java
  class ErrorInfoTest (line 23) | @RunWith(AndroidJUnit4.class)
    method getMessageFromErrorInfo (line 31) | private int getMessageFromErrorInfo(final ErrorInfo errorInfo)
    method errorInfoTestParcelable (line 42) | @Test

FILE: app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java
  class SubscriptionManagerTest (line 22) | public class SubscriptionManagerTest {
    method getAssertOneSubscriptionEntity (line 30) | private SubscriptionEntity getAssertOneSubscriptionEntity() {
    method setup (line 39) | @Before
    method cleanUp (line 45) | @After
    method testInsert (line 50) | @Test
    method testUpdateNotificationMode (line 67) | @Test

FILE: app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsBVDLeakCanary.java
  class DebugSettingsBVDLeakCanary (line 12) | @SuppressWarnings("unused") // Class is used but loaded via reflection
    method getNewLeakDisplayActivityIntent (line 16) | @Override

FILE: app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java
  class FragmentStatePagerAdapterMenuWorkaround (line 59) | @SuppressWarnings("deprecation")
    method FragmentStatePagerAdapterMenuWorkaround (line 112) | @Deprecated
    method FragmentStatePagerAdapterMenuWorkaround (line 129) | public FragmentStatePagerAdapterMenuWorkaround(@NonNull final Fragment...
    method getItem (line 139) | @NonNull
    method startUpdate (line 142) | @Override
    method instantiateItem (line 150) | @SuppressWarnings("deprecation")
    method destroyItem (line 197) | @Override
    method setPrimaryItem (line 222) | @Override
    method finishUpdate (line 253) | @Override
    method isViewFromObject (line 273) | @Override
    method saveState (line 282) | @Override
    method restoreState (line 310) | @Override

FILE: app/src/main/java/com/google/android/material/appbar/FlingBehavior.java
  class FlingBehavior (line 20) | public final class FlingBehavior extends AppBarLayout.Behavior {
    method FlingBehavior (line 23) | public FlingBehavior(final Context context, final AttributeSet attrs) {
    method onRequestChildRectangleOnScreen (line 33) | @Override
    method onInterceptTouchEvent (line 65) | @Override
    method onStartNestedScroll (line 93) | @Override
    method onNestedFling (line 104) | @Override
    method getScrollerField (line 113) | @Nullable
    method getLastNestedScrollingChildRefField (line 129) | @Nullable
    method resetNestedScrollingChild (line 145) | private void resetNestedScrollingChild() {
    method stopAppBarLayoutFling (line 159) | private void stopAppBarLayoutFling() {

FILE: app/src/main/java/org/apache/commons/text/similarity/FuzzyScore.java
  class FuzzyScore (line 41) | public class FuzzyScore {
    method FuzzyScore (line 57) | public FuzzyScore(final Locale locale) {
    method fuzzyScore (line 87) | public Integer fuzzyScore(final CharSequence term, final CharSequence ...
    method getLocale (line 144) | public Locale getLocale() {

FILE: app/src/main/java/org/schabi/newpipe/BaseFragment.java
  class BaseFragment (line 17) | public abstract class BaseFragment extends Fragment {
    method useAsFrontPage (line 25) | public void useAsFrontPage(final boolean value) {
    method onAttach (line 33) | @Override
    method onDetach (line 39) | @Override
    method onCreate (line 45) | @Override
    method onViewCreated (line 59) | @Override
    method onSaveInstanceState (line 71) | @Override
    method onRestoreInstanceState (line 77) | protected void onRestoreInstanceState(@NonNull final Bundle savedInsta...
    method initViews (line 96) | protected void initViews(final View rootView, final Bundle savedInstan...
    method initListeners (line 107) | protected void initListeners() {
    method setTitle (line 114) | public void setTitle(final String title) {
    method getFM (line 133) | protected FragmentManager getFM() {

FILE: app/src/main/java/org/schabi/newpipe/DownloaderImpl.java
  class DownloaderImpl (line 30) | public final class DownloaderImpl extends Downloader {
    method DownloaderImpl (line 42) | private DownloaderImpl(final OkHttpClient.Builder builder) {
    method getClient (line 51) | @NonNull
    method init (line 62) | public static DownloaderImpl init(@Nullable final OkHttpClient.Builder...
    method getInstance (line 68) | public static DownloaderImpl getInstance() {
    method getCookies (line 72) | public String getCookies(final String url) {
    method getCookie (line 84) | public String getCookie(final String key) {
    method setCookie (line 88) | public void setCookie(final String key, final String cookie) {
    method removeCookie (line 92) | public void removeCookie(final String key) {
    method updateYoutubeRestrictedModeCookies (line 96) | public void updateYoutubeRestrictedModeCookies(final Context context) {
    method updateYoutubeRestrictedModeCookies (line 104) | public void updateYoutubeRestrictedModeCookies(final boolean youtubeRe...
    method getContentLength (line 120) | public long getContentLength(final String url) throws IOException {
    method execute (line 131) | @Override

FILE: app/src/main/java/org/schabi/newpipe/MainActivity.java
  class MainActivity (line 106) | public class MainActivity extends AppCompatActivity {
    method onCreate (line 140) | @Override
    method onPostCreate (line 211) | @Override
    method onStart (line 226) | @Override
    method onStop (line 233) | @Override
    method setupDrawer (line 239) | private void setupDrawer() throws ExtractionException {
    method addDrawerMenuForCurrentService (line 274) | private void addDrawerMenuForCurrentService() throws ExtractionExcepti...
    method drawerItemSelected (line 320) | private boolean drawerItemSelected(final MenuItem item) {
    method changeService (line 342) | private void changeService(final MenuItem item) {
    method tabSelected (line 352) | private void tabSelected(final MenuItem item) {
    method kioskSelected (line 372) | private void kioskSelected(final MenuItem item) throws ExtractionExcep...
    method optionsAboutSelected (line 385) | private void optionsAboutSelected(final MenuItem item) {
    method setupDrawerHeader (line 399) | private void setupDrawerHeader() {
    method toggleServices (line 417) | private void toggleServices() {
    method showServices (line 440) | private void showServices() {
    method enhancePeertubeMenu (line 458) | private void enhancePeertubeMenu(final MenuItem menuItem) {
    method onDestroy (line 503) | @Override
    method onResume (line 514) | @Override
    method onNewIntent (line 561) | @Override
    method onKeyDown (line 581) | @Override
    method onBackPressed (line 595) | @Override
    method onRequestPermissionsResult (line 650) | @Override
    method onHomeButtonPressed (line 701) | private void onHomeButtonPressed() {
    method onCreateOptionsMenu (line 720) | @Override
    method onOptionsItemSelected (line 743) | @Override
    method initFragments (line 760) | private void initFragments() {
    method updateDrawerNavigation (line 783) | private void updateDrawerNavigation() {
    method handleIntent (line 805) | private void handleIntent(final Intent intent) {
    method openMiniPlayerIfMissing (line 865) | private void openMiniPlayerIfMissing() {
    method openMiniPlayerUponPlayerStarted (line 876) | private void openMiniPlayerUponPlayerStarted() {
    method openDetailFragmentFromCommentReplies (line 914) | private void openDetailFragmentFromCommentReplies(
    method bottomSheetHiddenOrCollapsed (line 976) | private boolean bottomSheetHiddenOrCollapsed() {
    method showKeepAndroidDialog (line 985) | private void showKeepAndroidDialog() {

FILE: app/src/main/java/org/schabi/newpipe/PanicResponderActivity.java
  class PanicResponderActivity (line 26) | public class PanicResponderActivity extends Activity {
    method onCreate (line 29) | @SuppressLint("NewApi")

FILE: app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java
  class QueueItemMenuUtil (line 23) | public final class QueueItemMenuUtil {
    method QueueItemMenuUtil (line 24) | private QueueItemMenuUtil() {
    method openPopupMenu (line 27) | public static void openPopupMenu(final PlayQueue playQueue,

FILE: app/src/main/java/org/schabi/newpipe/RouterActivity.java
  class RouterActivity (line 103) | public class RouterActivity extends AppCompatActivity {
    method onCreate (line 119) | @Override
    method onStop (line 177) | @Override
    method onSaveInstanceState (line 186) | @Override
    method onStart (line 192) | @Override
    method onDestroy (line 205) | @Override
    method finish (line 216) | @Override
    method handleUrl (line 224) | private void handleUrl(final String url) {
    method handleError (line 262) | private static void handleError(final Context context, final ErrorInfo...
    method showUnsupportedUrlDialog (line 283) | protected void showUnsupportedUrlDialog(final String url) {
    method onSuccess (line 298) | protected void onSuccess() {
    class ChoiceAvailabilityChecker (line 378) | class ChoiceAvailabilityChecker {
      method ChoiceAvailabilityChecker (line 382) | ChoiceAvailabilityChecker(
      method getAvailableChoices (line 389) | public List<AdapterChoiceItem> getAvailableChoices() {
      method getSelectedChoiceKey (line 393) | public String getSelectedChoiceKey() {
      method isAvailableAndSelected (line 397) | public boolean isAvailableAndSelected(@StringRes final int... wanted...
      method isAvailableAndSelected (line 401) | public boolean isAvailableAndSelected(@StringRes final int wantedKey) {
    method showDialog (line 412) | private void showDialog(final List<AdapterChoiceItem> choices) {
    method getChoicesForService (line 512) | private List<AdapterChoiceItem> getChoicesForService(final StreamingSe...
    method getThemeWrapperContext (line 584) | protected Context getThemeWrapperContext() {
    method setDialogButtonsState (line 589) | private void setDialogButtonsState(final AlertDialog dialog, final boo...
    method handleText (line 600) | private void handleText() {
    method handleChoice (line 609) | private void handleChoice(final String selectedChoiceKey) {
    method canHandleChoiceLikeShowInfo (line 667) | private boolean canHandleChoiceLikeShowInfo(final String selectedChoic...
    class PersistentFragment (line 691) | public static class PersistentFragment extends Fragment {
      method inFlight (line 696) | private synchronized void inFlight(final boolean started) {
      method onAttach (line 708) | @Override
      method onDetach (line 714) | @Override
      method onCreate (line 720) | @SuppressWarnings("deprecation")
      method onDestroy (line 727) | @Override
      method getActivityContext (line 736) | private Optional<AppCompatActivity> getActivityContext() {
      method runOnVisible (line 747) | private void runOnVisible(final Consumer<AppCompatActivity> runnable) {
      method pleaseWait (line 785) | <T> Single<T> pleaseWait(final Single<T> single) {
      method openDownloadDialog (line 799) | @SuppressLint("CheckResult")
      method openAddToPlaylistDialog (line 822) | private void openAddToPlaylistDialog(final int currentServiceId, fin...
    method openAddToPlaylistDialog (line 850) | private void openAddToPlaylistDialog() {
    method openDownloadDialog (line 854) | private void openDownloadDialog() {
    method getPersistFragment (line 858) | private PersistentFragment getPersistFragment() {
    method onRequestPermissionsResult (line 871) | @Override
    class AdapterChoiceItem (line 887) | private static class AdapterChoiceItem {
      method AdapterChoiceItem (line 893) | AdapterChoiceItem(final String key, final String description, final ...
    class Choice (line 900) | private static class Choice implements Serializable {
      method Choice (line 906) | Choice(final int serviceId, final LinkType linkType,
      method toString (line 914) | @NonNull
    class FetcherService (line 921) | public static class FetcherService extends IntentService {
      method FetcherService (line 927) | public FetcherService() {
      method onCreate (line 931) | @Override
      method onHandleIntent (line 937) | @Override
      method handleChoice (line 951) | public void handleChoice(final Choice choice) {
      method getResultHandler (line 987) | public Consumer<Info> getResultHandler(final Choice choice) {
      method onDestroy (line 1039) | @Override
      method createNotification (line 1048) | private NotificationCompat.Builder createNotification() {
    method getUrl (line 1064) | @Nullable

FILE: app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java
  class DownloadActivity (line 23) | public class DownloadActivity extends AppCompatActivity {
    method onCreate (line 27) | @Override
    method updateFragments (line 65) | private void updateFragments() {
    method onCreateOptionsMenu (line 74) | @Override
    method onOptionsItemSelected (line 84) | @Override

FILE: app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java
  class DownloadDialog (line 91) | public class DownloadDialog extends DialogFragment
    method DownloadDialog (line 149) | public DownloadDialog() {
    method DownloadDialog (line 163) | public DownloadDialog(@NonNull final Context context, @NonNull final S...
    method onCreate (line 197) | @Override
    method updateSecondaryStreams (line 250) | private void updateSecondaryStreams() {
    method onCreateView (line 280) | @Override
    method onViewCreated (line 292) | @Override
    method initToolbar (line 336) | private void initToolbar(final Toolbar toolbar) {
    method onDestroy (line 359) | @Override
    method onDestroyView (line 365) | @Override
    method onSaveInstanceState (line 371) | @Override
    method fetchStreamsSize (line 382) | private void fetchStreamsSize() {
    method setupAudioTrackSpinner (line 413) | private void setupAudioTrackSpinner() {
    method setupAudioSpinner (line 422) | private void setupAudioSpinner() {
    method setupVideoSpinner (line 437) | private void setupVideoSpinner() {
    method onVideoStreamSelected (line 450) | private void onVideoStreamSelected() {
    method setupSubtitleSpinner (line 459) | private void setupSubtitleSpinner() {
    method requestDownloadPickAudioFolderResult (line 478) | private void requestDownloadPickAudioFolderResult(final ActivityResult...
    method requestDownloadPickVideoFolderResult (line 483) | private void requestDownloadPickVideoFolderResult(final ActivityResult...
    method requestDownloadSaveAsResult (line 488) | private void requestDownloadSaveAsResult(@NonNull final ActivityResult...
    method requestDownloadPickFolderResult (line 517) | private void requestDownloadPickFolderResult(@NonNull final ActivityRe...
    method onCheckedChanged (line 553) | @Override
    method onItemSelected (line 573) | @Override
    method onItemSelectedSetFileName (line 607) | private void onItemSelectedSetFileName() {
    method onNothingSelected (line 636) | @Override
    method setupDownloadOptions (line 645) | protected void setupDownloadOptions() {
    method setRadioButtonsState (line 692) | private void setRadioButtonsState(final boolean enabled) {
    method getWrappedAudioStreams (line 698) | private StreamInfoWrapper<AudioStream> getWrappedAudioStreams() {
    method getSubtitleIndexBy (line 705) | private int getSubtitleIndexBy(@NonNull final List<SubtitlesStream> st...
    method getNameEditText (line 731) | @NonNull
    method showFailedDialog (line 739) | private void showFailedDialog(@StringRes final int msg) {
    method launchDirectoryPicker (line 747) | private void launchDirectoryPicker(final ActivityResultLauncher<Intent...
    method prepareSelectedDownload (line 752) | private void prepareSelectedDownload() {
    method checkSelectedDownload (line 868) | private void checkSelectedDownload(final StoredDirectoryHelper mainSto...
    method continueSelectedDownload (line 1019) | private void continueSelectedDownload(@NonNull final StoredFileHelper ...

FILE: app/src/main/java/org/schabi/newpipe/download/LoadingDialog.java
  class LoadingDialog (line 22) | public class LoadingDialog extends DialogFragment {
    method LoadingDialog (line 39) | public LoadingDialog(final @StringRes int title) {
    method onCreate (line 43) | @Override
    method onCreateView (line 53) | @Override
    method onViewCreated (line 66) | @Override
    method initToolbar (line 73) | private void initToolbar(final Toolbar toolbar) {
    method onDestroyView (line 82) | @Override

FILE: app/src/main/java/org/schabi/newpipe/error/AcraReportSender.java
  class AcraReportSender (line 32) | public class AcraReportSender implements ReportSender {
    method send (line 34) | @Override

FILE: app/src/main/java/org/schabi/newpipe/error/AcraReportSenderFactory.java
  class AcraReportSenderFactory (line 37) | @AutoService(ReportSenderFactory.class)
    method create (line 39) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java
  class ReCaptchaActivity (line 49) | public class ReCaptchaActivity extends AppCompatActivity {
    method sanitizeRecaptchaUrl (line 56) | public static String sanitizeRecaptchaUrl(@Nullable final String url) {
    method onCreate (line 68) | @SuppressLint("SetJavaScriptEnabled")
    method onCreateOptionsMenu (line 114) | @Override
    method onBackPressed (line 128) | @Override
    method onOptionsItemSelected (line 134) | @Override
    method saveCookiesAndFinish (line 143) | private void saveCookiesAndFinish() {
    method handleCookiesFromUrl (line 171) | private void handleCookiesFromUrl(@Nullable final String url) {
    method handleCookies (line 199) | private void handleCookies(@Nullable final String cookies) {
    method addYoutubeCookies (line 212) | private void addYoutubeCookies(@NonNull final String cookies) {
    method addCookie (line 221) | private void addCookie(final String cookie) {

FILE: app/src/main/java/org/schabi/newpipe/fragments/BackPressable.java
  type BackPressable (line 6) | public interface BackPressable {
    method onBackPressed (line 12) | boolean onBackPressed();

FILE: app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java
  class BaseStateFragment (line 27) | public abstract class BaseStateFragment<I> extends BaseFragment implemen...
    method onViewCreated (line 44) | @Override
    method onPause (line 50) | @Override
    method onResume (line 56) | @Override
    method initViews (line 68) | @Override
    method onDestroyView (line 77) | @Override
    method onRetryButtonClicked (line 87) | protected void onRetryButtonClicked() {
    method reloadContent (line 91) | public void reloadContent() {
    method doInitialLoadLogic (line 99) | protected void doInitialLoadLogic() {
    method startLoading (line 103) | protected void startLoading(final boolean forceLoad) {
    method showLoading (line 115) | @Override
    method hideLoading (line 126) | @Override
    method showEmptyState (line 137) | @Override
    method handleResult (line 149) | @Override
    method handleError (line 157) | @Override
    method showError (line 173) | public final void showError(final ErrorInfo errorInfo) {
    method showTextError (line 187) | public final void showTextError(@NonNull final String errorString) {
    method setEmptyStateMessage (line 200) | protected void setEmptyStateMessage(@StringRes final int text) {
    method hideErrorPanel (line 206) | public final void hideErrorPanel() {
    method isErrorPanelVisible (line 211) | public final boolean isErrorPanelVisible() {
    method showSnackBarError (line 221) | public void showSnackBarError(final ErrorInfo errorInfo) {

FILE: app/src/main/java/org/schabi/newpipe/fragments/BlankFragment.java
  class BlankFragment (line 17) | public class BlankFragment extends BaseFragment {
    method BlankFragment (line 28) | public BlankFragment() {
    method BlankFragment (line 35) | public BlankFragment(@Nullable final ErrorInfo errorInfo) {
    method onCreateView (line 39) | @Nullable
    method onDestroyView (line 53) | @Override
    method onResume (line 63) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java
  class EmptyFragment (line 13) | public class EmptyFragment extends BaseFragment {
    method newInstance (line 16) | public static final EmptyFragment newInstance(final boolean showMessag...
    method onCreateView (line 24) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java
  class MainFragment (line 53) | public class MainFragment extends BaseFragment implements TabLayout.OnTa...
    method onCreate (line 72) | @Override
    method onCreateView (line 96) | @Override
    method initViews (line 103) | @Override
    method onResume (line 116) | @Override
    method onDestroy (line 134) | @Override
    method onDestroyView (line 144) | @Override
    method onCreateOptionsMenu (line 154) | @Override
    method onOptionsItemSelected (line 170) | @Override
    method setupTabs (line 188) | private void setupTabs() {
    method updateTabsIconAndDescription (line 206) | private void updateTabsIconAndDescription() {
    method updateTitleForTab (line 217) | private void updateTitleForTab(final int tabPosition) {
    method commitPlaylistTabs (line 221) | public void commitPlaylistTabs() {
    method updateTabLayoutPosition (line 227) | private void updateTabLayoutPosition() {
    method onTabSelected (line 259) | @Override
    method onTabUnselected (line 267) | @Override
    method onTabReselected (line 270) | @Override
    class SelectedTabsPagerAdapter (line 278) | public static final class SelectedTabsPagerAdapter
      method SelectedTabsPagerAdapter (line 291) | private SelectedTabsPagerAdapter(final Context context,
      method getItem (line 299) | @NonNull
      method getLocalPlaylistFragments (line 323) | public List<LocalPlaylistFragment> getLocalPlaylistFragments() {
      method getItemPosition (line 327) | @Override
      method getCount (line 334) | @Override
      method sameTabs (line 339) | public boolean sameTabs(final List<Tab> tabsToCompare) {

FILE: app/src/main/java/org/schabi/newpipe/fragments/OnScrollBelowItemsListener.java
  class OnScrollBelowItemsListener (line 12) | public abstract class OnScrollBelowItemsListener extends RecyclerView.On...
    method onScrolled (line 13) | @Override
    method onScrolledDown (line 46) | public abstract void onScrolledDown(RecyclerView recyclerView);

FILE: app/src/main/java/org/schabi/newpipe/fragments/ViewContract.java
  type ViewContract (line 3) | public interface ViewContract<I> {
    method showLoading (line 4) | void showLoading();
    method hideLoading (line 6) | void hideLoading();
    method showEmptyState (line 8) | void showEmptyState();
    method handleResult (line 10) | void handleResult(I result);
    method handleError (line 12) | void handleError();

FILE: app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java
  class BaseDescriptionFragment (line 44) | public abstract class BaseDescriptionFragment extends BaseFragment {
    method onCreateView (line 48) | @Override
    method onDestroy (line 59) | @Override
    method getDescription (line 69) | @Nullable
    method getService (line 76) | @NonNull
    method getServiceId (line 83) | protected abstract int getServiceId();
    method getStreamUrl (line 89) | @Nullable
    method getTags (line 96) | @NonNull
    method setupMetadata (line 104) | protected abstract void setupMetadata(LayoutInflater inflater, LinearL...
    method setupDescription (line 106) | private void setupDescription() {
    method enableDescriptionSelection (line 128) | private void enableDescriptionSelection() {
    method disableDescriptionSelection (line 138) | private void disableDescriptionSelection() {
    method addMetadataItem (line 157) | protected void addMetadataItem(final LayoutInflater inflater,
    method imageSizeToText (line 187) | private String imageSizeToText(final int heightOrWidth) {
    method addImagesMetadataItem (line 195) | protected void addImagesMetadataItem(final LayoutInflater inflater,
    method addTagsMetadataItem (line 251) | private void addTagsMetadataItem(final LayoutInflater inflater, final ...
    method onTagClick (line 270) | private void onTagClick(final View chip) {
    method onTagLongClick (line 277) | private boolean onTagLongClick(final View chip) {

FILE: app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java
  class DescriptionFragment (line 24) | public class DescriptionFragment extends BaseDescriptionFragment {
    method DescriptionFragment (line 29) | public DescriptionFragment(final StreamInfo streamInfo) {
    method DescriptionFragment (line 33) | public DescriptionFragment() {
    method getDescription (line 38) | @Nullable
    method getService (line 44) | @NonNull
    method getServiceId (line 50) | @Override
    method getStreamUrl (line 55) | @NonNull
    method getTags (line 61) | @NonNull
    method setupMetadata (line 67) | @Override
    method addPrivacyMetadataItem (line 112) | private void addPrivacyMetadataItem(final LayoutInflater inflater, fin...

FILE: app/src/main/java/org/schabi/newpipe/fragments/detail/StackItem.java
  class StackItem (line 9) | class StackItem implements Serializable {
    method StackItem (line 15) | StackItem(final int serviceId, final String url,
    method setUrl (line 23) | public void setUrl(final String url) {
    method setPlayQueue (line 27) | public void setPlayQueue(final PlayQueue queue) {
    method getServiceId (line 31) | public int getServiceId() {
    method getTitle (line 35) | public String getTitle() {
    method setTitle (line 39) | public void setTitle(final String title) {
    method getUrl (line 43) | public String getUrl() {
    method getPlayQueue (line 47) | public PlayQueue getPlayQueue() {
    method toString (line 51) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdapter.java
  class TabAdapter (line 14) | public class TabAdapter extends FragmentPagerAdapter {
    method TabAdapter (line 19) | public TabAdapter(final FragmentManager fm) {
    method getItem (line 27) | @NonNull
    method getCount (line 33) | @Override
    method addFragment (line 38) | public void addFragment(final Fragment fragment, final String title) {
    method clearAllItems (line 43) | public void clearAllItems() {
    method removeItem (line 48) | public void removeItem(final int position) {
    method updateItem (line 53) | public void updateItem(final int position, final Fragment fragment) {
    method updateItem (line 57) | public void updateItem(final String title, final Fragment fragment) {
    method getItemPosition (line 64) | @Override
    method getItemPositionByTitle (line 73) | public int getItemPositionByTitle(final String title) {
    method getItemTitle (line 77) | @Nullable
    method notifyDataSetUpdate (line 85) | public void notifyDataSetUpdate() {
    method destroyItem (line 89) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java
  class VideoDetailFragment (line 138) | public final class VideoDetailFragment
    method onServiceConnected (line 238) | @Override
    method onPlayerConnected (line 243) | @Override
    method onPlayerDisconnected (line 278) | @Override
    method onServiceDisconnected (line 287) | @Override
    method getInstance (line 295) | public static VideoDetailFragment getInstance(final int serviceId,
    method getInstanceInCollapsedState (line 304) | public static VideoDetailFragment getInstanceInCollapsedState() {
    method onCreate (line 315) | @Override
    method onCreateView (line 342) | @Override
    method onPause (line 349) | @Override
    method onResume (line 363) | @Override
    method onStop (line 390) | @Override
    method onDestroy (line 399) | @Override
    method onDestroyView (line 434) | @Override
    method onActivityResult (line 440) | @Override
    method setOnClickListeners (line 462) | private void setOnClickListeners() {
    method makeOnClickListener (line 545) | private View.OnClickListener makeOnClickListener(final Consumer<Stream...
    method setOnLongClickListeners (line 553) | private void setOnLongClickListeners() {
    method makeOnLongClickListener (line 580) | private View.OnLongClickListener makeOnLongClickListener(final Consume...
    method openChannel (line 590) | private void openChannel(final String subChannelUrl, final String subC...
    method toggleTitleAndSecondaryControls (line 599) | private void toggleTitleAndSecondaryControls() {
    method initViews (line 619) | @Override // called from onViewCreated in {@link BaseFragment#onViewCr...
    method initListeners (line 643) | @Override
    method onKeyDown (line 696) | @Override
    method onBackPressed (line 703) | @Override
    method setupFromHistoryItem (line 741) | private void setupFromHistoryItem(final StackItem item) {
    method doInitialLoadLogic (line 767) | @Override
    method selectAndLoadVideo (line 780) | public void selectAndLoadVideo(final int newServiceId,
    method prepareAndHandleInfoIfNeededAfterDelay (line 794) | private void prepareAndHandleInfoIfNeededAfterDelay(final StreamInfo i...
    method prepareAndHandleInfo (line 809) | private void prepareAndHandleInfo(final StreamInfo info, final boolean...
    method prepareAndLoadInfo (line 826) | protected void prepareAndLoadInfo() {
    method startLoading (line 831) | @Override
    method startLoading (line 844) | private void startLoading(final boolean forceLoad, final boolean addTo...
    method runWorker (line 856) | private void runWorker(final boolean forceLoad, final boolean addToBac...
    method initTabs (line 892) | private void initTabs() {
    method updateTabIconsAndContentDescriptions (line 943) | private void updateTabIconsAndContentDescriptions() {
    method updateTabs (line 953) | private void updateTabs(@NonNull final StreamInfo info) {
    method shouldShowComments (line 976) | private boolean shouldShowComments() {
    method updateTabLayoutVisibility (line 987) | public void updateTabLayoutVisibility() {
    method scrollToTop (line 1026) | public void scrollToTop() {
    method scrollToComment (line 1032) | public void scrollToComment(final CommentsInfoItem comment) {
    method toggleFullscreenIfInFullscreenMode (line 1050) | private void toggleFullscreenIfInFullscreenMode() {
    method openBackgroundPlayer (line 1062) | private void openBackgroundPlayer(final boolean append) {
    method openPopupPlayer (line 1081) | private void openPopupPlayer(final boolean append) {
    method openVideoPlayer (line 1112) | public void openVideoPlayer(final boolean directlyFullscreenIfApplicab...
    method openVideoPlayerAutoFullscreen (line 1144) | public void openVideoPlayerAutoFullscreen() {
    method openNormalBackgroundPlayer (line 1148) | private void openNormalBackgroundPlayer(final boolean append) {
    method openMainPlayer (line 1163) | private void openMainPlayer() {
    method hideMainPlayerOnLoadingNewStream (line 1191) | private void hideMainPlayerOnLoadingNewStream() {
    method setupPlayQueueForIntent (line 1206) | private PlayQueue setupPlayQueueForIntent(final boolean append) {
    method setAutoPlay (line 1224) | public void setAutoPlay(final boolean autoPlay) {
    method startOnExternalPlayer (line 1228) | private void startOnExternalPlayer(@NonNull final Context context,
    method isExternalPlayerEnabled (line 1248) | private boolean isExternalPlayerEnabled() {
    method isAutoplayEnabled (line 1255) | private boolean isAutoplayEnabled() {
    method tryAddVideoPlayerView (line 1263) | private void tryAddVideoPlayerView() {
    method removeVideoPlayerView (line 1292) | private void removeVideoPlayerView() {
    method makeDefaultHeightForVideoPlaceholder (line 1300) | private void makeDefaultHeightForVideoPlaceholder() {
    method onPreDraw (line 1311) | @Override
    method setHeightThumbnail (line 1333) | private void setHeightThumbnail() {
    method setHeightThumbnail (line 1356) | private void setHeightThumbnail(final int newHeight, final DisplayMetr...
    method showContent (line 1369) | private void showContent() {
    method setInitialData (line 1373) | protected void setInitialData(final int newServiceId,
    method setErrorImage (line 1383) | private void setErrorImage(final int imageResource) {
    method handleError (line 1394) | @Override
    method hideAgeRestrictedContent (line 1408) | private void hideAgeRestrictedContent() {
    method setupBroadcastReceiver (line 1413) | private void setupBroadcastReceiver() {
    method restoreDefaultOrientation (line 1451) | private void restoreDefaultOrientation() {
    method showLoading (line 1469) | @Override
    method handleResult (line 1509) | @Override
    method displayUploaderAsSubChannel (line 1633) | private void displayUploaderAsSubChannel(final StreamInfo info) {
    method displayBothUploaderAndSubChannel (line 1652) | private void displayBothUploaderAndSubChannel(final StreamInfo info) {
    method openDownloadDialog (line 1686) | public void openDownloadDialog() {
    method checkUpdateProgressInfo (line 1704) | private void checkUpdateProgressInfo(@NonNull final StreamInfo info) {
    method updatePlaybackProgress (line 1729) | private void updatePlaybackProgress(final long progress, final long du...
    method onViewCreated (line 1759) | @Override
    method onQueueUpdate (line 1764) | @Override
    method onPlaybackUpdate (line 1805) | @Override
    method onProgressUpdate (line 1825) | @Override
    method onMetadataUpdate (line 1839) | @Override
    method onPlayerError (line 1870) | @Override
    method onServiceStopped (line 1879) | @Override
    method onFullscreenStateChanged (line 1893) | @Override
    method onScreenRotationButtonClicked (line 1921) | @Override
    method onMoreOptionsLongClicked (line 1945) | @Override
    method showSystemUi (line 1966) | private void showSystemUi() {
    method hideSystemUi (line 1986) | private void hideSystemUi() {
    method hideSystemUiIfNeeded (line 2022) | @Override
    method isFullscreen (line 2030) | private boolean isFullscreen() {
    method playerIsNotStopped (line 2035) | private boolean playerIsNotStopped() {
    method restoreDefaultBrightness (line 2039) | private void restoreDefaultBrightness() {
    method setupBrightness (line 2051) | private void setupBrightness() {
    method accommodateForTvAndDesktopMode (line 2082) | private void accommodateForTvAndDesktopMode() {
    method checkLandscape (line 2102) | private void checkLandscape() {
    method wasCleared (line 2119) | private boolean wasCleared() {
    method findQueueInStack (line 2123) | @Nullable
    method replaceQueueIfUserConfirms (line 2137) | private void replaceQueueIfUserConfirms(final Runnable onAllow) {
    method showClearingQueueConfirmation (line 2151) | private void showClearingQueueConfirmation(final Runnable onAllow) {
    method showExternalVideoPlaybackDialog (line 2162) | private void showExternalVideoPlaybackDialog() {
    method showExternalAudioPlaybackDialog (line 2209) | private void showExternalAudioPlaybackDialog() {
    method cleanUp (line 2249) | private void cleanUp() {
    method moveFocusToMainFragment (line 2271) | private void moveFocusToMainFragment(final boolean toMain) {
    method manageSpaceAtTheBottom (line 2305) | private void manageSpaceAtTheBottom(final boolean showMore) {
    method setupBottomPlayer (line 2323) | private void setupBottomPlayer() {
    method updateOverlayPlayQueueButtonVisibility (line 2426) | private void updateOverlayPlayQueueButtonVisibility() {
    method updateOverlayData (line 2438) | private void updateOverlayData(@Nullable final String overlayTitle,
    method setOverlayPlayPauseImage (line 2447) | private void setOverlayPlayPauseImage(final boolean playerIsPlaying) {
    method setOverlayLook (line 2454) | private void setOverlayLook(final AppBarLayout appBar,
    method setOverlayElementsClickable (line 2469) | private void setOverlayElementsClickable(final boolean enable) {
    method isPlayerAvailable (line 2481) | boolean isPlayerAvailable() {
    method isPlayerServiceAvailable (line 2485) | boolean isPlayerServiceAvailable() {
    method isPlayerAndPlayerServiceAvailable (line 2489) | boolean isPlayerAndPlayerServiceAvailable() {
    method getRoot (line 2493) | public Optional<View> getRoot() {
    method updateBottomSheetState (line 2499) | private void updateBottomSheetState(final int newState) {

FILE: app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailPlayerCrasher.java
  class VideoDetailPlayerCrasher (line 38) | public final class VideoDetailPlayerCrasher {
    method VideoDetailPlayerCrasher (line 69) | private VideoDetailPlayerCrasher() {
    method getThemeWrapperContext (line 73) | private static Context getThemeWrapperContext(final Context context) {
    method onCrashThePlayer (line 81) | public static void onCrashThePlayer(
    method tryCrashPlayerWith (line 133) | private static void tryCrashPlayerWith(

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java
  class BaseListFragment (line 41) | public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
    method onAttach (line 62) | @Override
    method onCreate (line 71) | @Override
    method onDestroy (line 79) | @Override
    method onResume (line 89) | @Override
    method setUseDefaultStateSaving (line 111) | public void setUseDefaultStateSaving(final boolean useDefaultStateSavi...
    method generateSuffix (line 115) | @Override
    method getFocusedPosition (line 121) | private int getFocusedPosition() {
    method writeTo (line 132) | @Override
    method readFrom (line 142) | @Override
    method restoreFocus (line 154) | private void restoreFocus(final Integer position) {
    method onSaveInstanceState (line 169) | @Override
    method onRestoreInstanceState (line 178) | @Override
    method onStop (line 186) | @Override
    method onStart (line 192) | @Override
    method getListHeaderSupplier (line 202) | @Nullable
    method getListLayoutManager (line 207) | protected RecyclerView.LayoutManager getListLayoutManager() {
    method getGridLayoutManager (line 211) | protected RecyclerView.LayoutManager getGridLayoutManager() {
    method refreshItemViewMode (line 224) | private void refreshItemViewMode() {
    method initViews (line 232) | @Override
    method onItemSelected (line 247) | protected void onItemSelected(final InfoItem selectedItem) {
    method initListeners (line 253) | @Override
    method useNormalItemListScrollListener (line 297) | protected void useNormalItemListScrollListener() {
    method useInitialItemListLoadScrollListener (line 322) | protected void useInitialItemListLoadScrollListener() {
    class DefaultItemListOnScrolledDownListener (line 369) | class DefaultItemListOnScrolledDownListener extends OnScrollBelowItems...
      method onScrolledDown (line 370) | @Override
    method onStreamSelected (line 376) | private void onStreamSelected(final StreamInfoItem selectedItem) {
    method onScrollToBottom (line 383) | protected void onScrollToBottom() {
    method showInfoItemDialog (line 389) | protected void showInfoItemDialog(final StreamInfoItem item) {
    method onCreateOptionsMenu (line 401) | @Override
    method startLoading (line 420) | @Override
    method loadMoreItems (line 426) | protected abstract void loadMoreItems();
    method hasMoreItems (line 428) | protected abstract boolean hasMoreItems();
    method showLoading (line 434) | @Override
    method hideLoading (line 440) | @Override
    method showEmptyState (line 446) | @Override
    method showListFooter (line 453) | @Override
    method handleNextItems (line 462) | @Override
    method handleError (line 467) | @Override
    method onSharedPreferenceChanged (line 474) | @Override
    method getItemViewMode (line 486) | protected ItemViewMode getItemViewMode() {

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java
  class BaseListInfoFragment (line 35) | public abstract class BaseListInfoFragment<I extends InfoItem, L extends...
    method BaseListInfoFragment (line 50) | protected BaseListInfoFragment(final UserAction errorUserAction) {
    method initViews (line 54) | @Override
    method onPause (line 61) | @Override
    method onResume (line 69) | @Override
    method onDestroy (line 82) | @Override
    method writeTo (line 95) | @Override
    method readFrom (line 102) | @Override
    method doInitialLoadLogic (line 114) | @Override
    method loadResult (line 133) | protected abstract Single<L> loadResult(boolean forceLoad);
    method startLoading (line 135) | @Override
    method loadMoreItemsLogic (line 166) | protected abstract Single<ListExtractor.InfoItemsPage<I>> loadMoreItem...
    method loadMoreItems (line 168) | @Override
    method forbidDownwardFocusScroll (line 190) | private void forbidDownwardFocusScroll() {
    method allowDownwardFocusScroll (line 196) | private void allowDownwardFocusScroll() {
    method handleNextItems (line 202) | @Override
    method hasMoreItems (line 217) | @Override
    method handleResult (line 226) | @Override
    method showEmptyState (line 258) | @Override
    method setInitialData (line 276) | protected void setInitialData(final int sid, final String u, final Str...
    method dynamicallyShowErrorPanelOrSnackbar (line 282) | private void dynamicallyShowErrorPanelOrSnackbar(final ErrorInfo error...

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/ListViewContract.java
  type ListViewContract (line 5) | public interface ListViewContract<I, N> extends ViewContract<I> {
    method showListFooter (line 6) | void showListFooter(boolean show);
    method handleNextItems (line 8) | void handleNextItems(N result);

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java
  class ChannelAboutFragment (line 25) | public class ChannelAboutFragment extends BaseDescriptionFragment {
    method ChannelAboutFragment (line 29) | ChannelAboutFragment(@NonNull final ChannelInfo channelInfo) {
    method ChannelAboutFragment (line 33) | public ChannelAboutFragment() {
    method initViews (line 37) | @Override
    method getDescription (line 43) | @Nullable
    method getService (line 49) | @NonNull
    method getServiceId (line 55) | @Override
    method getStreamUrl (line 60) | @Nullable
    method getTags (line 66) | @NonNull
    method setupMetadata (line 72) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java
  class ChannelFragment (line 73) | public class ChannelFragment extends BaseStateFragment<ChannelInfo>
    method getInstance (line 105) | public static ChannelFragment getInstance(final int serviceId, final S...
    method setInitialData (line 112) | private void setInitialData(final int sid, final String u, final Strin...
    method onAttach (line 123) | @Override
    method onCreateView (line 129) | @Override
    method onViewCreated (line 137) | @Override
    method initViews (line 193) | @Override // called from onViewCreated in BaseFragment.onViewCreated
    method initListeners (line 209) | @Override
    method onDestroyView (line 230) | @Override
    method onDestroy (line 238) | @Override
    method monitorSubscription (line 253) | private void monitorSubscription(final ChannelInfo info) {
    method mapOnSubscribe (line 288) | private Function<Object, Object> mapOnSubscribe(final SubscriptionEnti...
    method mapOnUnsubscribe (line 295) | private Function<Object, Object> mapOnUnsubscribe(final SubscriptionEn...
    method updateSubscription (line 302) | private void updateSubscription(final ChannelInfo info) {
    method monitorSubscribeButton (line 322) | private Disposable monitorSubscribeButton(final Function<Object, Objec...
    method getSubscribeUpdateMonitor (line 342) | private Consumer<List<SubscriptionEntity>> getSubscribeUpdateMonitor(f...
    method updateSubscribeButton (line 378) | private void updateSubscribeButton(final boolean isSubscribed) {
    method updateRssButton (line 413) | private void updateRssButton() {
    method updateNotifyButton (line 420) | private void updateNotifyButton(@Nullable final SubscriptionEntity sub...
    method setNotify (line 436) | private void setNotify(final boolean isEnabled) {
    method showNotifySnackbar (line 452) | private void showNotifySnackbar() {
    method updateTabs (line 464) | private void updateTabs() {
    method generateSuffix (line 509) | @Override
    method writeTo (line 514) | @Override
    method readFrom (line 520) | @Override
    method onSaveInstanceState (line 526) | @Override
    method onRestoreInstanceState (line 534) | @Override
    method doInitialLoadLogic (line 545) | @Override
    method startLoading (line 554) | @Override
    method runWorker (line 567) | private void runWorker(final boolean forceLoad) {
    method showLoading (line 578) | @Override
    method handleResult (line 587) | @Override
    method showContentNotSupportedIfNeeded (line 643) | private void showContentNotSupportedIfNeeded() {

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java
  class ChannelTabFragment (line 39) | public class ChannelTabFragment extends BaseListInfoFragment<InfoItem, C...
    method getInstance (line 50) | @NonNull
    method ChannelTabFragment (line 61) | public ChannelTabFragment() {
    method onCreate (line 69) | @Override
    method onCreateView (line 75) | @Override
    method onDestroyView (line 82) | @Override
    method getListHeaderSupplier (line 88) | @Override
    method loadResult (line 98) | @Override
    method loadMoreItemsLogic (line 103) | @Override
    method setTitle (line 108) | @Override
    method handleResult (line 118) | @Override
    method getPlayQueue (line 160) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java
  class CommentRepliesFragment (line 39) | public final class CommentRepliesFragment
    method CommentRepliesFragment (line 54) | public CommentRepliesFragment() {
    method CommentRepliesFragment (line 58) | public CommentRepliesFragment(@NonNull final CommentsInfoItem comments...
    method onCreateView (line 65) | @Nullable
    method onDestroyView (line 73) | @Override
    method getListHeaderSupplier (line 79) | @Override
    method writeTo (line 124) | @Override
    method readFrom (line 130) | @Override
    method loadResult (line 141) | @Override
    method loadMoreItemsLogic (line 148) | @Override
    method getItemViewMode (line 161) | @Override
    method getCommentsInfoItem (line 169) | public CommentsInfoItem getCommentsInfoItem() {

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java
  class CommentRepliesInfo (line 9) | public final class CommentRepliesInfo extends ListInfo<CommentsInfoItem> {
    method CommentRepliesInfo (line 16) | public CommentRepliesInfo(final CommentsInfoItem comment, final String...

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java
  class CommentsFragment (line 27) | public class CommentsFragment extends BaseListInfoFragment<CommentsInfoI...
    method getInstance (line 32) | public static CommentsFragment getInstance(final int serviceId, final ...
    method CommentsFragment (line 39) | public CommentsFragment() {
    method initViews (line 43) | @Override
    method onCreateView (line 54) | @Override
    method onDestroy (line 61) | @Override
    method loadMoreItemsLogic (line 71) | @Override
    method loadResult (line 76) | @Override
    method handleResult (line 85) | @Override
    method setTitle (line 102) | @Override
    method onCreateOptionsMenu (line 105) | @Override
    method getItemViewMode (line 109) | @Override
    method scrollToComment (line 114) | public boolean scrollToComment(final CommentsInfoItem comment) {

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java
  class DefaultKioskFragment (line 13) | public class DefaultKioskFragment extends KioskFragment {
    method onCreate (line 15) | @Override
    method onResume (line 24) | @Override
    method updateSelectedDefaultKiosk (line 37) | private void updateSelectedDefaultKiosk() {

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java
  class KioskFragment (line 60) | public class KioskFragment extends BaseListInfoFragment<StreamInfoItem, ...
    method getInstance (line 71) | public static KioskFragment getInstance(final int serviceId) throws Ex...
    method getInstance (line 76) | public static KioskFragment getInstance(final int serviceId, final Str...
    method KioskFragment (line 88) | public KioskFragment() {
    method onCreate (line 96) | @Override
    method onResume (line 105) | @Override
    method onCreateView (line 120) | @Override
    method onCreateOptionsMenu (line 131) | @Override
    method loadResult (line 145) | @Override
    method loadMoreItemsLogic (line 151) | @Override
    method handleResult (line 160) | @Override
    method showEmptyState (line 168) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistControlViewHolder.java
  type PlaylistControlViewHolder (line 9) | public interface PlaylistControlViewHolder {
    method getPlayQueue (line 10) | PlayQueue getPlayQueue();

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java
  class PlaylistFragment (line 72) | public class PlaylistFragment extends BaseListInfoFragment<StreamInfoIte...
    method getInstance (line 94) | public static PlaylistFragment getInstance(final int serviceId, final ...
    method PlaylistFragment (line 101) | public PlaylistFragment() {
    method onCreate (line 109) | @Override
    method onCreateView (line 118) | @Override
    method getListHeaderSupplier (line 129) | @Override
    method initViews (line 138) | @Override
    method getPlayQueueStartingAt (line 147) | private PlayQueue getPlayQueueStartingAt(final StreamInfoItem infoItem) {
    method showInfoItemDialog (line 151) | @Override
    method onCreateOptionsMenu (line 170) | @Override
    method onDestroyView (line 184) | @Override
    method onDestroy (line 204) | @Override
    method loadMoreItemsLogic (line 222) | @Override
    method loadResult (line 227) | @Override
    method onOptionsItemSelected (line 232) | @Override
    method showLoading (line 267) | @Override
    method handleNextItems (line 277) | @Override
    method handleResult (line 283) | @Override
    method getPlayQueue (line 369) | public PlayQueue getPlayQueue() {
    method getPlayQueue (line 373) | private PlayQueue getPlayQueue(final int index) {
    method getUpdateProcessor (line 393) | private Flowable<Integer> getUpdateProcessor(
    method getPlaylistBookmarkSubscriber (line 409) | private Subscriber<List<PlaylistRemoteEntity>> getPlaylistBookmarkSubs...
    method setTitle (line 443) | @Override
    method onBookmarkClicked (line 451) | private void onBookmarkClicked() {
    method updateBookmarkButtons (line 479) | private void updateBookmarkButtons() {
    method setStreamCountAndOverallDuration (line 494) | private void setStreamCountAndOverallDuration(final List<StreamInfoIte...

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java
  class SearchFragment (line 91) | public class SearchFragment extends BaseListFragment<SearchInfo, ListExt...
    method getInstance (line 180) | public static SearchFragment getInstance(final int serviceId, final St...
    method setSearchOnResume (line 194) | private void setSearchOnResume() {
    method onAttach (line 202) | @Override
    method onCreateView (line 214) | @Override
    method onViewCreated (line 220) | @Override
    method updateService (line 237) | private void updateService() {
    method onStart (line 245) | @Override
    method onPause (line 255) | @Override
    method onResume (line 271) | @Override
    method onDestroyView (line 313) | @Override
    method onDestroy (line 324) | @Override
    method onActivityResult (line 336) | @Override
    method initViews (line 354) | @Override
    method writeTo (line 390) | @Override
    method readFrom (line 396) | @Override
    method onSaveInstanceState (line 402) | @Override
    method reloadContent (line 414) | @Override
    method onCreateOptionsMenu (line 434) | @Override
    method onOptionsItemSelected (line 483) | @Override
    method restoreFilterChecked (line 490) | private void restoreFilterChecked(final Menu menu, final int itemId) {
    method showSearchOnStart (line 505) | private void showSearchOnStart() {
    method initSearchListeners (line 531) | private void initSearchListeners() {
    method unsetSearchListeners (line 648) | private void unsetSearchListeners() {
    method showSuggestionsPanel (line 664) | private void showSuggestionsPanel() {
    method hideSuggestionsPanel (line 673) | private void hideSuggestionsPanel() {
    method showKeyboardSearch (line 682) | private void showKeyboardSearch() {
    method hideKeyboardSearch (line 689) | private void hideKeyboardSearch() {
    method showDeleteSuggestionDialog (line 697) | private void showDeleteSuggestionDialog(final SuggestionItem item) {
    method onBackPressed (line 721) | @Override
    method getLocalSuggestionsObservable (line 735) | private Observable<List<SuggestionItem>> getLocalSuggestionsObservable(
    method getRemoteSuggestionsObservable (line 746) | private Observable<List<SuggestionItem>> getRemoteSuggestionsObservabl...
    method initSuggestionObserver (line 759) | private void initSuggestionObserver() {
    method doInitialLoadLogic (line 818) | @Override
    method search (line 829) | private void search(@NonNull final String theSearchString,
    method startLoading (line 882) | @Override
    method loadMoreItems (line 900) | @Override
    method hasMoreItems (line 922) | @Override
    method onItemSelected (line 927) | @Override
    method onItemError (line 933) | private void onItemError(final Throwable exception) {
    method getOpenInBrowserUrlForErrors (line 943) | @Nullable
    method changeContentFilter (line 960) | private void changeContentFilter(final MenuItem item, final List<Strin...
    method setQuery (line 985) | private void setQuery(final int theServiceId,
    method getSearchEditString (line 995) | private String getSearchEditString() {
    method isSearchEditBlank (line 999) | private boolean isSearchEditBlank() {
    method handleSuggestions (line 1007) | public void handleSuggestions(@NonNull final List<SuggestionItem> sugg...
    method hideLoading (line 1027) | @Override
    method handleResult (line 1037) | @Override
    method handleSearchSuggestion (line 1076) | private void handleSearchSuggestion() {
    method handleNextItems (line 1107) | @Override
    method handleError (line 1134) | @Override
    method getSuggestionMovementFlags (line 1145) | public int getSuggestionMovementFlags(@NonNull final RecyclerView.View...
    method onSuggestionItemSwiped (line 1156) | public void onSuggestionItemSwiped(@NonNull final RecyclerView.ViewHol...

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java
  class RelatedItemsFragment (line 33) | public class RelatedItemsFragment extends BaseListInfoFragment<InfoItem,...
    method getInstance (line 45) | public static RelatedItemsFragment getInstance(final StreamInfo info) {
    method RelatedItemsFragment (line 51) | public RelatedItemsFragment() {
    method onCreateView (line 59) | @Override
    method onDestroyView (line 66) | @Override
    method getListHeaderSupplier (line 72) | @Override
    method loadMoreItemsLogic (line 92) | @Override
    method loadResult (line 101) | @Override
    method showLoading (line 106) | @Override
    method handleResult (line 114) | @Override
    method setTitle (line 129) | @Override
    method onCreateOptionsMenu (line 134) | @Override
    method setInitialData (line 140) | private void setInitialData(final StreamInfo info) {
    method onSaveInstanceState (line 147) | @Override
    method onRestoreInstanceState (line 153) | @Override
    method onSharedPreferenceChanged (line 162) | @Override
    method getItemViewMode (line 170) | @Override
    method showInfoItemDialog (line 180) | @Override

FILE: app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsInfo.java
  class RelatedItemsInfo (line 11) | public final class RelatedItemsInfo extends ListInfo<InfoItem> {
    method RelatedItemsInfo (line 17) | public RelatedItemsInfo(final StreamInfo info) {

FILE: app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java
  class InfoListAdapter (line 62) | public class InfoListAdapter extends RecyclerView.Adapter<RecyclerView.V...
    method InfoListAdapter (line 95) | public InfoListAdapter(final Context context) {
    method setOnStreamSelectedListener (line 102) | public void setOnStreamSelectedListener(final OnClickGesture<StreamInf...
    method setOnChannelSelectedListener (line 106) | public void setOnChannelSelectedListener(final OnClickGesture<ChannelI...
    method setOnPlaylistSelectedListener (line 110) | public void setOnPlaylistSelectedListener(final OnClickGesture<Playlis...
    method setOnCommentsSelectedListener (line 114) | public void setOnCommentsSelectedListener(final OnClickGesture<Comment...
    method setUseMiniVariant (line 118) | public void setUseMiniVariant(final boolean useMiniVariant) {
    method setItemViewMode (line 122) | public void setItemViewMode(final ItemViewMode itemViewMode) {
    method addInfoItemList (line 126) | public void addInfoItemList(@Nullable final List<? extends InfoItem> d...
    method clearStreamItemList (line 157) | public void clearStreamItemList() {
    method setHeaderSupplier (line 165) | public void setHeaderSupplier(@Nullable final Supplier<View> headerSup...
    method hasHeader (line 173) | protected boolean hasHeader() {
    method showFooter (line 177) | public void showFooter(final boolean show) {
    method sizeConsideringHeaderOffset (line 193) | private int sizeConsideringHeaderOffset() {
    method getItemsList (line 201) | public List<InfoItem> getItemsList() {
    method getItemCount (line 205) | @Override
    method getItemViewType (line 224) | @SuppressWarnings("FinalParameters")
    method onCreateViewHolder (line 278) | @NonNull
    method onBindViewHolder (line 328) | @Override
    method getSpanSizeLookup (line 343) | public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int sp...
    class HFHolder (line 353) | static class HFHolder extends RecyclerView.ViewHolder {
      method HFHolder (line 354) | HFHolder(final View v) {

FILE: app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java
  class InfoItemDialog (line 39) | public final class InfoItemDialog {
    method InfoItemDialog (line 50) | private InfoItemDialog(@NonNull final Activity activity,
    method show (line 85) | public void show() {
    class Builder (line 97) | public static class Builder {
      method Builder (line 139) | public Builder(final Activity activity,
      method Builder (line 186) | public Builder(final Activity activity,
      method addEntry (line 213) | public Builder addEntry(@NonNull final StreamDialogDefaultEntry entr...
      method addAllEntries (line 223) | public Builder addAllEntries(@NonNull final StreamDialogDefaultEntry...
      method setAction (line 237) | public Builder setAction(@NonNull final StreamDialogDefaultEntry entry,
      method addEnqueueEntriesIfNeeded (line 254) | public Builder addEnqueueEntriesIfNeeded() {
      method addStartHereEntries (line 272) | public Builder addStartHereEntries() {
      method addMarkAsWatchedEntryIfNeeded (line 285) | public Builder addMarkAsWatchedEntryIfNeeded() {
      method addPlayWithKodiEntryIfNeeded (line 299) | public Builder addPlayWithKodiEntryIfNeeded() {
      method addDefaultBeginningEntries (line 313) | public Builder addDefaultBeginningEntries() {
      method addDefaultEndEntries (line 323) | public Builder addDefaultEndEntries() {
      method create (line 340) | public InfoItemDialog create() {
      method reportErrorDuringInitialization (line 347) | public static void reportErrorDuringInitialization(final Throwable t...

FILE: app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java
  type StreamDialogDefaultEntry (line 46) | public enum StreamDialogDefaultEntry {
    method StreamDialogDefaultEntry (line 159) | StreamDialogDefaultEntry(@StringRes final int resource,
    method toStreamDialogEntry (line 165) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogEntry.java
  class StreamDialogEntry (line 11) | public class StreamDialogEntry {
    method StreamDialogEntry (line 18) | public StreamDialogEntry(@StringRes final int resource,
    method getString (line 24) | public String getString(@NonNull final Context context) {
    type StreamDialogEntryAction (line 28) | public interface StreamDialogEntryAction {
      method onClick (line 29) | void onClick(Fragment fragment, StreamInfoItem infoItem);

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java
  class ChannelCardInfoItemHolder (line 10) | public class ChannelCardInfoItemHolder extends ChannelMiniInfoItemHolder {
    method ChannelCardInfoItemHolder (line 11) | public ChannelCardInfoItemHolder(final InfoItemBuilder infoItemBuilder,
    method getDescriptionMaxLineCount (line 16) | @Override

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelGridInfoItemHolder.java
  class ChannelGridInfoItemHolder (line 8) | public class ChannelGridInfoItemHolder extends ChannelMiniInfoItemHolder {
    method ChannelGridInfoItemHolder (line 9) | public ChannelGridInfoItemHolder(final InfoItemBuilder infoItemBuilder,

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java
  class ChannelInfoItemHolder (line 28) | public class ChannelInfoItemHolder extends ChannelMiniInfoItemHolder {
    method ChannelInfoItemHolder (line 29) | public ChannelInfoItemHolder(final InfoItemBuilder infoItemBuilder, fi...

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java
  class ChannelMiniInfoItemHolder (line 19) | public class ChannelMiniInfoItemHolder extends InfoItemHolder {
    method ChannelMiniInfoItemHolder (line 25) | ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final...
    method ChannelMiniInfoItemHolder (line 35) | public ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,
    method updateFromItem (line 40) | @Override
    method getDescriptionMaxLineCount (line 95) | protected int getDescriptionMaxLineCount(@Nullable final String conten...
    method getDetailLine (line 99) | @Nullable

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java
  class CommentInfoItemHolder (line 34) | public class CommentInfoItemHolder extends InfoItemHolder {
    method CommentInfoItemHolder (line 53) | public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder,
    method updateFromItem (line 82) | @Override
    method openCommentAuthor (line 175) | private void openCommentAuthor(@NonNull final CommentsInfoItem item) {
    method openCommentReplies (line 180) | private void openCommentReplies(@NonNull final CommentsInfoItem item) {
    method allowLinkFocus (line 185) | private void allowLinkFocus() {
    method denyLinkFocus (line 189) | private void denyLinkFocus() {
    method shouldFocusLinks (line 193) | private boolean shouldFocusLinks() {
    method determineMovementMethod (line 203) | private void determineMovementMethod() {

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java
  class InfoItemHolder (line 32) | public abstract class InfoItemHolder extends RecyclerView.ViewHolder {
    method InfoItemHolder (line 35) | public InfoItemHolder(final InfoItemBuilder infoItemBuilder, final int...
    method updateFromItem (line 41) | public abstract void updateFromItem(InfoItem infoItem,
    method updateState (line 44) | public void updateState(final InfoItem infoItem,

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java
  class PlaylistCardInfoItemHolder (line 11) | public class PlaylistCardInfoItemHolder extends PlaylistMiniInfoItemHold...
    method PlaylistCardInfoItemHolder (line 13) | public PlaylistCardInfoItemHolder(final InfoItemBuilder infoItemBuilder,

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistGridInfoItemHolder.java
  class PlaylistGridInfoItemHolder (line 8) | public class PlaylistGridInfoItemHolder extends PlaylistMiniInfoItemHold...
    method PlaylistGridInfoItemHolder (line 9) | public PlaylistGridInfoItemHolder(final InfoItemBuilder infoItemBuilder,

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistInfoItemHolder.java
  class PlaylistInfoItemHolder (line 8) | public class PlaylistInfoItemHolder extends PlaylistMiniInfoItemHolder {
    method PlaylistInfoItemHolder (line 9) | public PlaylistInfoItemHolder(final InfoItemBuilder infoItemBuilder, f...

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java
  class PlaylistMiniInfoItemHolder (line 15) | public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
    method PlaylistMiniInfoItemHolder (line 21) | public PlaylistMiniInfoItemHolder(final InfoItemBuilder infoItemBuilde...
    method PlaylistMiniInfoItemHolder (line 31) | public PlaylistMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,
    method updateFromItem (line 36) | @Override

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java
  class StreamCardInfoItemHolder (line 11) | public class StreamCardInfoItemHolder extends StreamInfoItemHolder {
    method StreamCardInfoItemHolder (line 13) | public StreamCardInfoItemHolder(final InfoItemBuilder infoItemBuilder,...

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java
  class StreamGridInfoItemHolder (line 8) | public class StreamGridInfoItemHolder extends StreamInfoItemHolder {
    method StreamGridInfoItemHolder (line 9) | public StreamGridInfoItemHolder(final InfoItemBuilder infoItemBuilder,...

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java
  class StreamInfoItemHolder (line 39) | public class StreamInfoItemHolder extends StreamMiniInfoItemHolder {
    method StreamInfoItemHolder (line 42) | public StreamInfoItemHolder(final InfoItemBuilder infoItemBuilder, fin...
    method StreamInfoItemHolder (line 46) | public StreamInfoItemHolder(final InfoItemBuilder infoItemBuilder, fin...
    method updateFromItem (line 52) | @Override
    method getStreamInfoDetailLine (line 65) | private String getStreamInfoDetailLine(final StreamInfoItem infoItem) {

FILE: app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java
  class StreamMiniInfoItemHolder (line 25) | public class StreamMiniInfoItemHolder extends InfoItemHolder {
    method StreamMiniInfoItemHolder (line 32) | StreamMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ...
    method StreamMiniInfoItemHolder (line 43) | public StreamMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,...
    method updateFromItem (line 47) | @Override
    method updateState (line 114) | @Override
    method enableLongClick (line 141) | private void enableLongClick(final StreamInfoItem item) {
    method disableLongClick (line 151) | private void disableLongClick() {

FILE: app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java
  class BaseLocalListFragment (line 45) | public abstract class BaseLocalListFragment<I, N> extends BaseStateFragm...
    method onCreate (line 63) | @Override
    method onDestroy (line 71) | @Override
    method onResume (line 78) | @Override
    method refreshItemViewMode (line 92) | private void refreshItemViewMode() {
    method getListHeaderSupplier (line 104) | @Nullable
    method getListFooter (line 109) | protected ViewBinding getListFooter() {
    method getGridLayoutManager (line 113) | protected RecyclerView.LayoutManager getGridLayoutManager() {
    method getListLayoutManager (line 123) | protected RecyclerView.LayoutManager getListLayoutManager() {
    method initViews (line 127) | @Override
    method initListeners (line 146) | @Override
    method onCreateOptionsMenu (line 155) | @Override
    method onDestroyView (line 176) | @Override
    method startLoading (line 187) | @Override
    method showLoading (line 193) | @Override
    method hideLoading (line 201) | @Override
    method showEmptyState (line 209) | @Override
    method showListFooter (line 215) | @Deprecated(since = "Calling this method with `true` may cause crashes...
    method handleNextItems (line 229) | @Override
    method resetFragment (line 238) | protected void resetFragment() {
    method handleError (line 244) | @Override
    method onSharedPreferenceChanged (line 256) | @Override

FILE: app/src/main/java/org/schabi/newpipe/local/HeaderFooterHolder.java
  class HeaderFooterHolder (line 7) | public class HeaderFooterHolder extends RecyclerView.ViewHolder {
    method HeaderFooterHolder (line 10) | public HeaderFooterHolder(final View v) {

FILE: app/src/main/java/org/schabi/newpipe/local/LocalItemBuilder.java
  class LocalItemBuilder (line 28) | public class LocalItemBuilder {
    method LocalItemBuilder (line 33) | public LocalItemBuilder(final Context context) {
    method getContext (line 37) | public Context getContext() {
    method getOnItemSelectedListener (line 41) | public OnClickGesture<LocalItem> getOnItemSelectedListener() {
    method setOnItemSelectedListener (line 45) | public void setOnItemSelectedListener(final OnClickGesture<LocalItem> ...

FILE: app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java
  class LocalItemListAdapter (line 62) | public class LocalItemListAdapter extends RecyclerView.Adapter<RecyclerV...
    method LocalItemListAdapter (line 97) | public LocalItemListAdapter(final Context context) {
    method setSelectedListener (line 106) | public void setSelectedListener(final OnClickGesture<LocalItem> listen...
    method unsetSelectedListener (line 110) | public void unsetSelectedListener() {
    method addItems (line 114) | public void addItems(@Nullable final List<? extends LocalItem> data) {
    method removeItem (line 145) | public void removeItem(final LocalItem data) {
    method swapItems (line 162) | public boolean swapItems(final int fromAdapterPosition, final int toAd...
    method clearStreamItemList (line 178) | public void clearStreamItemList() {
    method setItemViewMode (line 186) | public void setItemViewMode(final ItemViewMode itemViewMode) {
    method setUseItemHandle (line 190) | public void setUseItemHandle(final boolean useItemHandle) {
    method setHeaderSupplier (line 194) | public void setHeaderSupplier(@Nullable final Supplier<View> headerSup...
    method setFooter (line 202) | public void setFooter(final View view) {
    method hasHeader (line 206) | protected boolean hasHeader() {
    method showFooter (line 210) | @Deprecated(since = "Calling this method with `true` may cause crashes...
    method adapterOffsetWithoutHeader (line 230) | private int adapterOffsetWithoutHeader(final int offset) {
    method sizeConsideringHeader (line 234) | private int sizeConsideringHeader() {
    method getItemsList (line 238) | public ArrayList<LocalItem> getItemsList() {
    method getItemCount (line 242) | @Override
    method getItemViewType (line 261) | @SuppressWarnings("FinalParameters")
    method onCreateViewHolder (line 321) | @NonNull
    method onBindViewHolder (line 368) | @SuppressWarnings("FinalParameters")
    method onBindViewHolder (line 393) | @Override
    method getSpanSizeLookup (line 411) | public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int sp...

FILE: app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java
  class BookmarkFragment (line 55) | public final class BookmarkFragment extends BaseLocalListFragment<List<P...
    method onCreate (line 81) | @Override
    method onCreateView (line 98) | @Nullable
    method onResume (line 110) | @Override
    method initViews (line 122) | @Override
    method initListeners (line 129) | @Override
    method startLoading (line 179) | @Override
    method onPause (line 199) | @Override
    method onDestroyView (line 208) | @Override
    method onDestroy (line 223) | @Override
    method getPlaylistsSubscriber (line 247) | private Subscriber<List<PlaylistLocalItem>> getPlaylistsSubscriber() {
    method handleResult (line 284) | @Override
    method resetFragment (line 307) | @Override
    method changeLocalPlaylistName (line 319) | private void changeLocalPlaylistName(final long id, final String name) {
    method deleteItem (line 338) | private void deleteItem(final PlaylistLocalItem item) {
    method saveImmediate (line 358) | @Override
    method getItemTouchCallback (line 420) | private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
    method showRemoteDeleteDialog (line 491) | private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) {
    method showLocalDialog (line 495) | private void showLocalDialog(final PlaylistMetadataEntry selectedItem) {
    method showRenameDialog (line 529) | private void showRenameDialog(final PlaylistMetadataEntry selectedItem) {
    method showDeleteDialog (line 546) | private void showDeleteDialog(final String name, final PlaylistLocalIt...

FILE: app/src/main/java/org/schabi/newpipe/local/bookmark/MergedPlaylistManager.java
  class MergedPlaylistManager (line 19) | public final class MergedPlaylistManager {
    method MergedPlaylistManager (line 21) | private MergedPlaylistManager() {
    method getMergedOrderedPlaylists (line 24) | public static Flowable<List<PlaylistLocalItem>> getMergedOrderedPlayli...
    method merge (line 42) | public static List<PlaylistLocalItem> merge(
    method addItem (line 75) | private static void addItem(final List<PlaylistLocalItem> result,
    method addItemsWithSameIndex (line 88) | private static void addItemsWithSameIndex(final List<PlaylistLocalItem...

FILE: app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java
  class PlaylistAppendDialog (line 29) | public final class PlaylistAppendDialog extends PlaylistDialog {
    method newInstance (line 44) | public static PlaylistAppendDialog newInstance(final List<StreamEntity...
    method onCreateView (line 54) | @Override
    method onViewCreated (line 60) | @Override
    method onDestroyView (line 95) | @Override
    method openCreatePlaylistDialog (line 113) | public void openCreatePlaylistDialog() {
    method onPlaylistsReceived (line 128) | private void onPlaylistsReceived(@NonNull final List<PlaylistDuplicate...
    method anyPlaylistContainsDuplicates (line 140) | private boolean anyPlaylistContainsDuplicates(final List<PlaylistDupli...
    method onPlaylistSelected (line 145) | private void onPlaylistSelected(@NonNull final LocalPlaylistManager ma...

FILE: app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java
  class PlaylistCreationDialog (line 23) | public final class PlaylistCreationDialog extends PlaylistDialog {
    method newInstance (line 31) | public static PlaylistCreationDialog newInstance(final List<StreamEnti...
    method onCreateDialog (line 41) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistDialog.java
  class PlaylistDialog (line 30) | public abstract class PlaylistDialog extends DialogFragment implements S...
    method onCreate (line 43) | @Override
    method onDestroy (line 49) | @Override
    method getStreamEntities (line 55) | public List<StreamEntity> getStreamEntities() {
    method onCreateDialog (line 59) | @NonNull
    method onDismiss (line 71) | @Override
    method generateSuffix (line 83) | @Override
    method writeTo (line 89) | @Override
    method readFrom (line 94) | @Override
    method onSaveInstanceState (line 100) | @Override
    method getOnDismissListener (line 113) | @Nullable
    method setOnDismissListener (line 118) | public void setOnDismissListener(
    method setStreamEntities (line 124) | protected void setStreamEntities(final List<StreamEntity> streamEntiti...
    method createCorrespondingDialog (line 141) | public static Disposable createCorrespondingDialog(
    method showForPlayQueue (line 165) | public static Disposable showForPlayQueue(

FILE: app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java
  class HistoryRecordManager (line 61) | public class HistoryRecordManager {
    method HistoryRecordManager (line 71) | public HistoryRecordManager(final Context context) {
    method markAsWatched (line 94) | public Maybe<Long> markAsWatched(final StreamInfoItem info) {
    method onViewed (line 137) | public Maybe<Long> onViewed(final StreamInfo info) {
    method deleteStreamHistoryAndState (line 159) | public Completable deleteStreamHistoryAndState(final long streamId) {
    method deleteWholeStreamHistory (line 166) | public Single<Integer> deleteWholeStreamHistory() {
    method deleteCompleteStreamStateHistory (line 171) | public Single<Integer> deleteCompleteStreamStateHistory() {
    method getStreamHistorySortedById (line 176) | public Flowable<List<StreamHistoryEntry>> getStreamHistorySortedById() {
    method getStreamStatistics (line 180) | public Flowable<List<StreamStatisticsEntry>> getStreamStatistics() {
    method isStreamHistoryEnabled (line 184) | private boolean isStreamHistoryEnabled() {
    method onSearched (line 192) | public Maybe<Long> onSearched(final int serviceId, final String search) {
    method deleteSearchHistory (line 211) | public Single<Integer> deleteSearchHistory(final String search) {
    method deleteCompleteSearchHistory (line 216) | public Single<Integer> deleteCompleteSearchHistory() {
    method getRelatedSearches (line 221) | public Flowable<List<String>> getRelatedSearches(final String query,
    method isSearchHistoryEnabled (line 229) | private boolean isSearchHistoryEnabled() {
    method loadStreamState (line 237) | public Maybe<StreamStateEntity> loadStreamState(final PlayQueueItem qu...
    method loadStreamState (line 247) | public Maybe<StreamStateEntity> loadStreamState(final StreamInfo info) {
    method saveStreamState (line 256) | public Completable saveStreamState(@NonNull final StreamInfo info, fin...
    method loadStreamState (line 266) | public Single<StreamStateEntity[]> loadStreamState(final InfoItem info) {
    method loadLocalStreamStateBatch (line 282) | public Single<List<StreamStateEntity>> loadLocalStreamStateBatch(
    method removeOrphanedRecords (line 314) | public Single<Integer> removeOrphanedRecords() {

FILE: app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java
  class StatisticsPlaylistFragment (line 53) | public class StatisticsPlaylistFragment
    method processResult (line 68) | private List<StreamStatisticsEntry> processResult(final List<StreamSta...
    method onCreate (line 88) | @Override
    method onCreateView (line 94) | @Override
    method onResume (line 101) | @Override
    method onCreateOptionsMenu (line 109) | @Override
    method initViews (line 120) | @Override
    method getListHeaderSupplier (line 128) | @Override
    method initListeners (line 137) | @Override
    method onOptionsItemSelected (line 161) | @Override
    method startLoading (line 176) | @Override
    method onPause (line 188) | @Override
    method onDestroyView (line 194) | @Override
    method onDestroy (line 211) | @Override
    method getHistoryObserver (line 222) | private Subscriber<List<StreamStatisticsEntry>> getHistoryObserver() {
    method handleResult (line 255) | @Override
    method resetFragment (line 288) | @Override
    method toggleSortMode (line 300) | private void toggleSortMode() {
    method getPlayQueueStartingAt (line 316) | private PlayQueue getPlayQueueStartingAt(final StreamStatisticsEntry i...
    method showInfoItemDialog (line 320) | private void showInfoItemDialog(final StreamStatisticsEntry item) {
    method deleteEntry (line 342) | private void deleteEntry(final int index) {
    method getPlayQueue (line 367) | @Override
    method getPlayQueue (line 372) | private PlayQueue getPlayQueue(final int index) {
    type StatisticSortMode (line 387) | private enum StatisticSortMode {

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java
  class LocalBookmarkPlaylistItemHolder (line 15) | public class LocalBookmarkPlaylistItemHolder extends LocalPlaylistItemHo...
    method LocalBookmarkPlaylistItemHolder (line 18) | public LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItem...
    method LocalBookmarkPlaylistItemHolder (line 23) | LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder...
    method updateFromItem (line 29) | @Override
    method getOnTouchListener (line 43) | private View.OnTouchListener getOnTouchListener(final PlaylistMetadata...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java
  class LocalItemHolder (line 34) | public abstract class LocalItemHolder extends RecyclerView.ViewHolder {
    method LocalItemHolder (line 37) | public LocalItemHolder(final LocalItemBuilder itemBuilder, final int l...
    method updateFromItem (line 43) | public abstract void updateFromItem(LocalItem item, HistoryRecordManag...
    method updateState (line 46) | public void updateState(final LocalItem localItem,

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java
  class LocalPlaylistCardItemHolder (line 11) | public class LocalPlaylistCardItemHolder extends LocalPlaylistItemHolder {
    method LocalPlaylistCardItemHolder (line 13) | public LocalPlaylistCardItemHolder(final LocalItemBuilder infoItemBuil...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistGridItemHolder.java
  class LocalPlaylistGridItemHolder (line 8) | public class LocalPlaylistGridItemHolder extends LocalPlaylistItemHolder {
    method LocalPlaylistGridItemHolder (line 9) | public LocalPlaylistGridItemHolder(final LocalItemBuilder infoItemBuil...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java
  class LocalPlaylistItemHolder (line 16) | public class LocalPlaylistItemHolder extends PlaylistItemHolder {
    method LocalPlaylistItemHolder (line 20) | public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder,...
    method LocalPlaylistItemHolder (line 24) | LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ...
    method updateFromItem (line 29) | @Override

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java
  class LocalPlaylistStreamCardItemHolder (line 11) | public class LocalPlaylistStreamCardItemHolder extends LocalPlaylistStre...
    method LocalPlaylistStreamCardItemHolder (line 13) | public LocalPlaylistStreamCardItemHolder(final LocalItemBuilder infoIt...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamGridItemHolder.java
  class LocalPlaylistStreamGridItemHolder (line 8) | public class LocalPlaylistStreamGridItemHolder extends LocalPlaylistStre...
    method LocalPlaylistStreamGridItemHolder (line 9) | public LocalPlaylistStreamGridItemHolder(final LocalItemBuilder infoIt...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java
  class LocalPlaylistStreamItemHolder (line 26) | public class LocalPlaylistStreamItemHolder extends LocalItemHolder {
    method LocalPlaylistStreamItemHolder (line 34) | LocalPlaylistStreamItemHolder(final LocalItemBuilder infoItemBuilder, ...
    method LocalPlaylistStreamItemHolder (line 46) | public LocalPlaylistStreamItemHolder(final LocalItemBuilder infoItemBu...
    method updateFromItem (line 51) | @Override
    method updateState (line 106) | @Override
    method getOnTouchListener (line 130) | private View.OnTouchListener getOnTouchListener(final PlaylistStreamEn...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java
  class LocalStatisticStreamCardItemHolder (line 8) | public class LocalStatisticStreamCardItemHolder extends LocalStatisticSt...
    method LocalStatisticStreamCardItemHolder (line 9) | public LocalStatisticStreamCardItemHolder(final LocalItemBuilder infoI...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamGridItemHolder.java
  class LocalStatisticStreamGridItemHolder (line 8) | public class LocalStatisticStreamGridItemHolder extends LocalStatisticSt...
    method LocalStatisticStreamGridItemHolder (line 9) | public LocalStatisticStreamGridItemHolder(final LocalItemBuilder infoI...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java
  class LocalStatisticStreamItemHolder (line 46) | public class LocalStatisticStreamItemHolder extends LocalItemHolder {
    method LocalStatisticStreamItemHolder (line 55) | public LocalStatisticStreamItemHolder(final LocalItemBuilder itemBuilder,
    method LocalStatisticStreamItemHolder (line 60) | LocalStatisticStreamItemHolder(final LocalItemBuilder infoItemBuilder,...
    method getStreamInfoDetailLine (line 72) | private String getStreamInfoDetailLine(final StreamStatisticsEntry entry,
    method updateFromItem (line 82) | @Override
    method updateState (line 138) | @Override

FILE: app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java
  class PlaylistItemHolder (line 14) | public abstract class PlaylistItemHolder extends LocalItemHolder {
    method PlaylistItemHolder (line 20) | public PlaylistItemHolder(final LocalItemBuilder infoItemBuilder, fina...
    method PlaylistItemHolder (line 30) | public PlaylistItemHolder(final LocalItemBuilder infoItemBuilder, fina...
    method updateFromItem (line 34) | @Override

FILE: app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java
  class RemoteBookmarkPlaylistItemHolder (line 15) | public class RemoteBookmarkPlaylistItemHolder extends RemotePlaylistItem...
    method RemoteBookmarkPlaylistItemHolder (line 18) | public RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoIte...
    method RemoteBookmarkPlaylistItemHolder (line 23) | RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilde...
    method updateFromItem (line 29) | @Override
    method getOnTouchListener (line 43) | private View.OnTouchListener getOnTouchListener(final PlaylistRemoteEn...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java
  class RemotePlaylistCardItemHolder (line 11) | public class RemotePlaylistCardItemHolder extends RemotePlaylistItemHold...
    method RemotePlaylistCardItemHolder (line 13) | public RemotePlaylistCardItemHolder(final LocalItemBuilder infoItemBui...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistGridItemHolder.java
  class RemotePlaylistGridItemHolder (line 8) | public class RemotePlaylistGridItemHolder extends RemotePlaylistItemHold...
    method RemotePlaylistGridItemHolder (line 9) | public RemotePlaylistGridItemHolder(final LocalItemBuilder infoItemBui...

FILE: app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java
  class RemotePlaylistItemHolder (line 16) | public class RemotePlaylistItemHolder extends PlaylistItemHolder {
    method RemotePlaylistItemHolder (line 18) | public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder,
    method RemotePlaylistItemHolder (line 23) | RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final...
    method updateFromItem (line 28) | @Override

FILE: app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java
  class LocalPlaylistFragment (line 83) | public class LocalPlaylistFragment extends BaseLocalListFragment<List<Pl...
    method getInstance (line 118) | public static LocalPlaylistFragment getInstance(final long playlistId,...
    method onCreate (line 128) | @Override
    method onCreateView (line 139) | @Override
    method setTitle (line 150) | @Override
    method initViews (line 159) | @Override
    method getListHeaderSupplier (line 165) | @Override
    method initListeners (line 176) | @Override
    method showLoading (line 216) | @Override
    method hideLoading (line 225) | @Override
    method startLoading (line 234) | @Override
    method onPause (line 259) | @Override
    method onCreateOptionsMenu (line 268) | @Override
    method onDestroyView (line 279) | @Override
    method onDestroy (line 302) | @Override
    method getPlaylistObserver (line 326) | private Subscriber<List<PlaylistStreamEntry>> getPlaylistObserver() {
    method onOptionsItemSelected (line 365) | @Override
    method sharePlaylist (line 395) | private void sharePlaylist(final PlayListShareMode shareMode) {
    method removeWatchedStreams (line 423) | public void removeWatchedStreams(final boolean removePartiallyWatched) {
    method handleResult (line 500) | @Override
    method resetFragment (line 530) | @Override
    method createRenameDialog (line 542) | private void createRenameDialog() {
    method changePlaylistName (line 563) | private void changePlaylistName(final String title) {
    method changeThumbnailStreamId (line 584) | private void changeThumbnailStreamId(final long thumbnailStreamId, fin...
    method updateThumbnailUrl (line 608) | private void updateThumbnailUrl() {
    method openRemoveDuplicatesDialog (line 625) | private void openRemoveDuplicatesDialog() {
    method removeDuplicatesInPlaylist (line 635) | private void removeDuplicatesInPlaylist() {
    method deleteItem (line 661) | private void deleteItem(final PlaylistStreamEntry item) {
    method saveImmediate (line 681) | @Override
    method getItemTouchCallback (line 721) | private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
    method getPlayQueueStartingAt (line 787) | private PlayQueue getPlayQueueStartingAt(final PlaylistStreamEntry inf...
    method showInfoItemDialog (line 791) | protected void showInfoItemDialog(final PlaylistStreamEntry item) {
    method setInitialData (line 827) | private void setInitialData(final long pid, final String title) {
    method setStreamCountAndOverallDuration (line 832) | private void setStreamCountAndOverallDuration(final ArrayList<LocalIte...
    method getPlayQueue (line 850) | @Override
    method getPlayQueue (line 855) | private PlayQueue getPlayQueue(final int index) {
    method createShareConfirmationDialog (line 875) | private void createShareConfirmationDialog() {
    method openRemoveWatchedConfirmationDialog (line 895) | private void openRemoveWatchedConfirmationDialog() {
    method setTabsPagerAdapter (line 920) | public void setTabsPagerAdapter(

FILE: app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java
  class LocalPlaylistManager (line 24) | public class LocalPlaylistManager {
    method LocalPlaylistManager (line 32) | public LocalPlaylistManager(final AppDatabase db) {
    method createPlaylist (line 39) | public Maybe<List<Long>> createPlaylist(final String name, final List<...
    method appendToPlaylist (line 59) | public Maybe<List<Long>> appendToPlaylist(final long playlistId,
    method insertJoinEntities (line 70) | private List<Long> insertJoinEntities(final long playlistId, final Lis...
    method updateJoin (line 82) | public Completable updateJoin(final long playlistId, final List<Long> ...
    method updatePlaylists (line 94) | public Completable updatePlaylists(final List<PlaylistMetadataEntry> u...
    method getDistinctPlaylistStreams (line 110) | public Flowable<List<PlaylistStreamEntry>> getDistinctPlaylistStreams(...
    method getPlaylistDuplicates (line 122) | public Flowable<List<PlaylistDuplicatesEntry>> getPlaylistDuplicates(f...
    method getPlaylists (line 127) | public Flowable<List<PlaylistMetadataEntry>> getPlaylists() {
    method getPlaylistStreams (line 131) | public Flowable<List<PlaylistStreamEntry>> getPlaylistStreams(final lo...
    method renamePlaylist (line 135) | public Maybe<Integer> renamePlaylist(final long playlistId, final Stri...
    method changePlaylistThumbnail (line 139) | public Maybe<Integer> changePlaylistThumbnail(final long playlistId,
    method getPlaylistThumbnailStreamId (line 145) | public long getPlaylistThumbnailStreamId(final long playlistId) {
    method getIsPlaylistThumbnailPermanent (line 149) | public boolean getIsPlaylistThumbnailPermanent(final long playlistId) {
    method getAutomaticPlaylistThumbnailStreamId (line 154) | public long getAutomaticPlaylistThumbnailStreamId(final long playlistI...
    method modifyPlaylist (line 163) | private Maybe<Integer> modifyPlaylist(final long playlistId,
    method hasPlaylists (line 183) | public Maybe<Boolean> hasPlaylists() {

FILE: app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java
  class ImportConfirmationDialog (line 25) | public class ImportConfirmationDialog extends DialogFragment {
    method show (line 28) | public static void show(@NonNull final Fragment fragment, final Subscr...
    method onCreateDialog (line 36) | @NonNull
    method onCreate (line 66) | @Override
    method onSaveInstanceState (line 73) | @Override

FILE: app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java
  class SubscriptionsImportFragment (line 45) | public class SubscriptionsImportFragment extends BaseFragment {
    method getInstance (line 66) | public static SubscriptionsImportFragment getInstance(final int servic...
    method setInitialData (line 72) | private void setInitialData(final int serviceId) {
    method onCreate (line 80) | @Override
    method onResume (line 95) | @Override
    method onCreateView (line 101) | @Nullable
    method initViews (line 113) | @Override
    method initListeners (line 149) | @Override
    method onImportClicked (line 155) | private void onImportClicked() {
    method onImportUrl (line 166) | public void onImportUrl(final String value) {
    method onImportFile (line 171) | public void onImportFile() {
    method requestImportFileResult (line 182) | private void requestImportFileResult(final ActivityResult result) {
    method setupServiceVariables (line 194) | private void setupServiceVariables() {
    method setInfoText (line 212) | private void setInfoText(final String infoString) {

FILE: app/src/main/java/org/schabi/newpipe/player/AudioServiceLeakFix.java
  class AudioServiceLeakFix (line 13) | public class AudioServiceLeakFix extends ContextWrapper {
    method AudioServiceLeakFix (line 14) | AudioServiceLeakFix(final Context base) {
    method preventLeakOf (line 18) | public static ContextWrapper preventLeakOf(final Context base) {
    method getSystemService (line 22) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java
  class PlayQueueActivity (line 53) | public final class PlayQueueActivity extends AppCompatActivity
    method onCreate (line 84) | @Override
    method onCreateOptionsMenu (line 102) | @Override
    method onPrepareOptionsMenu (line 117) | @Override
    method onOptionsItemSelected (line 128) | @Override
    method onDestroy (line 173) | @Override
    method bind (line 183) | private void bind() {
    method unbind (line 195) | private void unbind() {
    method getServiceConnection (line 213) | private ServiceConnection getServiceConnection() {
    method buildComponents (line 245) | private void buildComponents() {
    method buildQueue (line 252) | private void buildQueue() {
    method buildMetadata (line 263) | private void buildMetadata() {
    method buildSeekBar (line 269) | private void buildSeekBar() {
    method buildControls (line 274) | private void buildControls() {
    method getQueueScrollListener (line 288) | private OnScrollBelowItemsListener getQueueScrollListener() {
    method getItemTouchCallback (line 302) | private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
    method getOnSelectedListener (line 320) | private PlayQueueItemBuilder.OnSelectedListener getOnSelectedListener() {
    method scrollToSelected (line 346) | private void scrollToSelected() {
    method onClick (line 373) | @Override
    method openPlaybackParameterDialog (line 404) | private void openPlaybackParameterDialog() {
    method onPlaybackParameterChanged (line 412) | @Override
    method onProgressChanged (line 425) | @Override
    method onStartTrackingTouch (line 435) | @Override
    method onStopTrackingTouch (line 441) | @Override
    method onQueueUpdate (line 454) | @Override
    method onPlaybackUpdate (line 465) | @Override
    method onProgressUpdate (line 474) | @Override
    method onMetadataUpdate (line 503) | @Override
    method onServiceStopped (line 525) | @Override
    method onStateChanged (line 535) | private void onStateChanged(final int state) {
    method onPlayModeChanged (line 570) | private void onPlayModeChanged(final int repeatMode, final boolean shu...
    method onPlaybackParameterChanged (line 590) | private void onPlaybackParameterChanged(@Nullable final PlaybackParame...
    method onMaybeMuteChanged (line 597) | private void onMaybeMuteChanged() {
    method onAudioTrackUpdate (line 611) | @Override
    method buildAudioTrackMenu (line 616) | private void buildAudioTrackMenu() {
    method onAudioTrackClick (line 662) | private void onAudioTrackClick(final int itemId) {

FILE: app/src/main/java/org/schabi/newpipe/player/Player.java
  class Player (line 144) | public final class Player implements PlaybackListener, Listener {
    method Player (line 284) | public Player(@NonNull final PlayerService service,
    method getQualityResolver (line 322) | private VideoPlaybackResolver.QualityResolver getQualityResolver() {
    method handleIntent (line 349) | @SuppressWarnings("MethodLength")
    method handleIntentPost (line 546) | public void handleIntentPost(final PlayerType oldPlayerType) {
    method getPlayQueueFromCache (line 557) | @Nullable
    method initUIsForCurrentPlayerType (line 566) | private void initUIsForCurrentPlayerType() {
    method initPlayback (line 602) | private void initPlayback(@NonNull final PlayQueue queue,
    method initPlayer (line 621) | private void initPlayer(final boolean playOnReady) {
    method destroyPlayer (line 660) | private void destroyPlayer() {
    method destroy (line 685) | public void destroy() {
    method setRecovery (line 704) | public void setRecovery() {
    method setRecovery (line 717) | private void setRecovery(final int queuePos, final long windowPos) {
    method reloadPlayQueueManager (line 728) | public void reloadPlayQueueManager() {
    method onPlaybackShutdown (line 738) | @Override // own playback listener
    method smoothStopForImmediateReusing (line 747) | public void smoothStopForImmediateReusing() {
    method setupBroadcastReceiver (line 768) | private void setupBroadcastReceiver() {
    method onBroadcastReceived (line 802) | private void onBroadcastReceived(final Intent intent) {
    method registerBroadcastReceiver (line 855) | private void registerBroadcastReceiver() {
    method unregisterBroadcastReceiver (line 862) | private void unregisterBroadcastReceiver() {
    method loadCurrentThumbnail (line 879) | private void loadCurrentThumbnail(final List<Image> thumbnails) {
    method onThumbnailLoaded (line 927) | private void onThumbnailLoaded(@Nullable final Bitmap bitmap) {
    method getPlaybackSpeed (line 945) | public float getPlaybackSpeed() {
    method setPlaybackSpeed (line 949) | public void setPlaybackSpeed(final float speed) {
    method getPlaybackPitch (line 953) | public float getPlaybackPitch() {
    method getPlaybackSkipSilence (line 957) | public boolean getPlaybackSkipSilence() {
    method getPlaybackParameters (line 961) | public PlaybackParameters getPlaybackParameters() {
    method setPlaybackParameters (line 976) | public void setPlaybackParameters(final float speed, final float pitch,
    method onUpdateProgress (line 995) | private void onUpdateProgress(final int currentProgress,
    method startProgressLoop (line 1004) | public void startProgressLoop() {
    method stopProgressLoop (line 1008) | private void stopProgressLoop() {
    method isProgressLoopRunning (line 1012) | public boolean isProgressLoopRunning() {
    method triggerProgressUpdate (line 1016) | public void triggerProgressUpdate() {
    method getProgressUpdateDisposable (line 1025) | private Disposable getProgressUpdateDisposable() {
    method onPlayWhenReadyChanged (line 1040) | @Override
    method onPlaybackStateChanged (line 1053) | @Override
    method updatePlaybackState (line 1062) | private void updatePlaybackState(final boolean playWhenReady, final in...
    method onIsLoadingChanged (line 1100) | @Override // exoplayer listener
    method onPlaybackBlock (line 1109) | @Override // own playback listener
    method onPlaybackUnblock (line 1126) | @Override // own playback listener
    method changeState (line 1142) | public void changeState(final int state) {
    method onPrepared (line 1170) | private void onPrepared(final boolean playWhenReady) {
    method onBlocked (line 1182) | private void onBlocked() {
    method onPlaying (line 1193) | private void onPlaying() {
    method onBuffering (line 1204) | private void onBuffering() {
    method onPaused (line 1212) | private void onPaused() {
    method onPausedSeek (line 1224) | private void onPausedSeek() {
    method onCompleted (line 1231) | private void onCompleted() {
    method getRepeatMode (line 1257) | @RepeatMode
    method cycleNextRepeatMode (line 1262) | public void cycleNextRepeatMode() {
    method onRepeatModeChanged (line 1281) | @Override
    method onShuffleModeEnabledChanged (line 1291) | @Override
    method toggleShuffleModeEnabled (line 1310) | public void toggleShuffleModeEnabled() {
    method toggleMute (line 1324) | public void toggleMute() {
    method isMuted (line 1336) | public boolean isMuted() {
    method onEvents (line 1361) | @Override
    method onTracksChanged (line 1406) | @Override
    method onPlaybackParametersChanged (line 1415) | @Override
    method onPositionDiscontinuity (line 1424) | @Override
    method onRenderedFirstFrame (line 1471) | @Override
    method onCues (line 1476) | @Override
    method onPrepare (line 1488) | public void onPrepare() {
    method onPlayerError (line 1534) | @SuppressWarnings("SwitchIntDef")
    method createErrorNotification (line 1590) | private void createErrorNotification(@NonNull final PlaybackException ...
    method isApproachingPlaybackEdge (line 1613) | @Override // own playback listener (this is a getter)
    method isLiveEdge (line 1631) | @SuppressWarnings("BooleanMethodIsAlwaysInverted")
    method onPlaybackSynchronize (line 1649) | @Override // own playback listener
    method seekTo (line 1703) | public void seekTo(final long positionMillis) {
    method seekBy (line 1714) | private void seekBy(final long offsetMillis) {
    method seekToDefault (line 1721) | public void seekToDefault() {
    method play (line 1735) | public void play() {
    method pause (line 1759) | public void pause() {
    method playPause (line 1772) | public void playPause() {
    method playPrevious (line 1786) | public void playPrevious() {
    method playNext (line 1808) | public void playNext() {
    method fastForward (line 1821) | public void fastForward() {
    method fastRewind (line 1829) | public void fastRewind() {
    method registerStreamViewed (line 1845) | private void registerStreamViewed() {
    method saveStreamProgressState (line 1850) | private void saveStreamProgressState(final long progressMillis) {
    method saveStreamProgressState (line 1872) | public void saveStreamProgressState() {
    method saveStreamProgressStateCompleted (line 1886) | public void saveStreamProgressStateCompleted() {
    method updateMetadataWith (line 1900) | private void updateMetadataWith(@NonNull final StreamInfo info) {
    method getVideoUrl (line 1918) | @NonNull
    method getVideoUrlAtCurrentTime (line 1925) | @NonNull
    method getVideoTitle (line 1937) | @NonNull
    method getUploaderName (line 1944) | @NonNull
    method getThumbnail (line 1951) | @Nullable
    method maybeAutoQueueNextStream (line 1964) | private void maybeAutoQueueNextStream(@NonNull final StreamInfo info) {
    method selectQueueItem (line 1978) | public void selectQueueItem(final PlayQueueItem item) {
    method onPlayQueueEdited (line 1996) | @Override
    method sourceOf (line 2002) | @Override // own playback listener
    method disablePreloadingOfCurrentTrack (line 2028) | public void disablePreloadingOfCurrentTrack() {
    method getSelectedVideoStream (line 2032) | public Optional<VideoStream> getSelectedVideoStream() {
    method getSelectedAudioStream (line 2044) | public Optional<AudioStream> getSelectedAudioStream() {
    method getCaptionRendererIndex (line 2058) | public int getCaptionRendererIndex() {
    method onVideoSizeChanged (line 2078) | @Override // exoplayer listener
    method setFragmentListener (line 2098) | public void setFragmentListener(final PlayerServiceEventListener liste...
    method removeFragmentListener (line 2107) | public void removeFragmentListener(final PlayerServiceEventListener li...
    method setActivityListener (line 2113) | void setActivityListener(final PlayerEventListener listener) {
    method removeActivityListener (line 2121) | void removeActivityListener(final PlayerEventListener listener) {
    method stopActivityBinding (line 2127) | void stopActivityBinding() {
    method notifyQueueUpdateToListeners (line 2138) | private void notifyQueueUpdateToListeners() {
    method notifyMetadataUpdateToListeners (line 2147) | private void notifyMetadataUpdateToListeners() {
    method notifyPlaybackUpdateToListeners (line 2158) | private void notifyPlaybackUpdateToListeners() {
    method notifyProgressUpdateToListeners (line 2169) | private void notifyProgressUpdateToListeners(final int currentProgress,
    method notifyAudioTrackUpdateToListeners (line 2180) | private void notifyAudioTrackUpdateToListeners() {
    method useVideoAndSubtitles (line 2189) | public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnable...
    method playQueueManagerReloadingNeeded (line 2267) | private boolean playQueueManagerReloadingNeeded(final SourceType sourc...
    method getCurrentStreamInfo (line 2309) | public Optional<StreamInfo> getCurrentStreamInfo() {
    method getCurrentState (line 2313) | public int getCurrentState() {
    method exoPlayerIsNull (line 2317) | public boolean exoPlayerIsNull() {
    method getExoPlayer (line 2321) | public ExoPlayer getExoPlayer() {
    method isStopped (line 2325) | public boolean isStopped() {
    method isPlaying (line 2329) | public boolean isPlaying() {
    method getPlayWhenReady (line 2333) | public boolean getPlayWhenReady() {
    method isLoading (line 2337) | public boolean isLoading() {
    method isLive (line 2341) | private boolean isLive() {
    method setPlaybackQuality (line 2353) | public void setPlaybackQuality(@Nullable final String quality) {
    method setAudioTrack (line 2360) | public void setAudioTrack(@Nullable final String audioTrackId) {
    method getContext (line 2369) | @NonNull
    method getPrefs (line 2374) | @NonNull
    method getPlayerType (line 2380) | public PlayerType getPlayerType() {
    method audioPlayerSelected (line 2384) | public boolean audioPlayerSelected() {
    method videoPlayerSelected (line 2388) | public boolean videoPlayerSelected() {
    method popupPlayerSelected (line 2392) | public boolean popupPlayerSelected() {
    method getPlayQueue (line 2397) | @Nullable
    method getAudioReactor (line 2402) | public AudioReactor getAudioReactor() {
    method getService (line 2406) | public PlayerService getService() {
    method isAudioOnly (line 2410) | public boolean isAudioOnly() {
    method getTrackSelector (line 2414) | @NonNull
    method getCurrentMetadata (line 2419) | @Nullable
    method getCurrentItem (line 2424) | @Nullable
    method getFragmentListener (line 2429) | public Optional<PlayerServiceEventListener> getFragmentListener() {
    method UIs (line 2436) | @SuppressWarnings("MethodName") // keep the unusual method name
    method getVideoRendererIndex (line 2450) | private int getVideoRendererIndex() {
    method isScreenOn (line 2473) | public boolean isScreenOn() {

FILE: app/src/main/java/org/schabi/newpipe/player/PlayerService.java
  class PlayerService (line 54) | public final class PlayerService extends MediaBrowserServiceCompat {
    method onCreate (line 86) | @Override
    method onStartCommand (line 124) | @Override
    method stopForImmediateReusing (line 182) | public void stopForImmediateReusing() {
    method onTaskRemoved (line 195) | @Override
    method onDestroy (line 206) | @Override
    method cleanup (line 220) | private void cleanup() {
    method destroyPlayerAndStopService (line 245) | public void destroyPlayerAndStopService() {
    method attachBaseContext (line 261) | @Override
    method onBind (line 268) | @Override
    class LocalBinder (line 291) | public static class LocalBinder extends Binder {
      method LocalBinder (line 294) | LocalBinder(final PlayerService playerService) {
      method getService (line 298) | public PlayerService getService() {
    method getPlayer (line 307) | @Nullable
    method setPlayerListener (line 318) | public void setPlayerListener(@Nullable final Consumer<Player> listene...
    method onGetRoot (line 328) | @Override
    method onLoadChildren (line 335) | @Override
    method onSearch (line 341) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/datasource/NonUriHlsDataSourceFactory.java
  class NonUriHlsDataSourceFactory (line 30) | public final class NonUriHlsDataSourceFactory implements HlsDataSourceFa...
    class Builder (line 35) | public static final class Builder {
      method setDataSourceFactory (line 47) | public void setDataSourceFactory(
      method setPlaylistString (line 58) | public void setPlaylistString(@NonNull final String hlsPlaylistStrin...
      method build (line 70) | @NonNull
    method NonUriHlsDataSourceFactory (line 96) | private NonUriHlsDataSourceFactory(@NonNull final DataSource.Factory d...
    method createDataSource (line 125) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java
  class YoutubeHttpDataSource (line 79) | @SuppressWarnings({"squid:S3011", "squid:S4738"})
    class Factory (line 85) | public static final class Factory implements HttpDataSource.Factory {
      method Factory (line 104) | public Factory() {
      method setDefaultRequestProperties (line 110) | @NonNull
      method setConnectTimeoutMs (line 128) | public Factory setConnectTimeoutMs(final int connectTimeoutMsValue) {
      method setReadTimeoutMs (line 141) | public Factory setReadTimeoutMs(final int readTimeoutMsValue) {
      method setAllowCrossProtocolRedirects (line 154) | public Factory setAllowCrossProtocolRedirects(
      method setRangeParameterEnabled (line 175) | public Factory setRangeParameterEnabled(final boolean rangeParameter...
      method setRnParameterEnabled (line 193) | public Factory setRnParameterEnabled(final boolean rnParameterEnable...
      method setContentTypePredicate (line 211) | public Factory setContentTypePredicate(
      method setTransferListener (line 227) | public Factory setTransferListener(
      method setKeepPostFor302Redirects (line 241) | public Factory setKeepPostFor302Redirects(final boolean keepPostFor3...
      method createDataSource (line 246) | @NonNull
    method YoutubeHttpDataSource (line 301) | @SuppressWarnings("checkstyle:ParameterNumber")
    method getUri (line 323) | @Override
    method getResponseCode (line 329) | @Override
    method getResponseHeaders (line 334) | @NonNull
    method setRequestProperty (line 353) | @Override
    method clearRequestProperty (line 360) | @Override
    method clearAllRequestProperties (line 366) | @Override
    method open (line 374) | @Override
    method read (line 497) | @Override
    method close (line 508) | @Override
    method makeConnection (line 536) | @NonNull
    method makeConnection (line 610) | @SuppressWarnings("checkstyle:ParameterNumber")
    method openConnection (line 710) | private HttpURLConnection openConnection(@NonNull final URL url) throw...
    method handleRedirect (line 723) | @NonNull
    method skipFully (line 776) | @SuppressWarnings("checkstyle:FinalParameters")
    method readInternal (line 822) | @SuppressWarnings("checkstyle:FinalParameters")
    method maybeTerminateInputStream (line 857) | private static void maybeTerminateInputStream(@Nullable final HttpURLC...
    method closeConnectionQuietly (line 896) | private void closeConnectionQuietly() {
    method isCompressed (line 907) | private static boolean isCompressed(@NonNull final HttpURLConnection c...
    method buildRangeParameter (line 930) | @Nullable
    class NullFilteringHeadersMap (line 946) | private static final class NullFilteringHeadersMap
      method NullFilteringHeadersMap (line 950) | NullFilteringHeadersMap(final Map<String, List<String>> headers) {
      method delegate (line 954) | @NonNull
      method containsKey (line 960) | @Override
      method get (line 965) | @Nullable
      method keySet (line 971) | @NonNull
      method entrySet (line 977) | @NonNull
      method size (line 983) | @Override
      method isEmpty (line 988) | @Override
      method containsValue (line 993) | @Override
      method equals (line 998) | @Override
      method hashCode (line 1003) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/event/OnKeyDownListener.java
  type OnKeyDownListener (line 3) | public interface OnKeyDownListener {
    method onKeyDown (line 4) | boolean onKeyDown(int keyCode);

FILE: app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java
  type PlayerEventListener (line 8) | public interface PlayerEventListener {
    method onQueueUpdate (line 9) | void onQueueUpdate(PlayQueue queue);
    method onPlaybackUpdate (line 10) | void onPlaybackUpdate(int state, int repeatMode, boolean shuffled,
    method onProgressUpdate (line 12) | void onProgressUpdate(int currentProgress, int duration, int bufferPer...
    method onMetadataUpdate (line 13) | void onMetadataUpdate(StreamInfo info, PlayQueue queue);
    method onAudioTrackUpdate (line 14) | default void onAudioTrackUpdate() { }
    method onServiceStopped (line 15) | void onServiceStopped();

FILE: app/src/main/java/org/schabi/newpipe/player/event/PlayerServiceEventListener.java
  type PlayerServiceEventListener (line 5) | public interface PlayerServiceEventListener extends PlayerEventListener {
    method onViewCreated (line 6) | void onViewCreated();
    method onFullscreenStateChanged (line 8) | void onFullscreenStateChanged(boolean fullscreen);
    method onScreenRotationButtonClicked (line 10) | void onScreenRotationButtonClicked();
    method onMoreOptionsLongClicked (line 12) | void onMoreOptionsLongClicked();
    method onPlayerError (line 14) | void onPlayerError(PlaybackException error, boolean isCatchableExcepti...
    method hideSystemUiIfNeeded (line 16) | void hideSystemUiIfNeeded();

FILE: app/src/main/java/org/schabi/newpipe/player/event/PlayerServiceExtendedEventListener.java
  type PlayerServiceExtendedEventListener (line 15) | public interface PlayerServiceExtendedEventListener extends PlayerServic...
    method onServiceConnected (line 25) | void onServiceConnected(@NonNull PlayerService playerService);
    method onPlayerConnected (line 33) | void onPlayerConnected(@NonNull Player player, boolean playAfterConnect);
    method onPlayerDisconnected (line 40) | void onPlayerDisconnected();
    method onServiceDisconnected (line 47) | void onServiceDisconnected();

FILE: app/src/main/java/org/schabi/newpipe/player/gesture/CustomBottomSheetBehavior.java
  class CustomBottomSheetBehavior (line 20) | public class CustomBottomSheetBehavior extends BottomSheetBehavior<Frame...
    method CustomBottomSheetBehavior (line 22) | public CustomBottomSheetBehavior(@NonNull final Context context,
    method onInterceptTouchEvent (line 34) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java
  class AudioReactor (line 20) | public class AudioReactor implements AudioManager.OnAudioFocusChangeList...
    method AudioReactor (line 36) | public AudioReactor(@NonNull final Context context,
    method dispose (line 50) | public void dispose() {
    method requestAudioFocus (line 60) | public void requestAudioFocus() {
    method abandonAudioFocus (line 64) | public void abandonAudioFocus() {
    method getVolume (line 68) | public int getVolume() {
    method setVolume (line 72) | public void setVolume(final int volume) {
    method getMaxVolume (line 76) | public int getMaxVolume() {
    method onAudioFocusChange (line 84) | @Override
    method onAudioFocusGain (line 101) | private void onAudioFocusGain() {
    method onAudioFocusLoss (line 111) | private void onAudioFocusLoss() {
    method onAudioFocusLossCanDuck (line 116) | private void onAudioFocusLossCanDuck() {
    method animateAudio (line 122) | private void animateAudio(final float from, final float to) {
    method onAudioSessionIdChanged (line 151) | @Override
    method notifyAudioSessionUpdate (line 156) | private void notifyAudioSessionUpdate(final boolean active, final int ...

FILE: app/src/main/java/org/schabi/newpipe/player/helper/CacheFactory.java
  class CacheFactory (line 15) | final class CacheFactory implements DataSource.Factory {
    method CacheFactory (line 23) | CacheFactory(final Context context,
    method createDataSource (line 33) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java
  class CustomMediaCodecVideoRenderer (line 35) | public final class CustomMediaCodecVideoRenderer extends MediaCodecVideo...
    method CustomMediaCodecVideoRenderer (line 37) | @SuppressWarnings({"checkstyle:ParameterNumber", "squid:S107"})
    method codecNeedsSetOutputSurfaceWorkaround (line 50) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java
  class CustomRenderersFactory (line 23) | public final class CustomRenderersFactory extends DefaultRenderersFactory {
    method CustomRenderersFactory (line 25) | public CustomRenderersFactory(final Context context) {
    method buildVideoRenderers (line 29) | @SuppressWarnings("checkstyle:ParameterNumber")

FILE: app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java
  class LoadController (line 5) | public class LoadController extends DefaultLoadControl {
    method onPrepared (line 10) | @Override
    method onStopped (line 16) | @Override
    method onReleased (line 22) | @Override
    method shouldContinueLoading (line 28) | @Override
    method disablePreloadingOfCurrentTrack (line 39) | public void disablePreloadingOfCurrentTrack() {

FILE: app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java
  class LockManager (line 10) | public class LockManager {
    method LockManager (line 19) | public LockManager(final Context context) {
    method acquireWifiAndCpu (line 25) | public void acquireWifiAndCpu() {
    method releaseWifiAndCpu (line 42) | public void releaseWifiAndCpu() {

FILE: app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java
  class PlaybackParameterDialog (line 42) | public class PlaybackParameterDialog extends DialogFragment {
    method progressOf (line 70) | @Override
    method valueOf (line 75) | @Override
    method newInstance (line 100) | public static PlaybackParameterDialog newInstance(
    method onAttach (line 124) | @Override
    method onSaveInstanceState (line 134) | @Override
    method onCreateDialog (line 144) | @NonNull
    method initUI (line 176) | private void initUI() {
    method setText (line 282) | private void setText(
    method registerOnStepClickListener (line 292) | private void registerOnStepClickListener(
    method registerOnSemitoneStepClickListener (line 305) | private void registerOnSemitoneStepClickListener(
    method setupPitchControlModeTextView (line 319) | private void setupPitchControlModeTextView(
    method getPitchControlModeComponentMappings (line 333) | private Map<Boolean, TextView> getPitchControlModeComponentMappings() {
    method changePitchControlMode (line 338) | private void changePitchControlMode(final boolean semitones) {
    method isCurrentPitchControlModeSemitone (line 380) | private boolean isCurrentPitchControlModeSemitone() {
    method setupStepTextView (line 389) | private void setupStepTextView(
    method getStepSizeComponentMappings (line 404) | private Map<Double, TextView> getStepSizeComponentMappings() {
    method setStepSizeToUI (line 412) | private void setStepSizeToUI(final double newStepSize) {
    method getCurrentStepSize (line 435) | private double getCurrentStepSize() {
    method setAndUpdateSkipSilence (line 442) | private void setAndUpdateSkipSilence(final boolean newSkipSilence) {
    method bindCheckboxWithBoolPref (line 447) | @SuppressWarnings("SameParameterValue") // this method was written to ...
    method ensureHookIsValidAndUpdateCallBack (line 478) | private void ensureHookIsValidAndUpdateCallBack() {
    method getTempoOrPitchSeekbarChangeListener (line 489) | private SeekBar.OnSeekBarChangeListener getTempoOrPitchSeekbarChangeLi...
    method onTempoSliderUpdated (line 506) | private void onTempoSliderUpdated(final double newTempo) {
    method onPitchPercentSliderUpdated (line 514) | private void onPitchPercentSliderUpdated(final double newPitch) {
    method setSliders (line 522) | private void setSliders(final double newValue) {
    method setAndUpdateTempo (line 527) | private void setAndUpdateTempo(final double newTempo) {
    method setAndUpdatePitch (line 534) | private void setAndUpdatePitch(final double newPitch) {
    method calcValidPitch (line 547) | private double calcValidPitch(final double newPitch) {
    method updateCallback (line 562) | private void updateCallback() {
    method getStepUpPercentString (line 576) | @NonNull
    method getStepDownPercentString (line 581) | @NonNull
    method getPercentString (line 586) | @NonNull
    type Callback (line 591) | public interface Callback {
      method onPlaybackParameterChanged (line 592) | void onPlaybackParameterChanged(float playbackTempo, float playbackP...

FILE: app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java
  class PlayerDataSource (line 35) | public class PlayerDataSource {
    method PlayerDataSource (line 81) | public PlayerDataSource(final Context context,
    method getLiveSsMediaSourceFactory (line 113) | public SsMediaSource.Factory getLiveSsMediaSourceFactory() {
    method getLiveHlsMediaSourceFactory (line 117) | public HlsMediaSource.Factory getLiveHlsMediaSourceFactory() {
    method getLiveDashMediaSourceFactory (line 127) | public DashMediaSource.Factory getLiveDashMediaSourceFactory() {
    method getLiveYoutubeDashMediaSourceFactory (line 133) | public DashMediaSource.Factory getLiveYoutubeDashMediaSourceFactory() {
    method getHlsMediaSourceFactory (line 143) | public HlsMediaSource.Factory getHlsMediaSourceFactory(
    method getDashMediaSourceFactory (line 153) | public DashMediaSource.Factory getDashMediaSourceFactory() {
    method getProgressiveMediaSourceFactory (line 159) | public ProgressiveMediaSource.Factory getProgressiveMediaSourceFactory...
    method getSSMediaSourceFactory (line 164) | public SsMediaSource.Factory getSSMediaSourceFactory() {
    method getSingleSampleMediaSourceFactory (line 170) | public SingleSampleMediaSource.Factory getSingleSampleMediaSourceFacto...
    method getYoutubeHlsMediaSourceFactory (line 177) | public HlsMediaSource.Factory getYoutubeHlsMediaSourceFactory() {
    method getYoutubeDashMediaSourceFactory (line 181) | public DashMediaSource.Factory getYoutubeDashMediaSourceFactory() {
    method getYoutubeProgressiveMediaSourceFactory (line 187) | public ProgressiveMediaSource.Factory getYoutubeProgressiveMediaSource...
    method getDefaultDashChunkSourceFactory (line 195) | private static DefaultDashChunkSource.Factory getDefaultDashChunkSourc...
    method getYoutubeHttpDataSourceFactory (line 200) | private static YoutubeHttpDataSource.Factory getYoutubeHttpDataSourceF...
    method instantiateCacheIfNeeded (line 208) | private static void instantiateCacheIfNeeded(final Context context) {

FILE: app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java
  class PlayerHelper (line 59) | public final class PlayerHelper {
    method PlayerHelper (line 80) | private PlayerHelper() {
    method resetFormat (line 85) | public static void resetFormat() {
    method getTimeString (line 89) | @NonNull
    method formatSpeed (line 106) | @NonNull
    method formatPitch (line 111) | @NonNull
    method captionLanguageOf (line 116) | @NonNull
    method captionLanguageStemOf (line 124) | @NonNull
    method resizeTypeOf (line 139) | @NonNull
    method autoQueueOf (line 174) | @Nullable
    method isResumeAfterAudioFocusGain (line 206) | public static boolean isResumeAfterAudioFocusGain(@NonNull final Conte...
    method getActionForRightGestureSide (line 211) | public static String getActionForRightGestureSide(@NonNull final Conte...
    method getActionForLeftGestureSide (line 217) | public static String getActionForLeftGestureSide(@NonNull final Contex...
    method isStartMainPlayerFullscreenEnabled (line 223) | public static boolean isStartMainPlayerFullscreenEnabled(@NonNull fina...
    method isAutoQueueEnabled (line 228) | public static boolean isAutoQueueEnabled(@NonNull final Context contex...
    method isClearingQueueConfirmationRequired (line 233) | public static boolean isClearingQueueConfirmationRequired(@NonNull fin...
    method getMinimizeOnExitAction (line 238) | @MinimizeMode
    method getAutoplayType (line 251) | @AutoplayType
    method isAutoplayAllowedByUser (line 264) | public static boolean isAutoplayAllowedByUser(@NonNull final Context c...
    method getSeekParameters (line 276) | @NonNull
    method getPreferredCacheSize (line 281) | public static long getPreferredCacheSize() {
    method getPreferredFileSize (line 285) | public static long getPreferredFileSize() {
    method getQualitySelector (line 289) | @NonNull
    method getCaptionStyle (line 298) | @NonNull
    method getCaptionScale (line 323) | public static float getCaptionScale(@NonNull final Context context) {
    method getScreenBrightness (line 338) | public static float getScreenBrightness(@NonNull final Context context) {
    method setScreenBrightness (line 352) | public static void setScreenBrightness(@NonNull final Context context,
    method globalScreenOrientationLocked (line 361) | public static boolean globalScreenOrientationLocked(final Context cont...
    method getProgressiveLoadIntervalBytes (line 371) | public static int getProgressiveLoadIntervalBytes(@NonNull final Conte...
    method getPreferences (line 387) | @NonNull
    method isUsingInexactSeek (line 392) | private static boolean isUsingInexactSeek(@NonNull final Context conte...
    method getAutoQueuedSinglePlayQueue (line 397) | private static SinglePlayQueue getAutoQueuedSinglePlayQueue(
    method retrieveResizeModeFromPrefs (line 407) | @ResizeMode
    method nextResizeModeAndSaveToPrefs (line 413) | @SuppressLint("SwitchIntDef") // only fit, fill and zoom are supported...
    method retrievePlaybackParametersFromPrefs (line 437) | public static PlaybackParameters retrievePlaybackParametersFromPrefs(f...
    method savePlaybackParametersToPrefs (line 445) | public static void savePlaybackParametersToPrefs(final Player player,
    method getMinimumVideoHeight (line 457) | public static float getMinimumVideoHeight(final float width) {
    method retrieveSeekDurationFromPreferences (line 461) | public static int retrieveSeekDurationFromPreferences(final Player pla...
    class FormattersProvider (line 470) | static class FormattersProvider {
      method formatters (line 473) | public Formatters formatters() {
      method reset (line 480) | public void reset() {
    method create (line 490) | static Formatters create() {
    method stringFormat (line 499) | String stringFormat(final String format, final Object... args) {

FILE: app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java
  class PlayerHolder (line 30) | public final class PlayerHolder {
    method PlayerHolder (line 32) | private PlayerHolder() {
    method getInstance (line 36) | public static synchronized PlayerHolder getInstance() {
    method getPlayer (line 52) | private Optional<Player> getPlayer() {
    method getPlayQueue (line 57) | private Optional<PlayQueue> getPlayQueue() {
    method getType (line 68) | @Nullable
    method isPlaying (line 73) | public boolean isPlaying() {
    method isPlayerOpen (line 77) | public boolean isPlayerOpen() {
    method isPlayQueueReady (line 86) | public boolean isPlayQueueReady() {
    method isBound (line 90) | public boolean isBound() {
    method getQueueSize (line 94) | public int getQueueSize() {
    method getQueuePosition (line 98) | public int getQueuePosition() {
    method setListener (line 102) | public void setListener(@Nullable final PlayerServiceExtendedEventList...
    method getCommonContext (line 119) | private Context getCommonContext() {
    method startService (line 123) | public void startService(final boolean playAfterConnect,
    method stopService (line 144) | public void stopService() {
    class PlayerServiceConnection (line 158) | class PlayerServiceConnection implements ServiceConnection {
      method doPlayAfterConnect (line 167) | public void doPlayAfterConnect(final boolean playAfterConnection) {
      method onServiceDisconnected (line 171) | @Override
      method onServiceConnected (line 181) | @Override
    method bind (line 203) | private void bind(final Context context) {
    method tryBindIfNeeded (line 214) | public void tryBindIfNeeded(final Context context) {
    method bind (line 223) | private boolean bind(final Context context, final int flags) {
    method unbind (line 229) | private void unbind(final Context context) {
    method startPlayerListener (line 246) | private void startPlayerListener() {
    method stopPlayerListener (line 255) | private void stopPlayerListener() {
    method onViewCreated (line 267) | @Override
    method onFullscreenStateChanged (line 274) | @Override
    method onScreenRotationButtonClicked (line 281) | @Override
    method onMoreOptionsLongClicked (line 288) | @Override
    method onPlayerError (line 295) | @Override
    method hideSystemUiIfNeeded (line 303) | @Override
    method onQueueUpdate (line 310) | @Override
    method onPlaybackUpdate (line 317) | @Override
    method onProgressUpdate (line 327) | @Override
    method onMetadataUpdate (line 336) | @Override
    method onServiceStopped (line 343) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/helper/PlayerSemitoneHelper.java
  class PlayerSemitoneHelper (line 13) | public final class PlayerSemitoneHelper {
    method PlayerSemitoneHelper (line 16) | private PlayerSemitoneHelper() {
    method formatPitchSemitones (line 20) | public static String formatPitchSemitones(final double percent) {
    method formatPitchSemitones (line 24) | public static String formatPitchSemitones(final int semitones) {
    method semitonesToPercent (line 28) | public static double semitonesToPercent(final int semitones) {
    method percentToSemitones (line 32) | public static int percentToSemitones(final double percent) {
    method ensureSemitonesInRange (line 37) | private static int ensureSemitonesInRange(final int semitones) {

FILE: app/src/main/java/org/schabi/newpipe/player/helper/YoutubeDashLiveManifestParser.java
  class YoutubeDashLiveManifestParser (line 26) | public class YoutubeDashLiveManifestParser extends DashManifestParser {
    method buildMediaPresentationDescription (line 36) | @SuppressWarnings("checkstyle:ParameterNumber")

FILE: app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java
  class ExceptionTag (line 24) | public final class ExceptionTag implements MediaItemTag {
    method ExceptionTag (line 32) | private ExceptionTag(@NonNull final PlayQueueItem item,
    method of (line 40) | public static ExceptionTag of(@NonNull final PlayQueueItem playQueueItem,
    method getErrors (line 45) | @NonNull
    method getServiceId (line 51) | @Override
    method getTitle (line 56) | @Override
    method getUploaderName (line 61) | @Override
    method getDurationSeconds (line 66) | @Override
    method getStreamUrl (line 71) | @Override
    method getThumbnailUrl (line 76) | @Override
    method getUploaderUrl (line 81) | @Override
    method getStreamType (line 86) | @Override
    method getMaybeExtras (line 91) | @Override
    method withExtras (line 96) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java
  type MediaItemTag (line 29) | public interface MediaItemTag {
    method getErrors (line 31) | List<Exception> getErrors();
    method getServiceId (line 33) | int getServiceId();
    method getTitle (line 35) | String getTitle();
    method getUploaderName (line 37) | String getUploaderName();
    method getDurationSeconds (line 39) | long getDurationSeconds();
    method getStreamUrl (line 41) | String getStreamUrl();
    method getThumbnailUrl (line 43) | String getThumbnailUrl();
    method getUploaderUrl (line 45) | String getUploaderUrl();
    method getStreamType (line 47) | StreamType getStreamType();
    method getMaybeStreamInfo (line 49) | @NonNull
    method getMaybeQuality (line 54) | @NonNull
    method getMaybeAudioTrack (line 59) | @NonNull
    method getMaybeExtras (line 64) | <T> Optional<T> getMaybeExtras(@NonNull Class<T> type);
    method withExtras (line 66) | <T> MediaItemTag withExtras(@NonNull T extra);
    method from (line 68) | @NonNull
    method makeMediaId (line 77) | @NonNull
    method asMediaItem (line 82) | @NonNull
    class Quality (line 106) | final class Quality {
      method Quality (line 111) | private Quality(@NonNull final List<VideoStream> sortedVideoStreams,
      method of (line 117) | static Quality of(@NonNull final List<VideoStream> sortedVideoStreams,
      method getSortedVideoStreams (line 122) | @NonNull
      method getSelectedVideoStreamIndex (line 127) | public int getSelectedVideoStreamIndex() {
      method getSelectedVideoStream (line 131) | @Nullable
    class AudioTrack (line 139) | final class AudioTrack {
      method AudioTrack (line 144) | private AudioTrack(@NonNull final List<AudioStream> audioStreams,
      method of (line 150) | static AudioTrack of(@NonNull final List<AudioStream> audioStreams,
      method getAudioStreams (line 155) | @NonNull
      method getSelectedAudioStreamIndex (line 160) | public int getSelectedAudioStreamIndex() {
      method getSelectedAudioStream (line 164) | @Nullable

FILE: app/src/main/java/org/schabi/newpipe/player/mediaitem/PlaceholderTag.java
  class PlaceholderTag (line 19) | public final class PlaceholderTag implements MediaItemTag {
    method PlaceholderTag (line 26) | private PlaceholderTag(@Nullable final Object extras) {
    method getErrors (line 30) | @NonNull
    method getServiceId (line 36) | @Override
    method getTitle (line 41) | @Override
    method getUploaderName (line 46) | @Override
    method getDurationSeconds (line 51) | @Override
    method getStreamUrl (line 56) | @Override
    method getThumbnailUrl (line 61) | @Override
    method getUploaderUrl (line 66) | @Override
    method getStreamType (line 71) | @Override
    method getMaybeExtras (line 76) | @Override
    method withExtras (line 81) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java
  class StreamInfoTag (line 24) | public final class StreamInfoTag implements MediaItemTag {
    method StreamInfoTag (line 34) | private StreamInfoTag(@NonNull final StreamInfo streamInfo,
    method of (line 44) | public static StreamInfoTag of(@NonNull final StreamInfo streamInfo,
    method of (line 55) | public static StreamInfoTag of(@NonNull final StreamInfo streamInfo,
    method of (line 63) | public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) {
    method getErrors (line 67) | @Override
    method getServiceId (line 72) | @Override
    method getTitle (line 77) | @Override
    method getUploaderName (line 82) | @Override
    method getDurationSeconds (line 87) | @Override
    method getStreamUrl (line 92) | @Override
    method getThumbnailUrl (line 97) | @Override
    method getUploaderUrl (line 102) | @Override
    method getStreamType (line 107) | @Override
    method getMaybeStreamInfo (line 112) | @NonNull
    method getMaybeQuality (line 118) | @NonNull
    method getMaybeAudioTrack (line 124) | @NonNull
    method getMaybeExtras (line 130) | @Override
    method withExtras (line 135) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java
  class MediaSessionPlayerUi (line 37) | public class MediaSessionPlayerUi extends PlayerUi
    method MediaSessionPlayerUi (line 53) | public MediaSessionPlayerUi(@NonNull final Player player,
    method initPlayer (line 63) | @Override
    method destroyPlayer (line 90) | @Override
    method onThumbnailLoaded (line 101) | @Override
    method onSharedPreferenceChanged (line 109) | @Override
    method updateShouldIgnoreHardwareMediaButtons (line 117) | public void updateShouldIgnoreHardwareMediaButtons(final SharedPrefere...
    method handleMediaButtonIntent (line 123) | public void handleMediaButtonIntent(final Intent intent) {
    method getSessionToken (line 127) | public Optional<MediaSessionCompat.Token> getSessionToken() {
    method getForwardingPlayer (line 132) | private ForwardingPlayer getForwardingPlayer() {
    method buildMediaMetadata (line 151) | private MediaMetadataCompat buildMediaMetadata() {
    method updateMediaSessionActions (line 182) | private void updateMediaSessionActions() {
    method onBlocked (line 222) | @Override
    method onPlaying (line 228) | @Override
    method onBuffering (line 234) | @Override
    method onPaused (line 240) | @Override
    method onPausedSeek (line 246) | @Override
    method onCompleted (line 252) | @Override
    method onRepeatModeChanged (line 258) | @Override
    method onShuffleModeEnabledChanged (line 264) | @Override
    method onBroadcastReceived (line 270) | @Override
    method onMetadataChanged (line 279) | @Override
    method onPlayQueueEdited (line 285) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java
  class PlayQueueNavigator (line 30) | public class PlayQueueNavigator implements MediaSessionConnector.QueueNa...
    method PlayQueueNavigator (line 38) | public PlayQueueNavigator(@NonNull final MediaSessionCompat mediaSession,
    method getSupportedQueueNavigatorActions (line 46) | @Override
    method onTimelineChanged (line 52) | @Override
    method onCurrentMediaItemIndexChanged (line 57) | @Override
    method getActiveQueueItemId (line 68) | @Override
    method onSkipToPrevious (line 74) | @Override
    method onSkipToQueueItem (line 79) | @Override
    method onSkipToNext (line 87) | @Override
    method publishFloatingQueueWindow (line 92) | private void publishFloatingQueueWindow() {
    method getQueueMetadata (line 116) | public MediaDescriptionCompat getQueueMetadata(final int index) {
    method onCommand (line 152) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java
  class SessionConnectorActionProvider (line 18) | public class SessionConnectorActionProvider implements MediaSessionConne...
    method SessionConnectorActionProvider (line 24) | public SessionConnectorActionProvider(final NotificationActionData not...
    method onCustomAction (line 30) | @Override
    method getCustomAction (line 40) | @Nullable

FILE: app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java
  class FailedMediaSource (line 25) | public class FailedMediaSource extends BaseMediaSource implements Manage...
    method FailedMediaSource (line 53) | public FailedMediaSource(@NonNull final PlayQueueItem playQueueItem,
    method of (line 63) | public static FailedMediaSource of(@NonNull final PlayQueueItem playQu...
    method of (line 68) | public static FailedMediaSource of(@NonNull final PlayQueueItem playQu...
    method getStream (line 75) | public PlayQueueItem getStream() {
    method getError (line 79) | public Exception getError() {
    method canRetry (line 83) | private boolean canRetry() {
    method getMediaItem (line 87) | @Override
    method prepareSourceInternal (line 109) | @Override
    method maybeThrowSourceInfoRefreshError (line 126) | @Override
    method createPeriod (line 143) | @Override
    method releasePeriod (line 150) | @Override
    method releaseSourceInternal (line 155) | @Override
    method shouldBeReplacedWith (line 160) | @Override
    method isStreamEqual (line 166) | @Override
    class FailedMediaSourceException (line 171) | public static class FailedMediaSourceException extends Exception {
      method FailedMediaSourceException (line 172) | FailedMediaSourceException(final String message) {
      method FailedMediaSourceException (line 176) | FailedMediaSourceException(final Throwable cause) {
    class MediaSourceResolutionException (line 181) | public static final class MediaSourceResolutionException extends Faile...
      method MediaSourceResolutionException (line 182) | public MediaSourceResolutionException(final String message) {
    class StreamInfoLoadException (line 187) | public static final class StreamInfoLoadException extends FailedMediaS...
      method StreamInfoLoadException (line 188) | public StreamInfoLoadException(final Throwable cause) {
    method makeSilentMediaTimeline (line 193) | private static Timeline makeSilentMediaTimeline(final long durationUs,
    method makeSilentMediaPeriod (line 204) | private static MediaPeriod makeSilentMediaPeriod(final long durationUs) {

FILE: app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java
  class LoadedMediaSource (line 12) | public class LoadedMediaSource extends WrappingMediaSource implements Ma...
    method LoadedMediaSource (line 29) | public LoadedMediaSource(@NonNull final MediaSource source,
    method getStream (line 40) | public PlayQueueItem getStream() {
    method isExpired (line 44) | private boolean isExpired() {
    method getMediaItem (line 48) | @NonNull
    method shouldBeReplacedWith (line 54) | @Override
    method isStreamEqual (line 60) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSource.java
  type ManagedMediaSource (line 9) | public interface ManagedMediaSource extends MediaSource {
    method shouldBeReplacedWith (line 20) | boolean shouldBeReplacedWith(@NonNull PlayQueueItem newIdentity, boole...
    method isStreamEqual (line 29) | boolean isStreamEqual(@NonNull PlayQueueItem stream);

FILE: app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSourcePlaylist.java
  class ManagedMediaSourcePlaylist (line 13) | public class ManagedMediaSourcePlaylist {
    method ManagedMediaSourcePlaylist (line 17) | public ManagedMediaSourcePlaylist() {
    method size (line 26) | public int size() {
    method get (line 37) | @Nullable
    method getParentMediaSource (line 49) | @NonNull
    method expand (line 64) | public synchronized void expand() {
    method append (line 74) | public synchronized void append(@NonNull final ManagedMediaSource sour...
    method remove (line 85) | public synchronized void remove(final int index) {
    method move (line 102) | public synchronized void move(final int source, final int target) {
    method invalidate (line 123) | public synchronized void invalidate(final int index,
    method update (line 140) | public synchronized void update(final int index, @NonNull final Manage...
    method update (line 157) | public synchronized void update(final int index, @NonNull final Manage...

FILE: app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java
  class PlaceholderMediaSource (line 15) | final class PlaceholderMediaSource
    method PlaceholderMediaSource (line 20) | private PlaceholderMediaSource() { }
    method getMediaItem (line 22) | @Override
    method onChildSourceInfoRefreshed (line 27) | @Override
    method createPeriod (line 34) | @Override
    method releasePeriod (line 40) | @Override
    method shouldBeReplacedWith (line 43) | @Override
    method isStreamEqual (line 49) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java
  class NotificationActionData (line 26) | public final class NotificationActionData {
    method NotificationActionData (line 36) | public NotificationActionData(@NonNull final String action, @NonNull f...
    method action (line 43) | @NonNull
    method name (line 48) | @NonNull
    method icon (line 53) | @DrawableRes
    method fromNotificationActionEnum (line 59) | @SuppressLint("PrivateResource") // we currently use Exoplayer's inter...
    method equals (line 193) | @Override
    method hashCode (line 201) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java
  class NotificationConstants (line 21) | public final class NotificationConstants {
    method NotificationConstants (line 23) | private NotificationConstants() {
    method getActionName (line 122) | public static String getActionName(@NonNull final Context context, @Ac...
    method getCompactSlotsFromPreferences (line 178) | public static Collection<Integer> getCompactSlotsFromPreferences(

FILE: app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java
  class NotificationPlayerUi (line 19) | public final class NotificationPlayerUi extends PlayerUi {
    method NotificationPlayerUi (line 22) | public NotificationPlayerUi(@NonNull final Player player) {
    method destroy (line 27) | @Override
    method onThumbnailLoaded (line 33) | @Override
    method onBlocked (line 39) | @Override
    method onPlaying (line 45) | @Override
    method onBuffering (line 51) | @Override
    method onPaused (line 59) | @Override
    method onPausedSeek (line 72) | @Override
    method onCompleted (line 78) | @Override
    method onRepeatModeChanged (line 84) | @Override
    method onShuffleModeEnabledChanged (line 90) | @Override
    method onBroadcastReceived (line 96) | @Override
    method onMetadataChanged (line 104) | @Override
    method onPlayQueueEdited (line 110) | @Override
    method createNotificationAndStartForeground (line 116) | public void createNotificationAndStartForeground() {

FILE: app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java
  class NotificationUtil (line 42) | public final class NotificationUtil {
    method NotificationUtil (line 55) | public NotificationUtil(final Player player) {
    method createNotificationIfNeededAndUpdate (line 70) | public synchronized void createNotificationIfNeededAndUpdate(final boo...
    method updateThumbnail (line 80) | public synchronized void updateThumbnail() {
    method createNotification (line 95) | private synchronized NotificationCompat.Builder createNotification() {
    method updateNotification (line 128) | private synchronized void updateNotification() {
    method shouldUpdateBufferingSlot (line 148) | @SuppressLint("RestrictedApi")
    method startForegroundWithDummyNotification (line 166) | public static void startForegroundWithDummyNotification(final PlayerSe...
    method createNotificationAndStartForeground (line 171) | public void createNotificationAndStartForeground() {
    method cancelNotificationAndStopForeground (line 179) | public void cancelNotificationAndStopForeground() {
    method setupNotificationBuilder (line 194) | private static NotificationCompat.Builder setupNotificationBuilder(fin...
    method startForeground (line 209) | private static void startForeground(final PlayerService service,
    method initializeNotificationSlots (line 231) | private int[] initializeNotificationSlots() {
    method updateActions (line 253) | @SuppressLint("RestrictedApi")
    method addAction (line 261) | private void addAction(final NotificationCompat.Builder builder,
    method getIntentForNotification (line 274) | private Intent getIntentForNotification() {
    method setLargeIcon (line 296) | private void setLargeIcon(final NotificationCompat.Builder builder) {
    method getBitmapWithSquareAspectRatio (line 316) | private Bitmap getBitmapWithSquareAspectRatio(@NonNull final Bitmap bi...

FILE: app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java
  class MediaSourceManager (line 46) | public class MediaSourceManager {
    method MediaSourceManager (line 128) | public MediaSourceManager(@NonNull final PlaybackListener listener,
    method MediaSourceManager (line 135) | private MediaSourceManager(@NonNull final PlaybackListener listener,
    method dispose (line 181) | public void dispose() {
    method getReactor (line 197) | private Subscriber<PlayQueueEvent> getReactor() {
    method onPlayQueueChanged (line 221) | private void onPlayQueueChanged(final PlayQueueEvent event) {
    method isPlayQueueReady (line 286) | private boolean isPlayQueueReady() {
    method isPlaybackReady (line 291) | private boolean isPlaybackReady() {
    method maybeBlock (line 305) | private void maybeBlock() {
    method maybeUnblock (line 320) | private boolean maybeUnblock() {
    method maybeSync (line 338) | private void maybeSync(final boolean wasBlocked) {
    method maybeSynchronizePlayer (line 351) | private synchronized void maybeSynchronizePlayer() {
    method getEdgeIntervalSignal (line 362) | private Observable<Long> getEdgeIntervalSignal() {
    method getDebouncedLoader (line 369) | private Disposable getDebouncedLoader() {
    method loadDebounced (line 377) | private void loadDebounced() {
    method loadImmediate (line 381) | private void loadImmediate() {
    method maybeLoadItem (line 399) | private void maybeLoadItem(@NonNull final PlayQueueItem item) {
    method getLoadedMediaSource (line 422) | private Single<ManagedMediaSource> getLoadedMediaSource(@NonNull final...
    method onMediaSourceReceived (line 458) | private void onMediaSourceReceived(@NonNull final PlayQueueItem item,
    method isCorrectionNeeded (line 494) | private boolean isCorrectionNeeded(@NonNull final PlayQueueItem item) {
    method maybeRenewCurrentIndex (line 512) | private void maybeRenewCurrentIndex() {
    method maybeClearLoaders (line 532) | private void maybeClearLoaders() {
    method resetSources (line 547) | private void resetSources() {
    method populateSources (line 554) | private void populateSources() {
    method getItemsToLoad (line 567) | @Nullable
    class ItemsToLoad (line 596) | private static class ItemsToLoad {
      method ItemsToLoad (line 602) | ItemsToLoad(@NonNull final PlayQueueItem center,

FILE: app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java
  type PlaybackListener (line 11) | public interface PlaybackListener {
    method isApproachingPlaybackEdge (line 23) | boolean isApproachingPlaybackEdge(long timeToEndMillis);
    method onPlaybackBlock (line 33) | void onPlaybackBlock();
    method onPlaybackUnblock (line 44) | void onPlaybackUnblock(MediaSource mediaSource);
    method onPlaybackSynchronize (line 57) | void onPlaybackSynchronize(@NonNull PlayQueueItem item, boolean wasBlo...
    method sourceOf (line 69) | @Nullable
    method onPlaybackShutdown (line 80) | void onPlaybackShutdown();
    method onPlayQueueEdited (line 89) | void onPlayQueueEdited();

FILE: app/src/main/java/org/schabi/newpipe/player/playback/SurfaceHolderCallback.java
  class SurfaceHolderCallback (line 25) | public final class SurfaceHolderCallback implements SurfaceHolder.Callba...
    method SurfaceHolderCallback (line 31) | public SurfaceHolderCallback(final Context context, final Player playe...
    method surfaceCreated (line 36) | @Override
    method surfaceChanged (line 41) | @Override
    method surfaceDestroyed (line 48) | @Override
    method release (line 56) | public void release() {

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java
  class AbstractInfoPlayQueue (line 20) | abstract class AbstractInfoPlayQueue<T extends ListInfo<? extends InfoIt...
    method AbstractInfoPlayQueue (line 32) | protected AbstractInfoPlayQueue(final T info) {
    method AbstractInfoPlayQueue (line 36) | protected AbstractInfoPlayQueue(final T info, final int index) {
    method AbstractInfoPlayQueue (line 46) | protected AbstractInfoPlayQueue(final int serviceId,
    method getTag (line 61) | protected abstract String getTag();
    method isComplete (line 63) | @Override
    method getHeadListObserver (line 68) | SingleObserver<T> getHeadListObserver() {
    method getNextPageObserver (line 107) | SingleObserver<ListExtractor.InfoItemsPage<? extends InfoItem>> getNex...
    method dispose (line 146) | @Override
    method extractListItems (line 155) | private static List<PlayQueueItem> extractListItems(final List<StreamI...

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelTabPlayQueue.java
  class ChannelTabPlayQueue (line 16) | public final class ChannelTabPlayQueue extends AbstractInfoPlayQueue<Cha...
    method ChannelTabPlayQueue (line 20) | public ChannelTabPlayQueue(final int serviceId,
    method ChannelTabPlayQueue (line 29) | public ChannelTabPlayQueue(final int serviceId,
    method getTag (line 34) | @Override
    method fetch (line 39) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java
  class PlayQueue (line 39) | public abstract class PlayQueue implements Serializable {
    method PlayQueue (line 52) | PlayQueue(final int index, final List<PlayQueueItem> startWith) {
    method init (line 72) | public void init() {
    method dispose (line 83) | public void dispose() {
    method isComplete (line 102) | public abstract boolean isComplete();
    method fetch (line 107) | public abstract void fetch();
    method getIndex (line 116) | public int getIndex() {
    method setIndex (line 131) | public synchronized void setIndex(final int index) {
    method getItem (line 170) | @Nullable
    method getItem (line 179) | @Nullable
    method indexOf (line 194) | public int indexOf(@NonNull final PlayQueueItem item) {
    method size (line 201) | public int size() {
    method isEmpty (line 210) | public boolean isEmpty() {
    method isShuffled (line 219) | public boolean isShuffled() {
    method getStreams (line 226) | @NonNull
    method getBroadcastReceiver (line 241) | @Nullable
    method offsetIndex (line 254) | public synchronized void offsetIndex(final int offset) {
    method notifyChange (line 261) | public synchronized void notifyChange() {
    method append (line 277) | public synchronized void append(@NonNull final List<PlayQueueItem> ite...
    method enqueueNext (line 299) | public void enqueueNext(@NonNull final PlayQueueItem item, final boole...
    method remove (line 321) | public synchronized void remove(final int index) {
    method error (line 336) | public synchronized void error() {
    method removeInternal (line 345) | private synchronized void removeInternal(final int removeIndex) {
    method move (line 382) | public synchronized void move(final int source, final int target) {
    method setRecovery (line 414) | public synchronized void setRecovery(final int index, final long posit...
    method unsetRecovery (line 431) | public synchronized void unsetRecovery(final int index) {
    method shuffle (line 449) | public synchronized void shuffle() {
    method unshuffle (line 486) | public synchronized void unshuffle() {
    method previous (line 517) | public synchronized boolean previous() {
    method equalStreams (line 536) | public boolean equalStreams(@Nullable final PlayQueue other) {
    method equalStreamsAndIndex (line 554) | public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) {
    method isDisposed (line 562) | public boolean isDisposed() {
    method broadcast (line 569) | private void broadcast(@NonNull final PlayQueueEvent event) {

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java
  class PlayQueueAdapter (line 49) | public class PlayQueueAdapter extends RecyclerView.Adapter<RecyclerView....
    method PlayQueueAdapter (line 62) | public PlayQueueAdapter(final Context context, final PlayQueue playQue...
    method getReactor (line 73) | private Observer<PlayQueueEvent> getReactor() {
    method onPlayQueueChanged (line 101) | private void onPlayQueueChanged(final PlayQueueEvent message) {
    method dispose (line 137) | public void dispose() {
    method setSelectedListener (line 144) | public void setSelectedListener(final PlayQueueItemBuilder.OnSelectedL...
    method unsetSelectedListener (line 148) | public void unsetSelectedListener() {
    method setFooter (line 152) | public void setFooter(final View footer) {
    method showFooter (line 157) | public void showFooter(final boolean show) {
    method getItems (line 162) | public List<PlayQueueItem> getItems() {
    method getItemCount (line 166) | @Override
    method getItemViewType (line 175) | @Override
    method onCreateViewHolder (line 184) | @NonNull
    method onBindViewHolder (line 200) | @Override
    class HFHolder (line 219) | public static class HFHolder extends RecyclerView.ViewHolder {
      method HFHolder (line 222) | public HFHolder(final View v) {

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java
  class PlayQueueItem (line 18) | public class PlayQueueItem implements Serializable {
    method PlayQueueItem (line 41) | public PlayQueueItem(@NonNull final StreamInfo info) {
    method PlayQueueItem (line 51) | PlayQueueItem(@NonNull final StreamInfoItem item) {
    method PlayQueueItem (line 57) | @SuppressWarnings("ParameterNumber")
    method isSameItem (line 80) | public boolean isSameItem(@Nullable final PlayQueueItem other) {
    method getTitle (line 90) | @NonNull
    method getUrl (line 95) | @NonNull
    method getServiceId (line 100) | public int getServiceId() {
    method getDuration (line 104) | public long getDuration() {
    method getThumbnails (line 108) | @NonNull
    method getUploader (line 113) | @NonNull
    method getUploaderUrl (line 118) | public String getUploaderUrl() {
    method getStreamType (line 122) | @NonNull
    method getRecoveryPosition (line 127) | public long getRecoveryPosition() {
    method setRecoveryPosition (line 131) | void setRecoveryPosition(final long recoveryPosition) {
    method getError (line 135) | @Nullable
    method getStream (line 140) | @NonNull
    method isAutoQueued (line 147) | public boolean isAutoQueued() {
    method setAutoQueued (line 155) | public void setAutoQueued(final boolean autoQueued) {

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java
  class PlayQueueItemBuilder (line 12) | public class PlayQueueItemBuilder {
    method PlayQueueItemBuilder (line 16) | public PlayQueueItemBuilder(final Context context) {
    method setOnSelectedListener (line 19) | public void setOnSelectedListener(final OnSelectedListener listener) {
    method buildStreamInfoItem (line 23) | public void buildStreamInfoItem(final PlayQueueItemHolder holder, fina...
    method getOnTouchListener (line 55) | private View.OnTouchListener getOnTouchListener(final PlayQueueItemHol...
    type OnSelectedListener (line 66) | public interface OnSelectedListener {
      method selected (line 67) | void selected(PlayQueueItem item, View view);
      method held (line 69) | void held(PlayQueueItem item, View view);
      method onStartDrag (line 71) | void onStartDrag(PlayQueueItemHolder viewHolder);

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemHolder.java
  class PlayQueueItemHolder (line 35) | public class PlayQueueItemHolder extends RecyclerView.ViewHolder {
    method PlayQueueItemHolder (line 45) | PlayQueueItemHolder(final View v) {

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemTouchCallback.java
  class PlayQueueItemTouchCallback (line 8) | public abstract class PlayQueueItemTouchCallback extends ItemTouchHelper...
    method PlayQueueItemTouchCallback (line 12) | public PlayQueueItemTouchCallback() {
    method onMove (line 16) | public abstract void onMove(int sourceIndex, int targetIndex);
    method onSwiped (line 18) | public abstract void onSwiped(int index);
    method interpolateOutOfBoundsScroll (line 20) | @Override
    method onMove (line 33) | @Override
    method isLongPressDragEnabled (line 47) | @Override
    method isItemViewSwipeEnabled (line 52) | @Override
    method onSwiped (line 57) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/PlaylistPlayQueue.java
  class PlaylistPlayQueue (line 13) | public final class PlaylistPlayQueue extends AbstractInfoPlayQueue<Playl...
    method PlaylistPlayQueue (line 15) | public PlaylistPlayQueue(final PlaylistInfo info) {
    method PlaylistPlayQueue (line 19) | public PlaylistPlayQueue(final PlaylistInfo info, final int index) {
    method PlaylistPlayQueue (line 23) | public PlaylistPlayQueue(final int serviceId,
    method getTag (line 31) | @Override
    method fetch (line 36) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java
  class SinglePlayQueue (line 11) | public final class SinglePlayQueue extends PlayQueue {
    method SinglePlayQueue (line 12) | public SinglePlayQueue(final StreamInfoItem item) {
    method SinglePlayQueue (line 16) | public SinglePlayQueue(final StreamInfo info) {
    method SinglePlayQueue (line 19) | public SinglePlayQueue(final PlayQueueItem item) {
    method SinglePlayQueue (line 22) | public SinglePlayQueue(final StreamInfo info, final long startPosition) {
    method SinglePlayQueue (line 27) | public SinglePlayQueue(@NonNull final List<StreamInfoItem> items, fina...
    method playQueueItemsOf (line 31) | private static List<PlayQueueItem> playQueueItemsOf(@NonNull final Lis...
    method isComplete (line 35) | @Override
    method fetch (line 40) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java
  class AudioPlaybackResolver (line 25) | public class AudioPlaybackResolver implements PlaybackResolver {
    method AudioPlaybackResolver (line 35) | public AudioPlaybackResolver(@NonNull final Context context,
    method resolve (line 48) | @Override
    method getStreamForIndex (line 87) | @Nullable
    method getAudioTrack (line 95) | @Nullable
    method setAudioTrack (line 100) | public void setAudioTrack(@Nullable final String audioLanguage) {

FILE: app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java
  type PlaybackResolver (line 53) | public interface PlaybackResolver extends Resolver<StreamInfo, MediaSour...
    method commonCacheKeyOf (line 58) | private static StringBuilder commonCacheKeyOf(final StreamInfo info,
    method cacheKeyOf (line 114) | static String cacheKeyOf(final StreamInfo info, final VideoStream vide...
    method cacheKeyOf (line 149) | static String cacheKeyOf(final StreamInfo info, final AudioStream audi...
    method cacheKeyOf (line 183) | static String cacheKeyOf(final StreamInfo info, final Stream stream) {
    method maybeBuildLiveMediaSource (line 195) | @Nullable
    method buildLiveMediaSource (line 221) | static MediaSource buildLiveMediaSource(final PlayerDataSource dataSou...
    method buildMediaSource (line 260) | static MediaSource buildMediaSource(final PlayerDataSource dataSource,
    method buildProgressiveMediaSource (line 285) | private static ProgressiveMediaSource buildProgressiveMediaSource(
    method buildDashMediaSource (line 302) | private static DashMediaSource buildDashMediaSource(final PlayerDataSo...
    method createDashManifest (line 332) | private static DashManifest createDashManifest(final String manifestCo...
    method buildHlsMediaSource (line 338) | private static HlsMediaSource buildHlsMediaSource(final PlayerDataSour...
    method buildSSMediaSource (line 365) | private static SsMediaSource buildSSMediaSource(final PlayerDataSource...
    method createYoutubeMediaSource (line 404) | private static MediaSource createYoutubeMediaSource(final Stream stream,
    method createYoutubeMediaSourceOfVideoStreamType (line 445) | private static MediaSource createYoutubeMediaSourceOfVideoStreamType(
    method buildYoutubeManualDashMediaSource (line 510) | private static DashMediaSource buildYoutubeManualDashMediaSource(
    method buildYoutubeProgressiveMediaSource (line 524) | private static ProgressiveMediaSource buildYoutubeProgressiveMediaSource(
    method manifestUrlToUri (line 540) | private static Uri manifestUrlToUri(final String manifestUrl) {
    method throwResolverExceptionIfUrlNullOrEmpty (line 544) | private static void throwResolverExceptionIfUrlNullOrEmpty(@Nullable f...
    class ResolverException (line 556) | final class ResolverException extends Exception {
      method ResolverException (line 557) | public ResolverException(final String message) {
      method ResolverException (line 561) | public ResolverException(final String message, final Throwable cause) {

FILE: app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java
  type Resolver (line 6) | public interface Resolver<Source, Product> {
    method resolve (line 7) | @Nullable

FILE: app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java
  class VideoPlaybackResolver (line 35) | public class VideoPlaybackResolver implements PlaybackResolver {
    type SourceType (line 51) | public enum SourceType {
    method VideoPlaybackResolver (line 57) | public VideoPlaybackResolver(@NonNull final Context context,
    method resolve (line 65) | @Override
    method getStreamSourceType (line 177) | public Optional<SourceType> getStreamSourceType() {
    method getPlaybackQuality (line 181) | @Nullable
    method setPlaybackQuality (line 186) | public void setPlaybackQuality(@Nullable final String playbackQuality) {
    method getAudioTrack (line 190) | @Nullable
    method setAudioTrack (line 195) | public void setAudioTrack(@Nullable final String audioLanguage) {
    type QualityResolver (line 199) | public interface QualityResolver {
      method getDefaultResolutionIndex (line 200) | int getDefaultResolutionIndex(List<VideoStream> sortedVideos);
      method getOverrideResolutionIndex (line 202) | int getOverrideResolutionIndex(List<VideoStream> sortedVideos, Strin...

FILE: app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHelper.java
  class SeekbarPreviewThumbnailHelper (line 30) | public final class SeekbarPreviewThumbnailHelper {
    method SeekbarPreviewThumbnailHelper (line 37) | private SeekbarPreviewThumbnailHelper() {
    method getSeekbarPreviewThumbnailType (line 54) | @SeekbarPreviewThumbnailType
    method tryResizeAndSetSeekbarPreviewThumbnail (line 67) | public static void tryResizeAndSetSeekbarPreviewThumbnail(

FILE: app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java
  class SeekbarPreviewThumbnailHolder (line 28) | public class SeekbarPreviewThumbnailHolder {
    method resetFrom (line 44) | public void resetFrom(@NonNull final Context context, final List<Frame...
    method resetFromAsync (line 63) | private void resetFromAsync(final int seekbarPreviewType, final List<F...
    method getFrameSetForType (line 93) | private Frameset getFrameSetForType(final List<Frameset> framesets,
    method generateDataFrom (line 108) | private void generateDataFrom(final Frameset frameset, final UUID upda...
    method createBitmapSupplier (line 160) | private Supplier<Bitmap> createBitmapSupplier(final Bitmap srcBitMap,
    method getBitMapFrom (line 199) | @Nullable
    method isRequestIdentifierCurrent (line 227) | private boolean isRequestIdentifierCurrent(final UUID requestIdentifie...
    method getBitmapAt (line 231) | public Optional<Bitmap> getBitmapAt(final int positionInMs) {

FILE: app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java
  class BackgroundPlayerUi (line 16) | public class BackgroundPlayerUi extends PlayerUi {
    method BackgroundPlayerUi (line 18) | public BackgroundPlayerUi(@NonNull final Player player) {
    method initPlayback (line 22) | @Override

FILE: app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java
  class MainPlayerUi (line 82) | public final class MainPlayerUi extends VideoPlayerUi implements View.On...
    method MainPlayerUi (line 110) | public MainPlayerUi(@NonNull final Player player,
    method directlyOpenFullscreenIfNeeded (line 121) | private void directlyOpenFullscreenIfNeeded() {
    method setupAfterIntent (line 130) | @Override
    method buildGestureListener (line 149) | @Override
    method initListeners (line 154) | @Override
    method deinitListeners (line 197) | @Override
    method initPlayback (line 210) | @Override
    method removeViewFromParent (line 226) | @Override
    method destroy (line 235) | @Override
    method destroyPlayer (line 247) | @Override
    method smoothStopForImmediateReusing (line 257) | @Override
    method initVideoPlayer (line 266) | private void initVideoPlayer() {
    method setupElementsVisibility (line 272) | @Override
    method setupElementsSize (line 303) | @Override
    method onBroadcastReceived (line 320) | @Override
    method onFragmentListenerSet (line 356) | @Override
    method onFragmentStopped (line 374) | private void onFragmentStopped() {
    method onUpdateProgress (line 400) | @Override
    method onPlaying (line 414) | @Override
    method onCompleted (line 420) | @Override
    method showOrHideButtons (line 435) | @Override
    method showSystemUIPartially (line 455) | @Override
    method hideSystemUIIfNeeded (line 470) | @Override
    method calculateMaxEndScreenThumbnailHeight (line 497) | @Override
    method showHideKodiButton (line 514) | private void showHideKodiButton() {
    method setupSubtitleView (line 529) | @Override
    method onLayoutChange (line 542) | @SuppressWarnings("checkstyle:ParameterNumber")
    method setInitialGestureValues (line 568) | private void setInitialGestureValues() {
    method onMetadataChanged (line 584) | @Override
    method onPlayQueueEdited (line 600) | @Override
    method onQueueClicked (line 606) | private void onQueueClicked() {
    method buildQueue (line 631) | private void buildQueue() {
    method onSegmentsClicked (line 647) | private void onSegmentsClicked() {
    method buildSegments (line 670) | private void buildSegments() {
    method closeItemsList (line 688) | public void closeItemsList() {
    method getQueueScrollListener (line 710) | private OnScrollBelowItemsListener getQueueScrollListener() {
    method getStreamSegmentListener (line 724) | private StreamSegmentAdapter.StreamSegmentListener getStreamSegmentLis...
    method getNearestStreamSegmentPosition (line 752) | private int getNearestStreamSegmentPosition(final long playbackPositio...
    method getItemTouchCallback (line 767) | private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
    method getOnSelectedListener (line 787) | private PlayQueueItemBuilder.OnSelectedListener getOnSelectedListener() {
    method updateQueueTime (line 813) | private void updateQueueTime(final int currentTime) {
    method isAnyListViewOpen (line 835) | @Override
    method isFullscreen (line 840) | @Override
    method isVerticalVideo (line 845) | public boolean isVerticalVideo() {
    method onPlaybackSpeedClicked (line 857) | @Override
    method onKeyDown (line 866) | @Override
    method setupScreenRotationButton (line 885) | private void setupScreenRotationButton() {
    method onVideoSizeChanged (line 894) | @Override
    method toggleFullscreen (line 912) | public void toggleFullscreen() {
    method checkLandscape (line 940) | public void checkLandscape() {
    method getParentContext (line 962) | private Optional<Context> getParentContext() {
    method getParentActivity (line 968) | public Optional<AppCompatActivity> getParentActivity() {
    method isLandscape (line 974) | public boolean isLandscape() {

FILE: app/src/main/java/org/schabi/newpipe/player/ui/PlayerUi.java
  class PlayerUi (line 26) | public abstract class PlayerUi {
    method PlayerUi (line 35) | protected PlayerUi(@NonNull final Player player) {
    method getPlayer (line 43) | @NonNull
    method setupAfterIntent (line 52) | public void setupAfterIntent() {
    method initPlayer (line 61) | public void initPlayer() {
    method initPlayback (line 69) | public void initPlayback() {
    method destroyPlayer (line 79) | public void destroyPlayer() {
    method destroy (line 86) | public void destroy() {
    method smoothStopForImmediateReusing (line 94) | public void smoothStopForImmediateReusing() {
    method onFragmentListenerSet (line 101) | public void onFragmentListenerSet() {
    method onBroadcastReceived (line 110) | public void onBroadcastReceived(final Intent intent) {
    method onUpdateProgress (line 122) | public void onUpdateProgress(final int currentProgress,
    method onPrepared (line 127) | public void onPrepared() {
    method onBlocked (line 130) | public void onBlocked() {
    method onPlaying (line 133) | public void onPlaying() {
    method onBuffering (line 136) | public void onBuffering() {
    method onPaused (line 139) | public void onPaused() {
    method onPausedSeek (line 142) | public void onPausedSeek() {
    method onCompleted (line 145) | public void onCompleted() {
    method onRepeatModeChanged (line 148) | public void onRepeatModeChanged(@RepeatMode final int repeatMode) {
    method onShuffleModeEnabledChanged (line 151) | public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabl...
    method onMuteUnmuteChanged (line 154) | public void onMuteUnmuteChanged(final boolean isMuted) {
    method onTextTracksChanged (line 161) | public void onTextTracksChanged(@NonNull final Tracks currentTracks) {
    method onPlaybackParametersChanged (line 168) | public void onPlaybackParametersChanged(@NonNull final PlaybackParamet...
    method onRenderedFirstFrame (line 174) | public void onRenderedFirstFrame() {
    method onCues (line 181) | public void onCues(@NonNull final List<Cue> cues) {
    method onMetadataChanged (line 189) | public void onMetadataChanged(@NonNull final StreamInfo info) {
    method onThumbnailLoaded (line 197) | public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {
    method onPlayQueueEdited (line 203) | public void onPlayQueueEdited() {
    method onVideoSizeChanged (line 210) | public void onVideoSizeChanged(@NonNull final VideoSize videoSize) {

FILE: app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.java
  class PlayerUiList (line 8) | public final class PlayerUiList {
    method PlayerUiList (line 20) | public PlayerUiList(final PlayerUi... initialPlayerUis) {
    method addAndPrepare (line 34) | public void addAndPrepare(final PlayerUi playerUi) {
    method destroyAll (line 57) | public <T> void destroyAll(final Class<T> playerUiType) {
    method get (line 75) | public <T> Optional<T> get(final Class<T> playerUiType) {
    method call (line 86) | public void call(final Consumer<PlayerUi> consumer) {

FILE: app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java
  class PopupPlayerUi (line 45) | public final class PopupPlayerUi extends VideoPlayerUi {
    method PopupPlayerUi (line 91) | public PopupPlayerUi(@NonNull final Player player,
    method setupAfterIntent (line 97) | @Override
    method buildGestureListener (line 104) | @Override
    method initPopup (line 109) | @SuppressLint("RtlHardcoded")
    method initPopupCloseOverlay (line 137) | @SuppressLint("RtlHardcoded")
    method initPlayback (line 155) | @Override
    method setupElementsVisibility (line 163) | @Override
    method setupElementsSize (line 191) | @Override
    method removeViewFromParent (line 201) | @Override
    method destroy (line 207) | @Override
    method onBroadcastReceived (line 220) | @Override
    method checkPopupPositionBounds (line 253) | public void checkPopupPositionBounds() {
    method updateScreenSize (line 269) | public void updateScreenSize() {
    method changePopupSize (line 295) | public void changePopupSize(final int width) {
    method calculateMaxEndScreenThumbnailHeight (line 318) | @Override
    method closePopup (line 332) | public void closePopup() {
    method isPopupClosing (line 347) | public boolean isPopupClosing() {
    method removePopupFromView (line 351) | public void removePopupFromView() {
    method animatePopupOverlayAndFinishService (line 372) | private void animatePopupOverlayAndFinishService() {
    method changePopupWindowFlags (line 407) | private void changePopupWindowFlags(final int flags) {
    method onPlaying (line 418) | @Override
    method onPaused (line 424) | @Override
    method onCompleted (line 430) | @Override
    method setupSubtitleView (line 436) | @Override
    method onPlaybackSpeedClicked (line 442) | @Override
    method distanceFromCloseButton (line 455) | private int distanceFromCloseButton(@NonNull final MotionEvent popupMo...
    method getClosingRadius (line 468) | private float getClosingRadius() {
    method isInsideClosingRadius (line 474) | public boolean isInsideClosingRadius(@NonNull final MotionEvent popupM...
    method retrievePopupLayoutParamsFromPrefs (line 489) | @SuppressLint("RtlHardcoded")
    method savePopupPositionAndSizeToPrefs (line 520) | public void savePopupPositionAndSizeToPrefs() {
    method buildCloseOverlayLayoutParams (line 534) | @SuppressLint("RtlHardcoded")
    method popupLayoutParamType (line 558) | public static int popupLayoutParamType() {
    method popupHasParent (line 571) | private boolean popupHasParent() {
    method anyPopupViewIsNull (line 577) | private boolean anyPopupViewIsNull() {
    method getCloseOverlayBinding (line 582) | public PlayerPopupCloseOverlayBinding getCloseOverlayBinding() {
    method getPopupLayoutParams (line 586) | public WindowManager.LayoutParams getPopupLayoutParams() {
    method getWindowManager (line 590) | public WindowManager getWindowManager() {
    method getScreenHeight (line 594) | public int getScreenHeight() {
    method getScreenWidth (line 598) | public int getScreenWidth() {

FILE: app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java
  class VideoPlayerUi (line 94) | public abstract class VideoPlayerUi extends PlayerUi implements SeekBar....
    type PlayButtonAction (line 107) | private enum PlayButtonAction {
    method VideoPlayerUi (line 157) | protected VideoPlayerUi(@NonNull final Player player,
    method setupFromView (line 164) | public void setupFromView() {
    method initViews (line 170) | private void initViews() {
    method buildGestureListener (line 199) | abstract BasePlayerGestureListener buildGestureListener();
    method initListeners (line 201) | protected void initListeners() {
    method deinitListeners (line 279) | protected void deinitListeners() {
    method setupPlayerSeekOverlay (line 318) | private void setupPlayerSeekOverlay() {
    method deinitPlayerSeekOverlay (line 376) | public void deinitPlayerSeekOverlay() {
    method setupAfterIntent (line 382) | @Override
    method initPlayer (line 391) | @Override
    method initPlayback (line 397) | @Override
    method removeViewFromParent (line 405) | public abstract void removeViewFromParent();
    method destroyPlayer (line 407) | @Override
    method destroy (line 413) | @Override
    method setupElementsVisibility (line 421) | protected void setupElementsVisibility() {
    method setupElementsSize (line 426) | protected abstract void setupElementsSize(Resources resources);
    method setupElementsSize (line 428) | protected void setupElementsSize(final int buttonsMinWidth,
    method onBroadcastReceived (line 448) | @Override
    method onThumbnailLoaded (line 474) | @Override
    method updateEndScreenThumbnail (line 480) | private void updateEndScreenThumbnail(@Nullable final Bitmap thumbnail) {
    method calculateMaxEndScreenThumbnailHeight (line 506) | protected abstract float calculateMaxEndScreenThumbnailHeight(@NonNull...
    method onUpdateProgress (line 515) | @Override
    method updatePlayBackElementsCurrentDuration (line 544) | private void updatePlayBackElementsCurrentDuration(final int currentPr...
    method setVideoDurationToControls (line 557) | private void setVideoDurationToControls(final int duration) {
    method onProgressChanged (line 567) | @Override // seekbar listener
    method adjustSeekbarPreviewContainer (line 593) | private void adjustSeekbarPreviewContainer() {
    method onStartTrackingTouch (line 628) | @Override // seekbar listener
    method onStopTrackingTouch (line 644) | @Override // seekbar listener
    method isControlsVisible (line 676) | public boolean isControlsVisible() {
    method showControlsThenHide (line 680) | public void showControlsThenHide() {
    method showControls (line 697) | public void showControls(final long duration) {
    method hideControls (line 708) | public void hideControls(final long duration, final long delay) {
    method showHideShadow (line 724) | public void showHideShadow(final boolean show, final long duration) {
    method showOrHideButtons (line 730) | protected void showOrHideButtons() {
    method showSystemUIPartially (line 745) | protected void showSystemUIPartially() {
    method hideSystemUIIfNeeded (line 749) | protected void hideSystemUIIfNeeded() {
    method isAnyListViewOpen (line 753) | protected boolean isAnyListViewOpen() {
    method isFullscreen (line 758) | public boolean isFullscreen() {
    method updatePlayPauseButton (line 768) | private void updatePlayPauseButton(final PlayButtonAction action) {
    method onPrepared (line 793) | @Override
    method onBlocked (line 800) | @Override
    method onPlaying (line 820) | @Override
    method onBuffering (line 846) | @Override
    method onPaused (line 854) | @Override
    method onPausedSeek (line 877) | @Override
    method onCompleted (line 884) | @Override
    method animatePlayButtons (line 905) | private void animatePlayButtons(final boolean show, final long duratio...
    method onRepeatClicked (line 936) | public void onRepeatClicked() {
    method onShuffleClicked (line 943) | public void onShuffleClicked() {
    method onRepeatModeChanged (line 950) | @Override
    method onShuffleModeEnabledChanged (line 966) | @Override
    method onMuteUnmuteChanged (line 972) | @Override
    method setMuteButton (line 978) | private void setMuteButton(final boolean isMuted) {
    method setShuffleButton (line 983) | private void setShuffleButton(final boolean shuffled) {
    method onPlaybackParametersChanged (line 994) | @Override
    method onRenderedFirstFrame (line 1000) | @Override
    method onMetadataChanged (line 1014) | @Override
    method updateStreamRelatedViews (line 1026) | private void updateStreamRelatedViews() {
    method buildQualityMenu (line 1088) | private void buildQualityMenu() {
    method buildAudioTrackMenu (line 1114) | private void buildAudioTrackMenu() {
    method buildPlaybackSpeedMenu (line 1142) | private void buildPlaybackSpeedMenu() {
    method buildCaptionMenu (line 1157) | private void buildCaptionMenu(@NonNull final List<String> availableLan...
    method onPlaybackSpeedClicked (line 1239) | protected abstract void onPlaybackSpeedClicked();
    method onQualityClicked (line 1241) | private void onQualityClicked() {
    method onAudioTracksClicked (line 1250) | private void onAudioTracksClicked() {
    method onMenuItemClick (line 1258) | @Override
    method onQualityItemClick (line 1283) | private void onQualityItemClick(@NonNull final MenuItem menuItem) {
    method onAudioTrackItemClick (line 1303) | private void onAudioTrackItemClick(@NonNull final MenuItem menuItem) {
    method onDismiss (line 1327) | @Override
    method onCaptionClicked (line 1342) | private void onCaptionClicked() {
    method isSomePopupMenuVisible (line 1350) | public boolean isSomePopupMenuVisible() {
    method onTextTracksChanged (line 1361) | @Override
    method onCues (line 1404) | @Override
    method setupSubtitleView (line 1410) | private void setupSubtitleView() {
    method setupSubtitleView (line 1421) | protected abstract void setupSubtitleView(float captionScale);
    method makeOnClickListener (line 1436) | protected View.OnClickListener makeOnClickListener(@NonNull final Runn...
    method onKeyDown (line 1465) | public boolean onKeyDown(final int keyCode) {
    method onMoreOptionsClicked (line 1504) | private void onMoreOptionsClicked() {
    method onPlayWithKodiClicked (line 1526) | private void onPlayWithKodiClicked() {
    method onOpenInBrowserClicked (line 1533) | private void onOpenInBrowserClicked() {
    method setResizeMode (line 1545) | protected void setResizeMode(@AspectRatioFrameLayout.ResizeMode final ...
    method onResizeClicked (line 1550) | void onResizeClicked() {
    method onVideoSizeChanged (line 1554) | @Override
    method setupVideoSurfaceIfNeeded (line 1581) | public void setupVideoSurfaceIfNeeded() {
    method clearVideoSurface (line 1606) | private void clearVideoSurface() {
    method getBinding (line 1624) | public PlayerBinding getBinding() {
    method getGestureDetector (line 1628) | public GestureDetector getGestureDetector() {

FILE: app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java
  class AppearanceSettingsFragment (line 16) | public class AppearanceSettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 18) | @Override
    method onPreferenceTreeClick (line 57) | @Override
    method applyThemeChange (line 70) | private void applyThemeChange(final String beginningThemeKey,

FILE: app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java
  class BackupRestoreSettingsFragment (line 44) | public class BackupRestoreSettingsFragment extends BasePreferenceFragment {
    method onAttach (line 61) | @Override
    method onCreatePreferences (line 67) | @Override
    method requestExportPathResult (line 145) | private void requestExportPathResult(final ActivityResult result) {
    method requestImportPathResult (line 157) | private void requestImportPathResult(final ActivityResult result) {
    method exportDatabase (line 175) | private void exportDatabase(final StoredFileHelper file, final Uri exp...
    method importDatabase (line 192) | private void importDatabase(final StoredFileHelper file, final Uri imp...
    method cleanImport (line 255) | private void cleanImport(@NonNull final Context context,
    method finishImport (line 286) | private void finishImport(final Uri importDataUri) {
    method getImportExportDataUri (line 293) | private Uri getImportExportDataUri() {
    method saveLastImportExportDataUri (line 298) | private void saveLastImportExportDataUri(final Uri importExportDataUri) {
    method showErrorSnackbar (line 304) | private void showErrorSnackbar(final Throwable e, final String request) {
    method createErrorNotification (line 308) | private void createErrorNotification(final Throwable e, final String r...

FILE: app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java
  class BasePreferenceFragment (line 19) | public abstract class BasePreferenceFragment extends PreferenceFragmentC...
    method onCreate (line 25) | @Override
    method addPreferencesFromResourceRegistry (line 31) | protected void addPreferencesFromResourceRegistry() {
    method onViewCreated (line 36) | @Override
    method onResume (line 44) | @Override
    method requirePreference (line 50) | @NonNull

FILE: app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java
  class ContentSettingsFragment (line 28) | public class ContentSettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 31) | @Override
    method setupAppLanguagePreferences (line 41) | private void setupAppLanguagePreferences() {
    method setupImageQualityPref (line 72) | private void setupImageQualityPref() {
    method onPreferenceTreeClick (line 87) | @Override
    method onDestroy (line 101) | @Override

FILE: app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java
  class DebugSettingsFragment (line 16) | public class DebugSettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 19) | @Override
    method getBVDLeakCanary (line 80) | private Optional<DebugSettingsBVDLeakCanaryAPI> getBVDLeakCanary() {
    type DebugSettingsBVDLeakCanaryAPI (line 96) | public interface DebugSettingsBVDLeakCanaryAPI {
      method getNewLeakDisplayActivityIntent (line 100) | Intent getNewLeakDisplayActivityIntent();

FILE: app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java
  class DownloadSettingsFragment (line 31) | public class DownloadSettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 49) | @Override
    method onAttach (line 84) | @Override
    method onDetach (line 90) | @Override
    method updatePreferencesSummary (line 97) | private void updatePreferencesSummary() {
    method showPathInSummary (line 104) | private void showPathInSummary(final String prefKey, @StringRes final ...
    method isFileUri (line 117) | private boolean isFileUri(final String path) {
    method hasInvalidPath (line 121) | private boolean hasInvalidPath(final String prefKey) {
    method updatePathPickers (line 126) | private void updatePathPickers(final boolean enabled) {
    method forgetSAFTree (line 132) | private void forgetSAFTree(final Context context, final String oldPath) {
    method showMessageDialog (line 154) | private void showMessageDialog(@StringRes final int title, @StringRes ...
    method onPreferenceTreeClick (line 162) | @Override
    method launchDirectoryPicker (line 192) | private void launchDirectoryPicker(final ActivityResultLauncher<Intent...
    method requestDownloadVideoPathResult (line 201) | private void requestDownloadVideoPathResult(final ActivityResult resul...
    method requestDownloadAudioPathResult (line 205) | private void requestDownloadAudioPathResult(final ActivityResult resul...
    method requestDownloadPathResult (line 209) | private void requestDownloadPathResult(final ActivityResult result, fi...

FILE: app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java
  class ExoPlayerSettingsFragment (line 13) | public class ExoPlayerSettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 15) | @Override

FILE: app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java
  class HistorySettingsFragment (line 24) | public class HistorySettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 32) | @Override
    method onPreferenceTreeClick (line 59) | @Override
    method getDeletePlaybackStatesDisposable (line 77) | private static Disposable getDeletePlaybackStatesDisposable(
    method getWholeStreamHistoryDisposable (line 89) | private static Disposable getWholeStreamHistoryDisposable(
    method getRemoveOrphanedRecordsDisposable (line 101) | private static Disposable getRemoveOrphanedRecordsDisposable(
    method getDeleteSearchHistoryDisposable (line 112) | private static Disposable getDeleteSearchHistoryDisposable(
    method openDeleteWatchHistoryDialog (line 124) | public static void openDeleteWatchHistoryDialog(@NonNull final Context...
    method openDeletePlaybackStatesDialog (line 138) | public static void openDeletePlaybackStatesDialog(@NonNull final Conte...
    method openDeleteSearchHistoryDialog (line 149) | public static void openDeleteSearchHistoryDialog(@NonNull final Contex...

FILE: app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java
  class MainSettingsFragment (line 14) | public class MainSettingsFragment extends BasePreferenceFragment {
    method onCreatePreferences (line 19) | @Override
    method onCreateOptionsMenu (line 40) | @Override
    method onDestroy (line 62) | @Override

FILE: app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java
  class NewPipeSettings (line 45) | public final class NewPipeSettings {
    method NewPipeSettings (line 46) | private NewPipeSettings() { }
    method initSettings (line 48) | public static void initSettings(final Context context) {
    method saveDefaultVideoDownloadDirectory (line 70) | static void saveDefaultVideoDownloadDirectory(final Context context) {
    method saveDefaultAudioDownloadDirectory (line 75) | static void saveDefaultAudioDownloadDirectory(final Context context) {
    method saveDefaultDirectory (line 80) | private static void saveDefaultDirectory(final Context context, final ...
    method getDir (line 96) | @NonNull
    method getNewPipeChildFolderPathForDir (line 101) | private static String getNewPipeChildFolderPathForDir(final File dir) {
    method useStorageAccessFramework (line 105) | public static boolean useStorageAccessFramework(final Context context) {
    method showSearchSuggestions (line 120) | private static boolean showSearchSuggestions(final Context context,
    method showLocalSearchSuggestions (line 133) | public static boolean showLocalSearchSuggestions(final Context context,
    method showRemoteSearchSuggestions (line 139) | public static boolean showRemoteSearchSuggestions(final Context context,
    method disableMediaTunnelingIfNecessary (line 145) | private static void disableMediaTunnelingIfNecessary(@NonNull final Co...
    method setMediaTunneling (line 172) | public static void setMediaTunneling(@NonNull final Context context) {

FILE: app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java
  class PeertubeInstanceListFragment (line 50) | public class PeertubeInstanceListFragment extends Fragment {
    method onCreate (line 64) | @Override
    method onCreateView (line 75) | @Override
    method onViewCreated (line 82) | @Override
    method onResume (line 100) | @Override
    method onPause (line 107) | @Override
    method onDestroy (line 113) | @Override
    method onDestroyView (line 122) | @Override
    method onCreateOptionsMenu (line 132) | @Override
    method onOptionsItemSelected (line 139) | @Override
    method selectInstance (line 153) | private void selectInstance(final PeertubeInstance instance) {
    method saveChanges (line 158) | private void saveChanges() {
    method restoreDefaults (line 170) | private void restoreDefaults() {
    method showAddItemDialog (line 184) | private void showAddItemDialog(final Context c) {
    method addInstance (line 202) | private void addInstance(final String url) {
    method cleanUrl (line 224) | @Nullable
    method add (line 250) | private void add(final PeertubeInstance instance) {
    method getItemTouchCallback (line 256) | private ItemTouchHelper.SimpleCallback getItemTouchCallback() {
    class InstanceListAdapter (line 322) | private class InstanceListAdapter
      method InstanceListAdapter (line 328) | InstanceListAdapter(final Context context, final ItemTouchHelper ite...
      method swapItems (line 334) | public void swapItems(final int fromPosition, final int toPosition) {
      method onCreateViewHolder (line 340) | @NonNull
      method onBindViewHolder (line 348) | @Override
      class TabViewHolder (line 354) | class TabViewHolder extends RecyclerView.ViewHolder {
        method TabViewHolder (line 357) | TabViewHolder(final ItemInstanceBinding binding) {
        method bind (line 362) | @SuppressLint("ClickableViewAccessibility")
    class PeertubeInstanceCallback (line 399) | private static final class PeertubeInstanceCallback
      method areItemsTheSame (line 401) | @Override
      method areContentsTheSame (line 407) | @Override

FILE: app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java
  class SelectChannelFragment (line 54) | public class SelectChannelFragment extends DialogFragment {
    method setOnSelectedListener (line 65) | public void setOnSelectedListener(final OnSelectedListener listener) {
    method setOnCancelListener (line 69) | public void setOnCancelListener(final OnCancelListener listener) {
    method onCreate (line 77) | @Override
    method onCreateView (line 83) | @Override
    method onCancel (line 112) | @Override
    method clickedItem (line 120) | private void clickedItem(final int position) {
    method displayChannels (line 133) | private void displayChannels(final List<SubscriptionEntity> newSubscri...
    method getSubscriptionObserver (line 144) | private Observer<List<SubscriptionEntity>> getSubscriptionObserver() {
    type OnSelectedListener (line 169) | public interface OnSelectedListener {
      method onChannelSelected (line 170) | void onChannelSelected(int serviceId, String url, String name);
    type OnCancelListener (line 173) | public interface OnCancelListener {
      method onCancel (line 174) | void onCancel();
    class SelectChannelAdapter (line 177) | private final class SelectChannelAdapter
      method onCreateViewHolder (line 179) | @NonNull
      method onBindViewHolder (line 188) | @Override
      method getItemCount (line 196) | @Override
      class SelectChannelItemHolder (line 201) | public class SelectChannelItemHolder extends RecyclerView.ViewHolder {
        method SelectChannelItemHolder (line 205) | SelectChannelItemHolder(final View v) {

FILE: app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java
  class SelectFeedGroupFragment (line 54) | public class SelectFeedGroupFragment extends DialogFragment {
    method setOnSelectedListener (line 65) | public void setOnSelectedListener(final OnSelectedListener listener) {
    method setOnCancelListener (line 69) | public void setOnCancelListener(final OnCancelListener listener) {
    method onCreate (line 77) | @Override
    method onCreateView (line 83) | @Override
    method onCancel (line 112) | @Override
    method clickedItem (line 120) | private void clickedItem(final int position) {
    m
Copy disabled (too large) Download .json
Condensed preview — 3907 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,936K chars).
[
  {
    "path": ".editorconfig",
    "chars": 592,
    "preview": "#\n# SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n# SPDX-License-Identifier: GPL-3.0-or-later\n#\n\nroo"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 8978,
    "preview": "### Please do **not** open pull requests for *new features* now, as we are planning to rewrite large chunks of the code."
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/questions.yml",
    "chars": 1440,
    "preview": "body:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this form! :hugs:"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 61,
    "preview": "liberapay: TeamNewPipe\ncustom: 'https://newpipe.net/donate/'\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 4593,
    "preview": "name: Bug report\ndescription: Create a bug report to help us improve\nlabels: [bug, needs triage]\nbody:\n  - type: markdow"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 424,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: ❓ Question\n    url: https://github.com/TeamNewPipe/NewPipe/discussi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 2480,
    "preview": "name: Feature request\ndescription: Suggest an idea for this project\nlabels: [feature request, needs triage]\nbody:\n  - ty"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 2338,
    "preview": "<!-- Hey there. Thank you so much for improving NewPipe, and filling out the details. Having roughly the same layout hel"
  },
  {
    "path": ".github/changed-lines-count-labeler.yml",
    "chars": 376,
    "preview": "# Add 'size/small' label to any changes with less than 50 lines\nsize/small:\n  max: 49\n\n# Add 'size/medium' label to any "
  },
  {
    "path": ".github/workflows/backport-pr.yml",
    "chars": 1662,
    "preview": "name: Backport merged pull request\non:\n  issue_comment:\n    types: [created]\npermissions:\n  contents: write # for commen"
  },
  {
    "path": ".github/workflows/build-release-apk.yml",
    "chars": 1205,
    "preview": "name: \"Build unsigned release APK on master\"\n\non:\n  workflow_dispatch:\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 3747,
    "preview": "name: CI\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches:\n      - dev\n      - master\n      - refactor\n      - rel"
  },
  {
    "path": ".github/workflows/image-minimizer.js",
    "chars": 6169,
    "preview": "/*\n * Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise\n */\nmodul"
  },
  {
    "path": ".github/workflows/image-minimizer.yml",
    "chars": 740,
    "preview": "name: Image Minimizer\n\non:\n  issue_comment:\n    types: [created, edited]\n  issues:\n    types: [opened, edited]\n  pull_re"
  },
  {
    "path": ".github/workflows/no-response.yml",
    "chars": 512,
    "preview": "name: No Response\n\n# Both `issue_comment` and `scheduled` event types are required for this Action\n# to work properly.\no"
  },
  {
    "path": ".github/workflows/pr-labeler.yml",
    "chars": 513,
    "preview": "name: \"PR size labeler\"\non: [pull_request_target]\npermissions:\n  contents: read\n  pull-requests: write\n\njobs:\n  changed-"
  },
  {
    "path": ".gitignore",
    "chars": 208,
    "preview": ".gradle/\nlocal.properties\n.DS_Store\nbuild/\ncaptures/\n.idea/\n*.iml\n*~\n.weblate\n.kotlin\n*.class\napp/debug/\napp/release/\n\n#"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 14354,
    "preview": "<h3 align=\"center\">We are <i>rewriting</i> large chunks of the codebase, to bring about <a href=\"https://newpipe.net/blo"
  },
  {
    "path": "app/build.gradle.kts",
    "chars": 9940,
    "preview": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */"
  },
  {
    "path": "app/lint.xml",
    "chars": 343,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>\n  ~ SP"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 2282,
    "preview": "# https://developer.android.com/build/shrink-code\n\n## Helps debug release versions\n-dontobfuscate\n\n## Rules for NewPipeE"
  },
  {
    "path": "app/sampledata/channels.json",
    "chars": 1476,
    "preview": "{\n  \"data\": [\n    {\n      \"name\": \"BBC\",\n      \"additional\": \"12K subscribers•233 videos\",\n      \"description\": \"The BBC"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/2.json",
    "chars": 14456,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 2,\n    \"identityHash\": \"b7856223e2595ddf20a3ce6243ce9527\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/3.json",
    "chars": 21783,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"9f825b1ee281480bedd38b971feac327\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/4.json",
    "chars": 22134,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"d8070091972a7011bce18aed62f80b90\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/5.json",
    "chars": 22352,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"096731b513bb71dd44517639f4a2c1e3\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/6.json",
    "chars": 22896,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"4084aa342aef315dc7b558770a7755a9\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/7.json",
    "chars": 22927,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"012fc8e7ad3333f1597347f34e76a513\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/8.json",
    "chars": 22927,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"012fc8e7ad3333f1597347f34e76a513\",\n    \"e"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/9.json",
    "chars": 22737,
    "preview": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"7591e8039faa74d8c0517dc867af9d3e\",\n    \"e"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt",
    "chars": 12904,
    "preview": "package org.schabi.newpipe.database\n\nimport android.content.ContentValues\nimport android.database.sqlite.SQLiteDatabase\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt",
    "chars": 6496,
    "preview": "package org.schabi.newpipe.database\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core."
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.java",
    "chars": 2397,
    "preview": "package org.schabi.newpipe.error;\n\nimport android.os.Parcel;\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\nimpo"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt",
    "chars": 8249,
    "preview": "package org.schabi.newpipe.local.history\n\nimport androidx.test.core.app.ApplicationProvider\nimport java.time.LocalDateTi"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt",
    "chars": 2779,
    "preview": "package org.schabi.newpipe.local.playlist\n\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport o"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java",
    "chars": 3310,
    "preview": "package org.schabi.newpipe.local.subscription;\n\nimport static org.junit.Assert.assertEquals;\n\nimport androidx.test.core."
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/testUtil/TestDatabase.kt",
    "chars": 1034,
    "preview": "package org.schabi.newpipe.testUtil\n\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport "
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt",
    "chars": 1330,
    "preview": "package org.schabi.newpipe.testUtil\n\nimport io.reactivex.rxjava3.android.plugins.RxAndroidPlugins\nimport io.reactivex.rx"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt",
    "chars": 14504,
    "preview": "package org.schabi.newpipe.util\n\nimport android.content.Context\nimport android.view.View\nimport android.view.View.GONE\ni"
  },
  {
    "path": "app/src/debug/AndroidManifest.xml",
    "chars": 262,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "app/src/debug/java/org/schabi/newpipe/DebugApp.kt",
    "chars": 1844,
    "preview": "package org.schabi.newpipe\n\nimport androidx.preference.PreferenceManager\nimport com.facebook.stetho.Stetho\nimport com.fa"
  },
  {
    "path": "app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsBVDLeakCanary.java",
    "chars": 640,
    "preview": "package org.schabi.newpipe.settings;\n\nimport android.content.Intent;\n\nimport leakcanary.LeakCanary;\n\n/**\n * Build varian"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 20366,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "app/src/main/assets/apache2.html",
    "chars": 10575,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <t"
  },
  {
    "path": "app/src/main/assets/epl1.html",
    "chars": 12870,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n        \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio"
  },
  {
    "path": "app/src/main/assets/gpl_3.html",
    "chars": 34479,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n\n<html"
  },
  {
    "path": "app/src/main/assets/mit.html",
    "chars": 1519,
    "preview": "<html>\n<head></head>\n<body>\n<p>Copyright (c) &lt;year&gt; &lt;copyright holders&gt;</p>\n\n<p>Permission is hereby granted"
  },
  {
    "path": "app/src/main/assets/mpl2.html",
    "chars": 18009,
    "preview": "<!DOCTYPE html>\n<!-- saved from url=(0038)https://www.mozilla.org/en-US/MPL/2.0/ -->\n<html>\n<head>\n    <meta http-equiv="
  },
  {
    "path": "app/src/main/assets/po_token.html",
    "chars": 4000,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\"><head><title></title><script>\n/**\n * Factory method to create and load a BotGuardClient "
  },
  {
    "path": "app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java",
    "chars": 13630,
    "preview": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "app/src/main/java/com/google/android/material/appbar/FlingBehavior.java",
    "chars": 6074,
    "preview": "package com.google.android.material.appbar;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport androi"
  },
  {
    "path": "app/src/main/java/org/apache/commons/text/similarity/FuzzyScore.java",
    "chars": 5463,
    "preview": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOT"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/App.kt",
    "chars": 12048,
    "preview": "package org.schabi.newpipe\n\nimport android.app.ActivityManager\nimport android.app.Application\nimport android.content.Con"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/BaseFragment.java",
    "chars": 4947,
    "preview": "package org.schabi.newpipe;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.util.Log;\nimport a"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/DownloaderImpl.java",
    "chars": 6592,
    "preview": "package org.schabi.newpipe;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport androidx.annota"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ExitActivity.kt",
    "chars": 1073,
    "preview": "/*\n * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/MainActivity.java",
    "chars": 45014,
    "preview": "/*\n * Created by Christian Schabesberger on 02.08.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabe"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt",
    "chars": 2547,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt",
    "chars": 7676,
    "preview": "package org.schabi.newpipe\n\nimport android.content.Context\nimport android.content.Intent\nimport android.util.Log\nimport "
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/PanicResponderActivity.java",
    "chars": 1685,
    "preview": "package org.schabi.newpipe;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java",
    "chars": 4117,
    "preview": "package org.schabi.newpipe;\n\nimport static org.schabi.newpipe.util.SparseItemUtil.fetchStreamInfoAndSaveToDatabase;\nimpo"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/RouterActivity.java",
    "chars": 47741,
    "preview": "package org.schabi.newpipe;\n\nimport static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUD"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt",
    "chars": 8946,
    "preview": "package org.schabi.newpipe.about\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.MenuIt"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/License.kt",
    "chars": 312,
    "preview": "package org.schabi.newpipe.about\n\nimport android.os.Parcelable\nimport java.io.Serializable\nimport kotlinx.parcelize.Parc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt",
    "chars": 5655,
    "preview": "package org.schabi.newpipe.about\n\nimport android.os.Bundle\nimport android.util.Base64\nimport android.view.LayoutInflater"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt",
    "chars": 2085,
    "preview": "package org.schabi.newpipe.about\n\nimport android.content.Context\nimport java.io.IOException\nimport org.schabi.newpipe.R\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt",
    "chars": 375,
    "preview": "package org.schabi.newpipe.about\n\nimport android.os.Parcelable\nimport java.io.Serializable\nimport kotlinx.parcelize.Parc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/StandardLicenses.kt",
    "chars": 608,
    "preview": "package org.schabi.newpipe.about\n\n/**\n * Class containing information about standard software licenses.\n */\nobject Stand"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt",
    "chars": 2890,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt",
    "chars": 905,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/Converters.kt",
    "chars": 1455,
    "preview": "package org.schabi.newpipe.database\n\nimport androidx.room.TypeConverter\nimport java.time.Instant\nimport java.time.Offset"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/LocalItem.kt",
    "chars": 458,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2020 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/Migrations.kt",
    "chars": 15520,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt",
    "chars": 8195,
    "preview": "package org.schabi.newpipe.database.feed.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room."
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedGroupDAO.kt",
    "chars": 2546,
    "preview": "package org.schabi.newpipe.database.feed.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room."
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt",
    "chars": 1595,
    "preview": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport andro"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt",
    "chars": 1029,
    "preview": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport andro"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt",
    "chars": 1680,
    "preview": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport andro"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt",
    "chars": 1255,
    "preview": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport andro"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt",
    "chars": 1619,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2021 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt",
    "chars": 2340,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt",
    "chars": 1289,
    "preview": "/*\n * SPDX-FileCopyrightText: 2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e."
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt",
    "chars": 2033,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt",
    "chars": 1435,
    "preview": "package org.schabi.newpipe.database.history.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport "
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt",
    "chars": 1935,
    "preview": "/*\n * SPDX-FileCopyrightText: 2023-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.kt",
    "chars": 444,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt",
    "chars": 1333,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt",
    "chars": 1680,
    "preview": "/*\n * SPDX-FileCopyrightText: 2020-2023 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt",
    "chars": 1470,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt",
    "chars": 2016,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt",
    "chars": 5062,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt",
    "chars": 1726,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt",
    "chars": 3859,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt",
    "chars": 2422,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2020 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt",
    "chars": 1931,
    "preview": "/*\n * SPDX-FileCopyrightText: 2020-2023 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/StreamWithState.kt",
    "chars": 409,
    "preview": "package org.schabi.newpipe.database.stream\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport org.sch"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt",
    "chars": 5458,
    "preview": "package org.schabi.newpipe.database.stream.dao\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Dao\nimport androidx"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt",
    "chars": 1642,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2021 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt",
    "chars": 4785,
    "preview": "package org.schabi.newpipe.database.stream.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport and"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt",
    "chars": 3558,
    "preview": "/*\n * SPDX-FileCopyrightText: 2018-2023 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.kt",
    "chars": 570,
    "preview": "/*\n * SPDX-FileCopyrightText: 2021 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e."
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt",
    "chars": 3908,
    "preview": "package org.schabi.newpipe.database.subscription\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.r"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt",
    "chars": 3020,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java",
    "chars": 3055,
    "preview": "package org.schabi.newpipe.download;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.Menu;"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java",
    "chars": 48169,
    "preview": "package org.schabi.newpipe.download;\n\nimport static org.schabi.newpipe.extractor.stream.DeliveryMethod.PROGRESSIVE_HTTP;"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/download/LoadingDialog.java",
    "chars": 2886,
    "preview": "package org.schabi.newpipe.download;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.LayoutInfla"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/AcraReportSender.java",
    "chars": 1493,
    "preview": "package org.schabi.newpipe.error;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport org.acra"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/AcraReportSenderFactory.java",
    "chars": 1525,
    "preview": "package org.schabi.newpipe.error;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport com.goog"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorActivity.kt",
    "chars": 10791,
    "preview": "/*\n * SPDX-FileCopyrightText: 2015-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt",
    "chars": 15492,
    "preview": "package org.schabi.newpipe.error\n\nimport android.content.Context\nimport android.os.Parcelable\nimport androidx.annotation"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt",
    "chars": 4818,
    "preview": "package org.schabi.newpipe.error\n\nimport android.content.Context\nimport android.content.Intent\nimport android.view.View\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt",
    "chars": 8038,
    "preview": "package org.schabi.newpipe.error\n\nimport android.app.Activity\nimport android.app.PendingIntent\nimport android.content.Co"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java",
    "chars": 8801,
    "preview": "package org.schabi.newpipe.error;\n\nimport android.annotation.SuppressLint;\nimport android.content.Intent;\nimport android"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/UserAction.kt",
    "chars": 1702,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/BackPressable.java",
    "chars": 295,
    "preview": "package org.schabi.newpipe.fragments;\n\n/**\n * Indicates that the current fragment can handle back presses.\n */\npublic in"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java",
    "chars": 6667,
    "preview": "package org.schabi.newpipe.fragments;\n\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\n\nimport android.os.Bundle"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/BlankFragment.java",
    "chars": 1957,
    "preview": "package org.schabi.newpipe.fragments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java",
    "chars": 1194,
    "preview": "package org.schabi.newpipe.fragments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java",
    "chars": 13145,
    "preview": "package org.schabi.newpipe.fragments;\n\nimport static android.widget.RelativeLayout.ABOVE;\nimport static android.widget.R"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/OnScrollBelowItemsListener.java",
    "chars": 1931,
    "preview": "package org.schabi.newpipe.fragments;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.LinearLay"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/ViewContract.java",
    "chars": 212,
    "preview": "package org.schabi.newpipe.fragments;\n\npublic interface ViewContract<I> {\n    void showLoading();\n\n    void hideLoading("
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java",
    "chars": 11187,
    "preview": "package org.schabi.newpipe.fragments.detail;\n\nimport static android.text.TextUtils.isEmpty;\nimport static org.schabi.new"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java",
    "chars": 4572,
    "preview": "package org.schabi.newpipe.fragments.detail;\n\nimport static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_L"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/StackItem.java",
    "chars": 1210,
    "preview": "package org.schabi.newpipe.fragments.detail;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.player.play"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdapter.java",
    "chars": 2960,
    "preview": "package org.schabi.newpipe.fragments.detail;\n\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java",
    "chars": 107354,
    "preview": "package org.schabi.newpipe.fragments.detail;\n\nimport static android.text.TextUtils.isEmpty;\nimport static org.schabi.new"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailPlayerCrasher.java",
    "chars": 5650,
    "preview": "package org.schabi.newpipe.fragments.detail;\n\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_B"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java",
    "chars": 16819,
    "preview": "package org.schabi.newpipe.fragments.list;\n\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java",
    "chars": 9863,
    "preview": "package org.schabi.newpipe.fragments.list;\n\nimport static org.schabi.newpipe.extractor.ServiceList.SoundCloud;\n\nimport a"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/ListViewContract.java",
    "chars": 239,
    "preview": "package org.schabi.newpipe.fragments.list;\n\nimport org.schabi.newpipe.fragments.ViewContract;\n\npublic interface ListView"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java",
    "chars": 2823,
    "preview": "package org.schabi.newpipe.fragments.list.channel;\n\nimport static org.schabi.newpipe.extractor.stream.StreamExtractor.UN"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java",
    "chars": 26438,
    "preview": "package org.schabi.newpipe.fragments.list.channel;\n\nimport static org.schabi.newpipe.ktx.TextViewUtils.animateTextColor;"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java",
    "chars": 7177,
    "preview": "package org.schabi.newpipe.fragments.list.channel;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.vi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java",
    "chars": 7108,
    "preview": "package org.schabi.newpipe.fragments.list.comments;\n\nimport static org.schabi.newpipe.util.ServiceHelper.getServiceById;"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java",
    "chars": 893,
    "preview": "package org.schabi.newpipe.fragments.list.comments;\n\nimport org.schabi.newpipe.extractor.ListInfo;\nimport org.schabi.new"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java",
    "chars": 4242,
    "preview": "package org.schabi.newpipe.fragments.list.comments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimpor"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java",
    "chars": 1813,
    "preview": "package org.schabi.newpipe.fragments.list.kiosk;\n\nimport android.os.Bundle;\n\nimport org.schabi.newpipe.error.ErrorInfo;\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java",
    "chars": 6771,
    "preview": "package org.schabi.newpipe.fragments.list.kiosk;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport a"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistControlViewHolder.java",
    "chars": 294,
    "preview": "package org.schabi.newpipe.fragments.list.playlist;\n\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\n\n/**\n * Inter"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java",
    "chars": 20441,
    "preview": "package org.schabi.newpipe.fragments.list.playlist;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isBlank;\nimp"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java",
    "chars": 44785,
    "preview": "package org.schabi.newpipe.fragments.list.search;\n\nimport static androidx.recyclerview.widget.ItemTouchHelper.Callback.m"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.kt",
    "chars": 540,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.kt",
    "chars": 2790,
    "preview": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java",
    "chars": 7393,
    "preview": "package org.schabi.newpipe.fragments.list.videos;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\ni"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsInfo.java",
    "chars": 869,
    "preview": "package org.schabi.newpipe.fragments.list.videos;\n\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.kt",
    "chars": 841,
    "preview": "/*\n * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java",
    "chars": 14013,
    "preview": "package org.schabi.newpipe.info_list;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.Layo"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt",
    "chars": 572,
    "preview": "/*\n * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt",
    "chars": 2381,
    "preview": "package org.schabi.newpipe.info_list\n\nimport android.util.Log\nimport com.xwray.groupie.GroupieAdapter\nimport kotlin.math"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt",
    "chars": 2447,
    "preview": "package org.schabi.newpipe.info_list\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport "
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java",
    "chars": 15769,
    "preview": "package org.schabi.newpipe.info_list.dialog;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\n\nimport android.app.A"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java",
    "chars": 7285,
    "preview": "package org.schabi.newpipe.info_list.dialog;\n\nimport static org.schabi.newpipe.util.NavigationHelper.openChannelFragment"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogEntry.java",
    "chars": 839,
    "preview": "package org.schabi.newpipe.info_list.dialog;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimpor"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java",
    "chars": 773,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport androidx.annotation.Nullable;\n\nimpo"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelGridInfoItemHolder.java",
    "chars": 456,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java",
    "chars": 1233,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java",
    "chars": 4898,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.wi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java",
    "chars": 8744,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport static org.schabi.newpipe.util.ServiceHelper.getServiceById;\nimport"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java",
    "chars": 1834,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java",
    "chars": 495,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistGridInfoItemHolder.java",
    "chars": 461,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistInfoItemHolder.java",
    "chars": 410,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java",
    "chars": 2636,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport and"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java",
    "chars": 447,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java",
    "chars": 411,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java",
    "chars": 3606,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.text.TextUtils;\nimport android.view.ViewGroup;\nimport andro"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java",
    "chars": 6472,
    "preview": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.wi"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt",
    "chars": 377,
    "preview": "package org.schabi.newpipe.ktx\n\nimport android.graphics.Bitmap\nimport android.graphics.Rect\nimport androidx.core.graphic"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt",
    "chars": 686,
    "preview": "package org.schabi.newpipe.ktx\n\nimport android.os.Bundle\nimport android.os.Parcelable\nimport androidx.core.os.BundleComp"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/SharedPreferences.kt",
    "chars": 197,
    "preview": "package org.schabi.newpipe.ktx\n\nimport android.content.SharedPreferences\n\nfun SharedPreferences.getStringSafe(key: Strin"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/TextView.kt",
    "chars": 1496,
    "preview": "@file:JvmName(\"TextViewUtils\")\n\npackage org.schabi.newpipe.ktx\n\nimport android.animation.ArgbEvaluator\nimport android.an"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/Throwable.kt",
    "chars": 2299,
    "preview": "@file:JvmName(\"ExceptionUtils\")\n\npackage org.schabi.newpipe.ktx\n\nimport java.io.IOException\nimport java.io.InterruptedIO"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/View.kt",
    "chars": 10801,
    "preview": "@file:JvmName(\"ViewUtils\")\n\npackage org.schabi.newpipe.ktx\n\nimport android.animation.Animator\nimport android.animation.A"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java",
    "chars": 8906,
    "preview": "package org.schabi.newpipe.local;\n\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimpor"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/HeaderFooterHolder.java",
    "chars": 292,
    "preview": "package org.schabi.newpipe.local;\n\nimport android.view.View;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic "
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/LocalItemBuilder.java",
    "chars": 1529,
    "preview": "package org.schabi.newpipe.local;\n\nimport android.content.Context;\n\nimport org.schabi.newpipe.database.LocalItem;\nimport"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java",
    "chars": 17472,
    "preview": "package org.schabi.newpipe.local;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.View;\nim"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java",
    "chars": 21808,
    "preview": "package org.schabi.newpipe.local.bookmark;\n\nimport static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMer"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/bookmark/MergedPlaylistManager.java",
    "chars": 3794,
    "preview": "package org.schabi.newpipe.local.bookmark;\n\nimport org.schabi.newpipe.database.playlist.PlaylistLocalItem;\nimport org.sc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java",
    "chars": 7349,
    "preview": "package org.schabi.newpipe.local.dialog;\n\nimport static org.schabi.newpipe.database.playlist.model.PlaylistEntity.DEFAUL"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java",
    "chars": 3131,
    "preview": "package org.schabi.newpipe.local.dialog;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport android.text.Input"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistDialog.java",
    "chars": 6402,
    "preview": "package org.schabi.newpipe.local.dialog;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.cont"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt",
    "chars": 7049,
    "preview": "package org.schabi.newpipe.local.feed\n\nimport android.content.Context\nimport android.util.Log\nimport io.reactivex.rxjava"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt",
    "chars": 27366,
    "preview": "/*\n * Copyright 2019 Mauricio Colli <mauriciocolli@outlook.com>\n * FeedFragment.kt is part of NewPipe\n *\n * License: GPL"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt",
    "chars": 650,
    "preview": "package org.schabi.newpipe.local.feed\n\nimport androidx.annotation.StringRes\nimport java.time.OffsetDateTime\nimport org.s"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt",
    "chars": 7867,
    "preview": "package org.schabi.newpipe.local.feed\n\nimport android.app.Application\nimport android.content.Context\nimport androidx.cor"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt",
    "chars": 6627,
    "preview": "package org.schabi.newpipe.local.feed.item\n\nimport android.content.Context\nimport android.text.TextUtils\nimport android."
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt",
    "chars": 8119,
    "preview": "package org.schabi.newpipe.local.feed.notifications\n\nimport android.app.Notification\nimport android.app.NotificationMana"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt",
    "chars": 6775,
    "preview": "package org.schabi.newpipe.local.feed.notifications\n\nimport android.content.Context\nimport android.content.pm.ServiceInf"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt",
    "chars": 1321,
    "preview": "package org.schabi.newpipe.local.feed.notifications\n\nimport android.content.Context\nimport androidx.preference.Preferenc"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt",
    "chars": 1317,
    "preview": "package org.schabi.newpipe.local.feed.service\n\nimport androidx.annotation.StringRes\nimport io.reactivex.rxjava3.core.Flo"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt",
    "chars": 15742,
    "preview": "package org.schabi.newpipe.local.feed.service\n\nimport android.content.Context\nimport android.content.SharedPreferences\ni"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt",
    "chars": 8695,
    "preview": "/*\n * Copyright 2019 Mauricio Colli <mauriciocolli@outlook.com>\n * FeedLoadService.kt is part of NewPipe\n *\n * License: "
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt",
    "chars": 165,
    "preview": "package org.schabi.newpipe.local.feed.service\n\ndata class FeedLoadState(\n    val updateDescription: String,\n    val maxP"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedResultsHolder.kt",
    "chars": 468,
    "preview": "package org.schabi.newpipe.local.feed.service\n\nclass FeedResultsHolder {\n    /**\n     * List of errors that may have hap"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt",
    "chars": 2225,
    "preview": "package org.schabi.newpipe.local.feed.service\n\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport o"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java",
    "chars": 13843,
    "preview": "package org.schabi.newpipe.local.history;\n\n/*\n * Copyright (C) Mauricio Colli 2018\n * HistoryRecordManager.java is part "
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java",
    "chars": 14506,
    "preview": "package org.schabi.newpipe.local.history;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.os.P"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java",
    "chars": 2144,
    "preview": "package org.schabi.newpipe.local.holder;\n\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view"
  }
]

// ... and 3707 more files (download for full content)

About this extraction

This page contains the full source code of the TeamNewPipe/NewPipe GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3907 files (9.8 MB), approximately 2.8M tokens, and a symbol index with 4018 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!