From 3fb70c10de939f306350711e46aa8a8a2981111f Mon Sep 17 00:00:00 2001 From: Vetle Ledaal Date: Sun, 23 Mar 2025 16:05:54 +0100 Subject: [PATCH] Koharu: fix DTO & bypass Cloudflare (#8175) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Koharu - \r\n → \n * SchaleNetwork: fix loading & support related-manga * (SchaleNetwok/Koharu): Fix DTO & bypass Cloudflare (#128) * Fix DTO * Bypass CloudFlare Turnstile * Add tags filter select box which supports click on 'tag' to search * Allow permanent excluded tags * Revert fork specific Koharu changes * Bump version + lint --------- Co-authored-by: Cuong-Tran --- src/all/koharu/AndroidManifest.xml | 54 +- src/all/koharu/build.gradle | 2 +- .../tachiyomi/extension/all/koharu/Koharu.kt | 819 +++-- .../extension/all/koharu/KoharuDto.kt | 290 +- .../extension/all/koharu/KoharuFactory.kt | 24 +- .../extension/all/koharu/KoharuFilters.kt | 178 +- .../extension/all/koharu/KoharuTags.kt | 3087 +++++++++++++++++ .../all/koharu/TurnstileInterceptor.kt | 242 ++ 8 files changed, 4146 insertions(+), 550 deletions(-) create mode 100644 src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuTags.kt create mode 100644 src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/TurnstileInterceptor.kt diff --git a/src/all/koharu/AndroidManifest.xml b/src/all/koharu/AndroidManifest.xml index e1aa90b82..eb08b6427 100644 --- a/src/all/koharu/AndroidManifest.xml +++ b/src/all/koharu/AndroidManifest.xml @@ -1,27 +1,27 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/all/koharu/build.gradle b/src/all/koharu/build.gradle index ca3317aa1..ba938fd65 100644 --- a/src/all/koharu/build.gradle +++ b/src/all/koharu/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'SchaleNetwork' extClass = '.KoharuFactory' - extVersionCode = 12 + extVersionCode = 13 isNsfw = true } diff --git a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/Koharu.kt b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/Koharu.kt index 642383043..456103801 100644 --- a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/Koharu.kt +++ b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/Koharu.kt @@ -1,378 +1,441 @@ -package eu.kanade.tachiyomi.extension.all.koharu - -import android.content.SharedPreferences -import androidx.preference.ListPreference -import androidx.preference.PreferenceScreen -import androidx.preference.SwitchPreferenceCompat -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.interceptor.rateLimit -import eu.kanade.tachiyomi.source.ConfigurableSource -import eu.kanade.tachiyomi.source.model.FilterList -import eu.kanade.tachiyomi.source.model.MangasPage -import eu.kanade.tachiyomi.source.model.Page -import eu.kanade.tachiyomi.source.model.SChapter -import eu.kanade.tachiyomi.source.model.SManga -import eu.kanade.tachiyomi.source.model.UpdateStrategy -import eu.kanade.tachiyomi.source.online.HttpSource -import keiyoushi.utils.getPreferencesLazy -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.Response -import rx.Observable -import uy.kohesive.injekt.injectLazy -import java.text.SimpleDateFormat -import java.util.Locale - -class Koharu( - override val lang: String = "all", - private val searchLang: String = "", -) : HttpSource(), ConfigurableSource { - - override val name = "SchaleNetwork" - - override val baseUrl = "https://schale.network" - - override val id = if (lang == "en") 1484902275639232927 else super.id - - private val apiUrl = baseUrl.replace("://", "://api.") - - private val apiBooksUrl = "$apiUrl/books" - - override val supportsLatest = true - - override val client: OkHttpClient = network.cloudflareClient.newBuilder() - .rateLimit(1) - .build() - - private val json: Json by injectLazy() - - private val shortenTitleRegex = Regex("""(\[[^]]*]|[({][^)}]*[)}])""") - private fun String.shortenTitle() = replace(shortenTitleRegex, "").trim() - - private val preferences: SharedPreferences by getPreferencesLazy() - - private fun quality() = preferences.getString(PREF_IMAGERES, "1280")!! - - private fun remadd() = preferences.getBoolean(PREF_REM_ADD, false) - - private fun getDomain(): String { - try { - val noRedirectClient = client.newBuilder().followRedirects(false).build() - val host = noRedirectClient.newCall(GET(baseUrl, headers)).execute() - .headers["Location"]?.toHttpUrlOrNull()?.host - ?: return baseUrl - return "https://$host" - } catch (_: Exception) { - return baseUrl - } - } - - private val lazyHeaders by lazy { - val domain = getDomain() - headersBuilder() - .set("Referer", "$domain/") - .set("Origin", domain) - .build() - } - - private fun getManga(book: Entry) = SManga.create().apply { - setUrlWithoutDomain("${book.id}/${book.public_key}") - title = if (remadd()) book.title.shortenTitle() else book.title - thumbnail_url = book.thumbnail.path - } - - private fun getImagesByMangaEntry(entry: MangaEntry): Pair { - val data = entry.data - fun getIPK( - ori: DataKey?, - alt1: DataKey?, - alt2: DataKey?, - alt3: DataKey?, - alt4: DataKey?, - ): Pair { - return Pair( - ori?.id ?: alt1?.id ?: alt2?.id ?: alt3?.id ?: alt4?.id, - ori?.public_key ?: alt1?.public_key ?: alt2?.public_key ?: alt3?.public_key ?: alt4?.public_key, - ) - } - val (id, public_key) = when (quality()) { - "1600" -> getIPK(data.`1600`, data.`1280`, data.`0`, data.`980`, data.`780`) - "1280" -> getIPK(data.`1280`, data.`1600`, data.`0`, data.`980`, data.`780`) - "980" -> getIPK(data.`980`, data.`1280`, data.`0`, data.`1600`, data.`780`) - "780" -> getIPK(data.`780`, data.`980`, data.`0`, data.`1280`, data.`1600`) - else -> getIPK(data.`0`, data.`1600`, data.`1280`, data.`980`, data.`780`) - } - - if (id == null || public_key == null) { - throw Exception("No Images Found") - } - - val realQuality = when (id) { - data.`1600`?.id -> "1600" - data.`1280`?.id -> "1280" - data.`980`?.id -> "980" - data.`780`?.id -> "780" - else -> "0" - } - - val imagesResponse = client.newCall(GET("$apiBooksUrl/data/${entry.id}/${entry.public_key}/$id/$public_key?v=${entry.updated_at ?: entry.created_at}&w=$realQuality", lazyHeaders)).execute() - val images = imagesResponse.parseAs() to realQuality - return images - } - - // Latest - - override fun latestUpdatesRequest(page: Int) = GET("$apiBooksUrl?page=$page" + if (searchLang.isNotBlank()) "&s=language!:\"$searchLang\"" else "", lazyHeaders) - override fun latestUpdatesParse(response: Response) = popularMangaParse(response) - - // Popular - - override fun popularMangaRequest(page: Int) = GET("$apiBooksUrl?sort=8&page=$page" + if (searchLang.isNotBlank()) "&s=language!:\"$searchLang\"" else "", lazyHeaders) - override fun popularMangaParse(response: Response): MangasPage { - val data = response.parseAs() - - return MangasPage(data.entries.map(::getManga), data.page * data.limit < data.total) - } - - // Search - - override fun getFilterList(): FilterList = getFilters() - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - return when { - query.startsWith(PREFIX_ID_KEY_SEARCH) -> { - val ipk = query.removePrefix(PREFIX_ID_KEY_SEARCH) - val response = client.newCall(GET("$apiBooksUrl/detail/$ipk", lazyHeaders)).execute() - Observable.just(searchMangaParse2(response)) - } - else -> super.fetchSearchManga(page, query, filters) - } - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = apiBooksUrl.toHttpUrl().newBuilder().apply { - val terms: MutableList = mutableListOf() - - if (lang != "all") terms += "language!:\"$searchLang\"" - filters.forEach { filter -> - when (filter) { - is SortFilter -> addQueryParameter("sort", filter.getValue()) - - is CategoryFilter -> { - val activeFilter = filter.state.filter { it.state } - if (activeFilter.isNotEmpty()) { - addQueryParameter("cat", activeFilter.sumOf { it.value }.toString()) - } - } - - is TextFilter -> { - if (filter.state.isNotEmpty()) { - val tags = filter.state.split(",").filter(String::isNotBlank).joinToString(",") - if (tags.isNotBlank()) { - terms += "${filter.type}!:" + if (filter.type == "pages") tags else '"' + tags + '"' - } - } - } - else -> {} - } - } - if (query.isNotEmpty()) terms.add("title:\"$query\"") - if (terms.isNotEmpty()) addQueryParameter("s", terms.joinToString(" ")) - addQueryParameter("page", page.toString()) - }.build() - - return GET(url, lazyHeaders) - } - - override fun searchMangaParse(response: Response) = popularMangaParse(response) - - private fun searchMangaParse2(response: Response): MangasPage { - val entry = response.parseAs() - - return MangasPage( - listOf( - SManga.create().apply { - setUrlWithoutDomain("${entry.id}/${entry.public_key}") - title = if (remadd()) entry.title.shortenTitle() else entry.title - thumbnail_url = entry.thumbnails.base + entry.thumbnails.main.path - }, - ), - false, - ) - } - // Details - - override fun mangaDetailsRequest(manga: SManga): Request { - return GET("$apiBooksUrl/detail/${manga.url}", lazyHeaders) - } - - override fun mangaDetailsParse(response: Response): SManga { - return response.parseAs().toSManga() - } - - private val dateReformat = SimpleDateFormat("EEEE, d MMM yyyy HH:mm (z)", Locale.ENGLISH) - private fun MangaEntry.toSManga() = SManga.create().apply { - val artists = mutableListOf() - val circles = mutableListOf() - val parodies = mutableListOf() - val magazines = mutableListOf() - val characters = mutableListOf() - val cosplayers = mutableListOf() - val females = mutableListOf() - val males = mutableListOf() - val mixed = mutableListOf() - val other = mutableListOf() - val uploaders = mutableListOf() - val tags = mutableListOf() - for (tag in this@toSManga.tags) { - when (tag.namespace) { - 1 -> artists.add(tag.name) - 2 -> circles.add(tag.name) - 3 -> parodies.add(tag.name) - 4 -> magazines.add(tag.name) - 5 -> characters.add(tag.name) - 6 -> cosplayers.add(tag.name) - 7 -> tag.name.takeIf { it != "anonymous" }?.let { uploaders.add(it) } - 8 -> males.add(tag.name + " ♂") - 9 -> females.add(tag.name + " ♀") - 10 -> mixed.add(tag.name) - 12 -> other.add(tag.name) - else -> tags.add(tag.name) - } - } - - var appended = false - fun List.joinAndCapitalizeEach(): String? = this.emptyToNull()?.joinToString { it.capitalizeEach() }?.apply { appended = true } - title = if (remadd()) this@toSManga.title.shortenTitle() else this@toSManga.title - - author = (circles.emptyToNull() ?: artists).joinToString { it.capitalizeEach() } - artist = artists.joinToString { it.capitalizeEach() } - genre = (tags + males + females + mixed + other).joinToString { it.capitalizeEach() } - description = buildString { - circles.joinAndCapitalizeEach()?.let { - append("Circles: ", it, "\n") - } - uploaders.joinAndCapitalizeEach()?.let { - append("Uploaders: ", it, "\n") - } - magazines.joinAndCapitalizeEach()?.let { - append("Magazines: ", it, "\n") - } - cosplayers.joinAndCapitalizeEach()?.let { - append("Cosplayers: ", it, "\n") - } - parodies.joinAndCapitalizeEach()?.let { - append("Parodies: ", it, "\n") - } - characters.joinAndCapitalizeEach()?.let { - append("Characters: ", it, "\n") - } - - if (appended) append("\n") - - try { - append("Posted: ", dateReformat.format(created_at), "\n") - } catch (_: Exception) {} - - val dataKey = when (quality()) { - "1600" -> data.`1600` ?: data.`1280` ?: data.`0` - "1280" -> data.`1280` ?: data.`1600` ?: data.`0` - "980" -> data.`980` ?: data.`1280` ?: data.`0` - "780" -> data.`780` ?: data.`980` ?: data.`0` - else -> data.`0` - } - append("Size: ", dataKey.readableSize(), "\n\n") - append("Pages: ", thumbnails.entries.size, "\n\n") - } - status = SManga.COMPLETED - update_strategy = UpdateStrategy.ONLY_FETCH_ONCE - initialized = true - } - - private fun String.capitalizeEach() = this.split(" ").joinToString(" ") { s -> - s.replaceFirstChar { sr -> - if (sr.isLowerCase()) sr.titlecase(Locale.getDefault()) else sr.toString() - } - } - - private fun Collection.emptyToNull(): Collection? { - return this.ifEmpty { null } - } - - override fun getMangaUrl(manga: SManga) = "$baseUrl/g/${manga.url}" - - // Chapter - - override fun chapterListRequest(manga: SManga): Request { - return GET("$apiBooksUrl/detail/${manga.url}", lazyHeaders) - } - - override fun chapterListParse(response: Response): List { - val manga = response.parseAs() - return listOf( - SChapter.create().apply { - name = "Chapter" - url = "${manga.id}/${manga.public_key}" - date_upload = (manga.updated_at ?: manga.created_at) - }, - ) - } - - override fun getChapterUrl(chapter: SChapter) = "$baseUrl/g/${chapter.url}" - - // Page List - - override fun pageListRequest(chapter: SChapter): Request { - return GET("$apiBooksUrl/detail/${chapter.url}", lazyHeaders) - } - - override fun pageListParse(response: Response): List { - val mangaEntry = response.parseAs() - val imagesInfo = getImagesByMangaEntry(mangaEntry) - - return imagesInfo.first.entries.mapIndexed { index, image -> - Page(index, imageUrl = "${imagesInfo.first.base}/${image.path}?w=${imagesInfo.second}") - } - } - - override fun imageRequest(page: Page): Request { - return GET(page.imageUrl!!, lazyHeaders) - } - - override fun imageUrlParse(response: Response) = throw UnsupportedOperationException() - - // Settings - - override fun setupPreferenceScreen(screen: PreferenceScreen) { - ListPreference(screen.context).apply { - key = PREF_IMAGERES - title = "Image Resolution" - entries = arrayOf("780x", "980x", "1280x", "1600x", "Original") - entryValues = arrayOf("780", "980", "1280", "1600", "0") - summary = "%s" - setDefaultValue("1280") - }.also(screen::addPreference) - - SwitchPreferenceCompat(screen.context).apply { - key = PREF_REM_ADD - title = "Remove additional information in title" - summary = "Remove anything in brackets from manga titles.\n" + - "Reload manga to apply changes to loaded manga." - setDefaultValue(false) - }.also(screen::addPreference) - } - - private inline fun Response.parseAs(): T { - return json.decodeFromString(body.string()) - } - - companion object { - const val PREFIX_ID_KEY_SEARCH = "id:" - private const val PREF_IMAGERES = "pref_image_quality" - private const val PREF_REM_ADD = "pref_remove_additional" - } -} +package eu.kanade.tachiyomi.extension.all.koharu + +import android.content.SharedPreferences +import androidx.preference.EditTextPreference +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import androidx.preference.SwitchPreferenceCompat +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.artistList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.circleList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.femaleList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.genreList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.getFilters +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.maleList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.mixedList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.otherList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.parodyList +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.tagsFetchAttempts +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.tagsFetched +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.ConfigurableSource +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.HttpSource +import keiyoushi.utils.getPreferencesLazy +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import rx.Observable +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Locale + +class Koharu( + override val lang: String = "all", + private val searchLang: String = "", +) : HttpSource(), ConfigurableSource { + + override val name = "SchaleNetwork" + + override val baseUrl = "https://schale.network" + + override val id = if (lang == "en") 1484902275639232927 else super.id + + private val apiUrl = baseUrl.replace("://", "://api.") + + private val apiBooksUrl = "$apiUrl/books" + + private val authUrl = "${baseUrl.replace("://", "://auth.")}/clearance" + + override val supportsLatest = true + + private val json: Json by injectLazy() + + private val shortenTitleRegex = Regex("""(\[[^]]*]|[({][^)}]*[)}])""") + private fun String.shortenTitle() = replace(shortenTitleRegex, "").trim() + + private val preferences: SharedPreferences by getPreferencesLazy() + + private fun quality() = preferences.getString(PREF_IMAGERES, "1280")!! + + private fun remadd() = preferences.getBoolean(PREF_REM_ADD, false) + + private fun alwaysExcludeTags() = preferences.getString(PREF_EXCLUDE_TAGS, "") + + private var _domainUrl: String? = null + internal val domainUrl: String + get() { + return _domainUrl ?: run { + val domain = getDomain() + _domainUrl = domain + domain + } + } + + private fun getDomain(): String { + try { + val noRedirectClient = client.newBuilder().followRedirects(false).build() + val host = noRedirectClient.newCall(GET(baseUrl, headers)).execute() + .headers["Location"]?.toHttpUrlOrNull()?.host + ?: return baseUrl + return "https://$host" + } catch (_: Exception) { + return baseUrl + } + } + + private val lazyHeaders by lazy { + headersBuilder() + .set("Referer", "$domainUrl/") + .set("Origin", domainUrl) + .build() + } + + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .rateLimit(3) + .build() + + private val interceptedClient: OkHttpClient + get() = network.cloudflareClient.newBuilder() + .addInterceptor(TurnstileInterceptor(client, domainUrl, authUrl, lazyHeaders["User-Agent"])) + .rateLimit(3) + .build() + + private fun getManga(book: Entry) = SManga.create().apply { + setUrlWithoutDomain("${book.id}/${book.key}") + title = if (remadd()) book.title.shortenTitle() else book.title + thumbnail_url = book.thumbnail.path + } + + private fun getImagesByMangaData(entry: MangaData, entryId: String, entryKey: String): Pair { + val data = entry.data + fun getIPK( + ori: DataKey?, + alt1: DataKey?, + alt2: DataKey?, + alt3: DataKey?, + alt4: DataKey?, + ): Pair { + return Pair( + ori?.id ?: alt1?.id ?: alt2?.id ?: alt3?.id ?: alt4?.id, + ori?.key ?: alt1?.key ?: alt2?.key ?: alt3?.key ?: alt4?.key, + ) + } + val (id, public_key) = when (quality()) { + "1600" -> getIPK(data.`1600`, data.`1280`, data.`0`, data.`980`, data.`780`) + "1280" -> getIPK(data.`1280`, data.`1600`, data.`0`, data.`980`, data.`780`) + "980" -> getIPK(data.`980`, data.`1280`, data.`0`, data.`1600`, data.`780`) + "780" -> getIPK(data.`780`, data.`980`, data.`0`, data.`1280`, data.`1600`) + else -> getIPK(data.`0`, data.`1600`, data.`1280`, data.`980`, data.`780`) + } + + if (id == null || public_key == null) { + throw Exception("No Images Found") + } + + val realQuality = when (id) { + data.`1600`?.id -> "1600" + data.`1280`?.id -> "1280" + data.`980`?.id -> "980" + data.`780`?.id -> "780" + else -> "0" + } + + val imagesResponse = interceptedClient.newCall(GET("$apiBooksUrl/data/$entryId/$entryKey/$id/$public_key/$realQuality?crt=$token", lazyHeaders)).execute() + val images = imagesResponse.parseAs() to realQuality + return images + } + + // Latest + + override fun latestUpdatesRequest(page: Int) = GET( + apiBooksUrl.toHttpUrl().newBuilder().apply { + addQueryParameter("page", page.toString()) + + val terms: MutableList = mutableListOf() + if (lang != "all") terms += "language:\"^$searchLang$\"" + val alwaysExcludeTags = alwaysExcludeTags()?.split(",") + ?.map { it.trim() }?.filter(String::isNotBlank) ?: emptyList() + if (alwaysExcludeTags.isNotEmpty()) { + terms += "tag:\"${alwaysExcludeTags.joinToString(",") { "-$it" }}\"" + } + if (terms.isNotEmpty()) addQueryParameter("s", terms.joinToString(" ")) + }.build(), + lazyHeaders, + ) + + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + // Popular + + override fun popularMangaRequest(page: Int) = GET( + apiBooksUrl.toHttpUrl().newBuilder().apply { + addQueryParameter("sort", "8") + addQueryParameter("page", page.toString()) + + val terms: MutableList = mutableListOf() + if (lang != "all") terms += "language:\"^$searchLang$\"" + val alwaysExcludeTags = alwaysExcludeTags()?.split(",") + ?.map { it.trim() }?.filter(String::isNotBlank) ?: emptyList() + if (alwaysExcludeTags.isNotEmpty()) { + terms += "tag:\"${alwaysExcludeTags.joinToString(",") { "-$it" }}\"" + } + if (terms.isNotEmpty()) addQueryParameter("s", terms.joinToString(" ")) + }.build(), + lazyHeaders, + ) + + override fun popularMangaParse(response: Response): MangasPage { + val data = response.parseAs() + return MangasPage(data.entries.map(::getManga), data.page * data.limit < data.total) + } + + // Search + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return when { + query.startsWith(PREFIX_ID_KEY_SEARCH) -> { + val ipk = query.removePrefix(PREFIX_ID_KEY_SEARCH) + val response = client.newCall(GET("$apiBooksUrl/detail/$ipk", lazyHeaders)).execute() + Observable.just( + MangasPage(listOf(mangaDetailsParse(response)), false), + ) + } + else -> super.fetchSearchManga(page, query, filters) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = apiBooksUrl.toHttpUrl().newBuilder().apply { + val terms: MutableList = mutableListOf() + val includedTags: MutableList = mutableListOf() + val excludedTags: MutableList = mutableListOf() + + if (lang != "all") terms += "language:\"^$searchLang$\"" + val alwaysExcludeTags = alwaysExcludeTags()?.split(",") + ?.map { it.trim() }?.filter(String::isNotBlank) ?: emptyList() + if (alwaysExcludeTags.isNotEmpty()) { + terms += "tag:\"${alwaysExcludeTags.joinToString(",") { "-$it" }}\"" + } + + filters.forEach { filter -> + when (filter) { + is KoharuFilters.SortFilter -> addQueryParameter("sort", filter.getValue()) + + is KoharuFilters.CategoryFilter -> { + val activeFilter = filter.state.filter { it.state } + if (activeFilter.isNotEmpty()) { + addQueryParameter("cat", activeFilter.sumOf { it.value }.toString()) + } + } + + is KoharuFilters.TagFilter -> { + includedTags += filter.state + .filter { it.isIncluded() } + .map { it.id } + excludedTags += filter.state + .filter { it.isExcluded() } + .map { it.id } + } + + is KoharuFilters.GenreConditionFilter -> { + if (filter.state > 0) { + addQueryParameter(filter.param, filter.toUriPart()) + } + } + + is KoharuFilters.TextFilter -> { + if (filter.state.isNotEmpty()) { + val tags = filter.state.split(",").filter(String::isNotBlank).joinToString(",") + if (tags.isNotBlank()) { + terms += "${filter.type}:" + if (filter.type == "pages") tags else "\"$tags\"" + } + } + } + else -> {} + } + } + + if (includedTags.isNotEmpty()) { + addQueryParameter("include", includedTags.joinToString(",")) + } + if (excludedTags.isNotEmpty()) { + addQueryParameter("exclude", excludedTags.joinToString(",")) + } + + if (query.isNotEmpty()) terms.add("title:\"$query\"") + if (terms.isNotEmpty()) addQueryParameter("s", terms.joinToString(" ")) + addQueryParameter("page", page.toString()) + }.build() + + return GET(url, lazyHeaders) + } + + override fun searchMangaParse(response: Response) = popularMangaParse(response) + + override fun getFilterList(): FilterList { + launchIO { fetchTags() } + + return getFilters() + } + + private val scope = CoroutineScope(Dispatchers.IO) + + private fun launchIO(block: () -> Unit) = scope.launch { block() } + + /** + * Fetch the genres from the source to be used in the filters. + */ + private fun fetchTags() { + if (tagsFetchAttempts < 3 && !tagsFetched) { + try { + client.newCall( + GET("$apiBooksUrl/tags/filters", lazyHeaders), + ).execute() + .use { it.parseAs>() } + .also { + tagsFetched = true + } + .takeIf { it.isNotEmpty() } + ?.map { it.toTag() } + ?.also { tags -> + genreList = tags.filterIsInstance() + femaleList = tags.filterIsInstance() + maleList = tags.filterIsInstance() + artistList = tags.filterIsInstance() + circleList = tags.filterIsInstance() + parodyList = tags.filterIsInstance() + mixedList = tags.filterIsInstance() + otherList = tags.filterIsInstance() + } + } catch (_: Exception) { + } finally { + tagsFetchAttempts++ + } + } + } + + // Details + + override fun mangaDetailsRequest(manga: SManga): Request { + return GET("$apiBooksUrl/detail/${manga.url}", lazyHeaders) + } + + override fun mangaDetailsParse(response: Response): SManga { + val mangaDetail = response.parseAs() + return mangaDetail.toSManga().apply { + setUrlWithoutDomain("${mangaDetail.id}/${mangaDetail.key}") + title = if (remadd()) mangaDetail.title.shortenTitle() else mangaDetail.title + } + } + + override fun getMangaUrl(manga: SManga) = "$baseUrl/g/${manga.url}" + + // Chapter + + override fun chapterListRequest(manga: SManga): Request { + return GET("$apiBooksUrl/detail/${manga.url}", lazyHeaders) + } + + override fun chapterListParse(response: Response): List { + val manga = response.parseAs() + return listOf( + SChapter.create().apply { + name = "Chapter" + url = "${manga.id}/${manga.key}" + date_upload = (manga.updated_at ?: manga.created_at) + }, + ) + } + + override fun getChapterUrl(chapter: SChapter) = "$baseUrl/g/${chapter.url}" + + // Page List + + override fun fetchPageList(chapter: SChapter): Observable> { + return interceptedClient.newCall(pageListRequest(chapter)) + .asObservableSuccess() + .map { response -> + pageListParse(response) + } + } + + override fun pageListRequest(chapter: SChapter): Request { + return POST("$apiBooksUrl/detail/${chapter.url}?crt=$token", lazyHeaders) + } + + override fun pageListParse(response: Response): List { + val mangaData = response.parseAs() + val url = response.request.url.toString() + val matches = Regex("""/detail/(\d+)/([a-z\d]+)""").find(url) + if (matches == null || matches.groupValues.size < 3) return emptyList() + val imagesInfo = getImagesByMangaData(mangaData, matches.groupValues[1], matches.groupValues[2]) + + return imagesInfo.first.entries.mapIndexed { index, image -> + Page(index, imageUrl = "${imagesInfo.first.base}/${image.path}?w=${imagesInfo.second}") + } + } + + override fun imageRequest(page: Page): Request { + return GET(page.imageUrl!!, lazyHeaders) + } + + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException() + + // Settings + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + ListPreference(screen.context).apply { + key = PREF_IMAGERES + title = "Image Resolution" + entries = arrayOf("780x", "980x", "1280x", "1600x", "Original") + entryValues = arrayOf("780", "980", "1280", "1600", "0") + summary = "%s" + setDefaultValue("1280") + }.also(screen::addPreference) + + SwitchPreferenceCompat(screen.context).apply { + key = PREF_REM_ADD + title = "Remove additional information in title" + summary = "Remove anything in brackets from manga titles.\n" + + "Reload manga to apply changes to loaded manga." + setDefaultValue(false) + }.also(screen::addPreference) + + EditTextPreference(screen.context).apply { + key = PREF_EXCLUDE_TAGS + title = "Tags to exclude from browse/search" + summary = "Separate tags with commas (,).\n" + + "Excluding: ${alwaysExcludeTags()}" + }.also(screen::addPreference) + } + + private inline fun Response.parseAs(): T { + return json.decodeFromString(body.string()) + } + + companion object { + const val PREFIX_ID_KEY_SEARCH = "id:" + private const val PREF_IMAGERES = "pref_image_quality" + private const val PREF_REM_ADD = "pref_remove_additional" + private const val PREF_EXCLUDE_TAGS = "pref_exclude_tags" + + internal var token: String? = null + internal var authorization: String? = null + + internal val dateReformat = SimpleDateFormat("EEEE, d MMM yyyy HH:mm (z)", Locale.ENGLISH) + } +} diff --git a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuDto.kt b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuDto.kt index 579321ead..1054aff65 100644 --- a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuDto.kt +++ b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuDto.kt @@ -1,83 +1,209 @@ -package eu.kanade.tachiyomi.extension.all.koharu +package eu.kanade.tachiyomi.extension.all.koharu -import kotlinx.serialization.Serializable - -@Serializable -class Tag( - var name: String, - var namespace: Int = 0, -) - -@Serializable -class Books( - val entries: List = emptyList(), - val total: Int = 0, - val limit: Int = 0, - val page: Int, -) - -@Serializable -class Entry( - val id: Int, - val public_key: String, - val title: String, - val thumbnail: Thumbnail, -) - -@Serializable -class MangaEntry( - val id: Int, - val title: String, - val public_key: String, - val created_at: Long = 0L, - val updated_at: Long?, - val thumbnails: Thumbnails, - val tags: List = emptyList(), - val data: Data, -) - -@Serializable -class Thumbnails( - val base: String, - val main: Thumbnail, - val entries: List, -) - -@Serializable -class Thumbnail( - val path: String, -) - -@Serializable -class Data( - val `0`: DataKey, - val `780`: DataKey? = null, - val `980`: DataKey? = null, - val `1280`: DataKey? = null, - val `1600`: DataKey? = null, -) - -@Serializable -class DataKey( - val id: Int? = null, - val size: Double = 0.0, - val public_key: String? = null, -) { - fun readableSize() = when { - size >= 300 * 1000 * 1000 -> "${"%.2f".format(size / (1000.0 * 1000.0 * 1000.0))} GB" - size >= 100 * 1000 -> "${"%.2f".format(size / (1000.0 * 1000.0))} MB" - size >= 1000 -> "${"%.2f".format(size / (1000.0))} kB" - else -> "$size B" - } -} - -@Serializable -class ImagesInfo( - val base: String, - val entries: List, -) - -@Serializable -class ImagePath( - val path: String, -) +import eu.kanade.tachiyomi.extension.all.koharu.Koharu.Companion.dateReformat +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.model.UpdateStrategy +import kotlinx.serialization.Serializable +import java.util.Locale + +@Serializable +class Tag( + val name: String, + val namespace: Int = 0, +) + +@Serializable +class Filter( + private val id: Int, + private val name: String, + private val namespace: Int = 0, +) { + fun toTag() = when (namespace) { + 0 -> KoharuFilters.Genre(id, name) + 1 -> KoharuFilters.Artist(id, name) + 2 -> KoharuFilters.Circle(id, name) + 3 -> KoharuFilters.Parody(id, name) + 8 -> KoharuFilters.Male(id, name) + 9 -> KoharuFilters.Female(id, name) + 10 -> KoharuFilters.Mixed(id, name) + 12 -> KoharuFilters.Other(id, name) + else -> KoharuFilters.Tag(id, name, namespace) + } +} + +@Serializable +class Books( + val entries: List = emptyList(), + val total: Int = 0, + val limit: Int = 0, + val page: Int, +) + +@Serializable +class Entry( + val id: Int, + val key: String, + val title: String, + val thumbnail: Thumbnail, +) + +@Serializable +class MangaDetail( + val id: Int, + val title: String, + val key: String, + val created_at: Long = 0L, + val updated_at: Long?, + val thumbnails: Thumbnails, + val tags: List = emptyList(), +) { + fun toSManga() = SManga.create().apply { + val artists = mutableListOf() + val circles = mutableListOf() + val parodies = mutableListOf() + val magazines = mutableListOf() + val characters = mutableListOf() + val cosplayers = mutableListOf() + val females = mutableListOf() + val males = mutableListOf() + val mixed = mutableListOf() + val language = mutableListOf() + val other = mutableListOf() + val uploaders = mutableListOf() + val tags = mutableListOf() + this@MangaDetail.tags.forEach { tag -> + when (tag.namespace) { + 1 -> artists.add(tag.name) + 2 -> circles.add(tag.name) + 3 -> parodies.add(tag.name) + 4 -> magazines.add(tag.name) + 5 -> characters.add(tag.name) + 6 -> cosplayers.add(tag.name) + 7 -> tag.name.takeIf { it != "anonymous" }?.let { uploaders.add(it) } + 8 -> males.add(tag.name + " ♂") + 9 -> females.add(tag.name + " ♀") + 10 -> mixed.add(tag.name) + 11 -> language.add(tag.name) + 12 -> other.add(tag.name) + else -> tags.add(tag.name) + } + } + + var appended = false + fun List.joinAndCapitalizeEach(): String? = this.emptyToNull()?.joinToString { it.capitalizeEach() }?.apply { appended = true } + + thumbnail_url = thumbnails.base + thumbnails.main.path + + author = (circles.emptyToNull() ?: artists).joinToString { it.capitalizeEach() } + artist = artists.joinToString { it.capitalizeEach() } + genre = (artists + circles + parodies + magazines + characters + cosplayers + tags + females + males + mixed + other).joinToString { it.capitalizeEach() } + description = buildString { + circles.joinAndCapitalizeEach()?.let { + append("Circles: ", it, "\n") + } + uploaders.joinAndCapitalizeEach()?.let { + append("Uploaders: ", it, "\n") + } + magazines.joinAndCapitalizeEach()?.let { + append("Magazines: ", it, "\n") + } + cosplayers.joinAndCapitalizeEach()?.let { + append("Cosplayers: ", it, "\n") + } + parodies.joinAndCapitalizeEach()?.let { + append("Parodies: ", it, "\n") + } + characters.joinAndCapitalizeEach()?.let { + append("Characters: ", it, "\n") + } + + if (appended) append("\n") + + try { + append("Posted: ", dateReformat.format(created_at), "\n") + } catch (_: Exception) {} + + append("Pages: ", thumbnails.entries.size, "\n\n") + } + status = SManga.COMPLETED + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + initialized = true + } + + private fun String.capitalizeEach() = this.split(" ").joinToString(" ") { s -> + s.replaceFirstChar { sr -> + if (sr.isLowerCase()) sr.titlecase(Locale.getDefault()) else sr.toString() + } + } + + private fun Collection.emptyToNull(): Collection? { + return this.ifEmpty { null } + } +} + +@Serializable +class MangaData( + val data: Data, + val similar: List = emptyList(), +) { + /** + * Return human-readable size of chapter. + * @param quality The quality set in PREF_IMAGERES + */ + fun size(quality: String): String { + val dataKey = when (quality) { + "1600" -> data.`1600` ?: data.`1280` ?: data.`0` + "1280" -> data.`1280` ?: data.`1600` ?: data.`0` + "980" -> data.`980` ?: data.`1280` ?: data.`0` + "780" -> data.`780` ?: data.`980` ?: data.`0` + else -> data.`0` + } + return dataKey.readableSize() + } +} + +@Serializable +class Thumbnails( + val base: String, + val main: Thumbnail, + val entries: List, +) + +@Serializable +class Thumbnail( + val path: String, +) + +@Serializable +class Data( + val `0`: DataKey, + val `780`: DataKey? = null, + val `980`: DataKey? = null, + val `1280`: DataKey? = null, + val `1600`: DataKey? = null, +) + +@Serializable +class DataKey( + val id: Int? = null, + val size: Double = 0.0, + val key: String? = null, +) { + fun readableSize() = when { + size >= 300 * 1000 * 1000 -> "${"%.2f".format(size / (1000.0 * 1000.0 * 1000.0))} GB" + size >= 100 * 1000 -> "${"%.2f".format(size / (1000.0 * 1000.0))} MB" + size >= 1000 -> "${"%.2f".format(size / (1000.0))} kB" + else -> "$size B" + } +} + +@Serializable +class ImagesInfo( + val base: String, + val entries: List, +) + +@Serializable +class ImagePath( + val path: String, +) diff --git a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFactory.kt b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFactory.kt index 0bcdd4be5..2cdebc21b 100644 --- a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFactory.kt +++ b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFactory.kt @@ -1,13 +1,13 @@ -package eu.kanade.tachiyomi.extension.all.koharu +package eu.kanade.tachiyomi.extension.all.koharu -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.SourceFactory - -class KoharuFactory : SourceFactory { - override fun createSources(): List = listOf( - Koharu(), - Koharu("en", "english"), - Koharu("ja", "japanese"), - Koharu("zh", "chinese"), - ) -} +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory + +class KoharuFactory : SourceFactory { + override fun createSources(): List = listOf( + Koharu(), + Koharu("en", "english"), + Koharu("ja", "japanese"), + Koharu("zh", "chinese"), + ) +} diff --git a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFilters.kt b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFilters.kt index e8478fea7..8a8566d57 100644 --- a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFilters.kt +++ b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuFilters.kt @@ -1,51 +1,129 @@ -package eu.kanade.tachiyomi.extension.all.koharu +package eu.kanade.tachiyomi.extension.all.koharu -import eu.kanade.tachiyomi.source.model.Filter -import eu.kanade.tachiyomi.source.model.FilterList - -fun getFilters(): FilterList { - return FilterList( - SortFilter("Sort by", getSortsList), - CategoryFilter("Category"), - Filter.Separator(), - Filter.Header("Separate tags with commas (,)"), - Filter.Header("Prepend with dash (-) to exclude"), - TextFilter("Artists", "artist"), - TextFilter("Magazines", "magazine"), - TextFilter("Publishers", "publisher"), - TextFilter("Characters", "character"), - TextFilter("Cosplayers", "cosplayer"), - TextFilter("Parodies", "parody"), - TextFilter("Circles", "circle"), - TextFilter("Male Tags", "male"), - TextFilter("Female Tags", "female"), - TextFilter("Tags ( Universal )", "tag"), - Filter.Header("Filter by pages, for example: (>20)"), - TextFilter("Pages", "pages"), - ) -} - -internal open class TextFilter(name: String, val type: String) : Filter.Text(name) -internal open class SortFilter(name: String, private val vals: List>, state: Int = 0) : - Filter.Select(name, vals.map { it.first }.toTypedArray(), state) { - fun getValue() = vals[state].second -} - -internal class CategoryFilter(name: String) : - Filter.Group( - name, - listOf( - Pair("Manga", 2), - Pair("Doujinshi", 4), - Pair("Illustration", 8), - ).map { CheckBoxFilter(it.first, it.second, true) }, - ) -internal open class CheckBoxFilter(name: String, val value: Int, state: Boolean) : Filter.CheckBox(name, state) - -private val getSortsList: List> = listOf( - Pair("Recently Posted", "4"), - Pair("Title", "2"), - Pair("Pages", "3"), - Pair("Most Viewed", "8"), - Pair("Most Favorited", "9"), -) +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList + +object KoharuFilters { + var genreList: List = KoharuTags.genreList + var femaleList: List = KoharuTags.femaleList + var maleList: List = KoharuTags.maleList + var artistList: List = KoharuTags.artistList + var circleList: List = KoharuTags.circleList + var parodyList: List = KoharuTags.parodyList + var mixedList: List = KoharuTags.mixedList + var otherList: List = KoharuTags.otherList + + /** + * Whether tags have been fetched + */ + internal var tagsFetched: Boolean = false + + /** + * Inner variable to control how much tries the tags request was called. + */ + internal var tagsFetchAttempts: Int = 0 + + fun getFilters(): FilterList { + return FilterList( + SortFilter("Sort by", getSortsList), + CategoryFilter("Category"), + Filter.Separator(), + TagFilter("Tags", genreList), + TagFilter("Female Tags", femaleList), + TagFilter("Male Tags", maleList), + TagFilter("Artists", artistList), + TagFilter("Circles", circleList), + TagFilter("Parodies", parodyList), + TagFilter("Mixed", mixedList), + TagFilter("Other", otherList), + GenreConditionFilter("Include condition", tagsConditionIncludeFilterOptions, "i"), + GenreConditionFilter("Exclude condition", tagsConditionExcludeFilterOptions, "e"), + Filter.Separator(), + Filter.Header("Separate tags with commas (,)"), + Filter.Header("Prepend with dash (-) to exclude"), + TextFilter("Magazines", "magazine"), + TextFilter("Publishers", "publisher"), + TextFilter("Characters", "character"), + TextFilter("Cosplayers", "cosplayer"), + Filter.Header("Filter by pages, for example: (>20)"), + TextFilter("Pages", "pages"), + ) + } + + internal open class TextFilter(name: String, val type: String) : Filter.Text(name) + internal open class SortFilter( + name: String, + private val vals: List>, + state: Int = 0, + ) : + Filter.Select(name, vals.map { it.first }.toTypedArray(), state) { + fun getValue() = vals[state].second + } + + internal class CategoryFilter(name: String) : + Filter.Group( + name, + listOf( + Pair("Manga", 2), + Pair("Doujinshi", 4), + Pair("Illustration", 8), + ).map { CheckBoxFilter(it.first, it.second, true) }, + ) + + internal open class CheckBoxFilter(name: String, val value: Int, state: Boolean) : + Filter.CheckBox(name, state) + + private val getSortsList: List> = listOf( + Pair("Recently Posted", "4"), + Pair("Title", "2"), + Pair("Pages", "3"), + Pair("Most Viewed", "8"), + Pair("Most Favorited", "9"), + ) + + internal class GenreConditionFilter( + title: String, + options: List>, + val param: String, + ) : UriPartFilter( + title, + options.toTypedArray(), + ) + + open class Tag(val id: Int, val name: String, val namespace: Int) + class Genre(id: Int, name: String) : Tag(id, name, namespace = 0) + class Artist(id: Int, name: String) : Tag(id, name, namespace = 1) + class Circle(id: Int, name: String) : Tag(id, name, namespace = 2) + class Parody(id: Int, name: String) : Tag(id, name, namespace = 3) + class Male(id: Int, name: String) : Tag(id, name, namespace = 8) + class Female(id: Int, name: String) : Tag(id, name, namespace = 9) + class Mixed(id: Int, name: String) : Tag(id, name, namespace = 10) + class Other(id: Int, name: String) : Tag(id, name, namespace = 12) + + internal class TagFilter(title: String, tags: List) : + Filter.Group(title, tags.map { TagTriState(it.name, it.id) }) + + internal class TagTriState(name: String, val id: Int) : Filter.TriState(name) + + open class UriPartFilter( + displayName: String, + private val vals: Array>, + state: Int = 0, + ) : + Filter.Select(displayName, vals.map { it.first }.toTypedArray(), state) { + fun toUriPart() = vals[state].second + } + + // https://api.schale.network/books?include=,&i=1&exclude=,&e=1 + private val tagsConditionIncludeFilterOptions: List> = + listOf( + "AND" to "", + "OR" to "1", + ) + + private val tagsConditionExcludeFilterOptions: List> = + listOf( + "OR" to "", + "AND" to "1", + ) +} diff --git a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuTags.kt b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuTags.kt new file mode 100644 index 000000000..02468135f --- /dev/null +++ b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/KoharuTags.kt @@ -0,0 +1,3087 @@ +package eu.kanade.tachiyomi.extension.all.koharu + +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Artist +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Circle +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Female +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Genre +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Male +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Mixed +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Other +import eu.kanade.tachiyomi.extension.all.koharu.KoharuFilters.Parody + +// https://api.schale.network/books/tags/filters + +// Default: tag +// Namespace: 1 - artist +// Namespace: 2 - circle +// Namespace: 3 - parody +// Namespace: 8 - male +// Namespace: 9 - female +// Namespace: 10 - mixed +// Namespace: 11 - language (english, translated) +// Namespace: 12 - other + +object KoharuTags { + + val genreList = listOf( + Genre(id = 216180, name = "ahegao"), + Genre(id = 29, name = "anal"), + Genre(id = 55, name = "apron"), + Genre(id = 150, name = "armpit fetish"), + Genre(id = 5727, name = "bathhouse"), + Genre(id = 393, name = "bathroom"), + Genre(id = 25806, name = "bdsm"), + Genre(id = 3904, name = "beach"), + Genre(id = 220519, name = "beach-sale"), + Genre(id = 216205, name = "beauty mark"), + Genre(id = 23, name = "big penis"), + Genre(id = 2673, name = "biting"), + Genre(id = 75, name = "blindfold"), + Genre(id = 2833, name = "bloomers"), + Genre(id = 216179, name = "blowjob"), + Genre(id = 19204, name = "body swap"), + Genre(id = 220598, name = "body writing"), + Genre(id = 1457, name = "bondage"), + Genre(id = 216198, name = "booty"), + Genre(id = 188545, name = "breast sucking"), + Genre(id = 171768, name = "bss"), + Genre(id = 239, name = "bukkake"), + Genre(id = 1290, name = "bun hair"), + Genre(id = 18, name = "cheating"), + Genre(id = 2366, name = "cheerleader"), + Genre(id = 2391, name = "chikan"), + Genre(id = 171131, name = "childhood friends"), + Genre(id = 1983, name = "christmas"), + Genre(id = 283, name = "chubby"), + Genre(id = 2282, name = "comedy"), + Genre(id = 234, name = "cosplay"), + Genre(id = 170592, name = "costume"), + Genre(id = 220582, name = "co-workers"), + Genre(id = 170093, name = "crosdressing"), + Genre(id = 1827, name = "crossdressing"), + Genre(id = 1851, name = "crotch tattoo"), + Genre(id = 44, name = "curly hair"), + Genre(id = 51, name = "dark skin"), + Genre(id = 735, name = "deepthroat"), + Genre(id = 183313, name = "defloration"), + Genre(id = 960, name = "deity"), + Genre(id = 4592, name = "delinquent"), + Genre(id = 23474, name = "demon"), + Genre(id = 220644, name = "dilf"), + Genre(id = 220684, name = "doctor"), + Genre(id = 238, name = "double penetration"), + Genre(id = 1351, name = "elf"), + Genre(id = 39, name = "exhibitionism"), + Genre(id = 130, name = "eyebrows"), + Genre(id = 10359, name = "eyepatch"), + Genre(id = 2462, name = "face mask"), + Genre(id = 149, name = "facesitting"), + Genre(id = 187552, name = "facial"), + Genre(id = 9, name = "fangs"), + Genre(id = 449, name = "fantasy"), + Genre(id = 899, name = "filming"), + Genre(id = 291, name = "fingering"), + Genre(id = 220498, name = "first time"), + Genre(id = 241, name = "fishnets"), + Genre(id = 220503, name = "fivesome plus"), + Genre(id = 909, name = "footjob"), + Genre(id = 778, name = "forced"), + Genre(id = 352, name = "foreigner"), + Genre(id = 2513, name = "freckles"), + Genre(id = 8440, name = "genderbend"), + Genre(id = 175, name = "glasses"), + Genre(id = 183317, name = "hairy"), + Genre(id = 4405, name = "hairy armpit"), + Genre(id = 216185, name = "handjob"), + Genre(id = 893, name = "headphones"), + Genre(id = 216186, name = "heart pupils"), + Genre(id = 14006, name = "historical"), + Genre(id = 3084, name = "horns"), + Genre(id = 10930, name = "horror"), + Genre(id = 1022, name = "hot spring"), + Genre(id = 176320, name = "hot springs"), + Genre(id = 610, name = "humiliation"), + Genre(id = 643, name = "idol"), + Genre(id = 216207, name = "irodori aqua"), + Genre(id = 6511, name = "isekai"), + Genre(id = 188422, name = "kemonomimi"), + Genre(id = 74, name = "kimono"), + Genre(id = 220709, name = "kissing"), + Genre(id = 5447, name = "kuudere"), + Genre(id = 216187, name = "lactation"), + Genre(id = 303, name = "leg lock"), + Genre(id = 43, name = "light hair"), + Genre(id = 220484, name = "light novel"), + Genre(id = 216203, name = "lingerie"), + Genre(id = 5892, name = "lotion play"), + Genre(id = 406, name = "love hotel"), + Genre(id = 220504, name = "love potion"), + Genre(id = 226, name = "maid"), + Genre(id = 38, name = "masturbation"), + Genre(id = 216208, name = "m-for-milf-sale"), + Genre(id = 126, name = "muscles"), + Genre(id = 216181, name = "nakadashi"), + Genre(id = 398, name = "netorare"), + Genre(id = 1190, name = "netorase"), + Genre(id = 2701, name = "netori"), + Genre(id = 162478, name = "newhalf"), + Genre(id = 220631, name = "new job sale"), + Genre(id = 2534, name = "ninja"), + Genre(id = 171098, name = "non human"), + Genre(id = 216079, name = "ntr"), + Genre(id = 2359, name = "nurse"), + Genre(id = 7129, name = "oni"), + Genre(id = 11, name = "orgasm denial"), + Genre(id = 259, name = "orgy"), + Genre(id = 107, name = "osananajimi"), + Genre(id = 171194, name = "outdoor"), + Genre(id = 87, name = "outdoors"), + Genre(id = 538, name = "over-eye bangs"), + Genre(id = 1265, name = "pantyhose"), + Genre(id = 849, name = "pegging"), + Genre(id = 1041, name = "piercing"), + Genre(id = 216199, name = "ponytail"), + Genre(id = 8359, name = "pool"), + Genre(id = 216076, name = "pride-month-sale"), + Genre(id = 216184, name = "pubic hair"), + Genre(id = 1637, name = "qipao"), + Genre(id = 896, name = "rimjob"), + Genre(id = 22413, name = "robot"), + Genre(id = 220599, name = "scientist"), + Genre(id = 4385, name = "sci-fi"), + Genre(id = 220552, name = "semi-color"), + Genre(id = 220505, name = "shark teeth"), + Genre(id = 791, name = "shimapan"), + Genre(id = 88, name = "short hair"), + Genre(id = 1400, name = "sixty-nine"), + Genre(id = 220840, name = "smell fetish"), + Genre(id = 70, name = "socks"), + Genre(id = 220710, name = "sole female"), + Genre(id = 220708, name = "sole male"), + Genre(id = 220557, name = "spanking"), + Genre(id = 327, name = "spats"), + Genre(id = 14993, name = "spirit"), + Genre(id = 686, name = "sportswear"), + Genre(id = 41, name = "squirting"), + Genre(id = 33, name = "stockings"), + Genre(id = 3083, name = "succubus"), + Genre(id = 216077, name = "summer-sale"), + Genre(id = 187687, name = "swallowing"), + Genre(id = 61, name = "swimsuit"), + Genre(id = 6909, name = "swinging"), + Genre(id = 299, name = "tanlines"), + Genre(id = 9040, name = "tattoo"), + Genre(id = 62, name = "teacher"), + Genre(id = 5940, name = "tentacles"), + Genre(id = 602, name = "thigh job"), + Genre(id = 171161, name = "threesome"), + Genre(id = 220632, name = "threesomes-and-moresomes"), + Genre(id = 66, name = "toys"), + Genre(id = 220711, name = "tracksuit"), + Genre(id = 79059, name = "trans"), + Genre(id = 220707, name = "translated"), + Genre(id = 172, name = "tsundere"), + Genre(id = 10, name = "twintails"), + Genre(id = 3109, name = "very long hair"), + Genre(id = 601, name = "voyeurism"), + Genre(id = 74894, name = "vtuber"), + Genre(id = 4332, name = "waitress"), + Genre(id = 27837, name = "whiteout"), + Genre(id = 5891, name = "witch"), + Genre(id = 21909, name = "wrestling"), + Genre(id = 216182, name = "x-ray"), + Genre(id = 1689, name = "yandere"), + Genre(id = 4384, name = "zero gravity"), + Genre(id = 220759, name = "華語"), + ) + val artistList = listOf( + Artist(id = 180781, name = "029"), + Artist(id = 216945, name = "108 gou"), + Artist(id = 197439, name = "1-gou"), + Artist(id = 16396, name = "212"), + Artist(id = 70636, name = "218"), + Artist(id = 150445, name = "23"), + Artist(id = 101647, name = "35 machi"), + Artist(id = 5965, name = "40010 prototype"), + Artist(id = 90469, name = "7x2"), + Artist(id = 28045, name = "7zu7"), + Artist(id = 110698, name = "88"), + Artist(id = 18221, name = "a-10"), + Artist(id = 56256, name = "ababari"), + Artist(id = 92033, name = "abe inori"), + Artist(id = 17796, name = "abe manabu"), + Artist(id = 26685, name = "abi"), + Artist(id = 103849, name = "acefishy"), + Artist(id = 166696, name = "achumuchi"), + Artist(id = 22531, name = "aduma ren"), + Artist(id = 130988, name = "ae"), + Artist(id = 41679, name = "afukuro"), + Artist(id = 183493, name = "agachi"), + Artist(id = 21139, name = "ahobaka"), + Artist(id = 220737, name = "ahoge kinoko"), + Artist(id = 3748, name = "ai"), + Artist(id = 198087, name = "aida maki"), + Artist(id = 27141, name = "aihara hanten"), + Artist(id = 118197, name = "aikunn8"), + Artist(id = 6798, name = "aimaitei umami"), + Artist(id = 137439, name = "aimitsu"), + Artist(id = 66591, name = "aimiya yuu"), + Artist(id = 100837, name = "ainan zero"), + Artist(id = 218479, name = "ainaryumu"), + Artist(id = 2043, name = "aiue oka"), + Artist(id = 18407, name = "aiya"), + Artist(id = 93744, name = "aja"), + Artist(id = 15816, name = "akagi asahito"), + Artist(id = 75213, name = "akagi kuro"), + Artist(id = 2537, name = "akai mato"), + Artist(id = 174501, name = "akamoto akamoto"), + Artist(id = 215471, name = "akano murasaki"), + Artist(id = 218497, name = "aka p"), + Artist(id = 180833, name = "akasa ai"), + Artist(id = 76419, name = "aka seiryuu"), + Artist(id = 77473, name = "akashi rokuro"), + Artist(id = 168105, name = "akatsuki katsuie"), + Artist(id = 170741, name = "akatsuki myuuto"), + Artist(id = 205116, name = "akausu ko"), + Artist(id = 150543, name = "akazawa red"), + Artist(id = 54971, name = "akechi shizuku"), + Artist(id = 37512, name = "aki"), + Artist(id = 220638, name = "akiba@"), + Artist(id = 180834, name = "akieda"), + Artist(id = 147683, name = "akiha@"), + Artist(id = 136744, name = "aki hirame"), + Artist(id = 11339, name = "aki kitahara"), + Artist(id = 171043, name = "akikusa peperon"), + Artist(id = 216404, name = "akino sora"), + Artist(id = 129035, name = "akira"), + Artist(id = 69552, name = "akishiro akino"), + Artist(id = 787, name = "akitsuki itsuki"), + Artist(id = 220698, name = "akitsu tombo!"), + Artist(id = 1198, name = "akiya akira"), + Artist(id = 155540, name = "aku"), + Artist(id = 25400, name = "akuma"), + Artist(id = 176496, name = "akuochisukii sensei"), + Artist(id = 98993, name = "akusema"), + Artist(id = 71860, name = "akutenkou"), + Artist(id = 36888, name = "alber"), + Artist(id = 170647, name = "alexa mahone"), + Artist(id = 182601, name = "allegro"), + Artist(id = 3990, name = "alp"), + Artist(id = 171073, name = "alps ichimando"), + Artist(id = 108141, name = "alracoco"), + Artist(id = 29716, name = "alto seneka"), + Artist(id = 25121, name = "amagaeru"), + Artist(id = 203984, name = "amakawa gumi"), + Artist(id = 180730, name = "amamitsuki"), + Artist(id = 201847, name = "amamiya tenko"), + Artist(id = 141227, name = "amane ruri"), + Artist(id = 169065, name = "amane sirou"), + Artist(id = 1026, name = "amano ameno"), + Artist(id = 17993, name = "amano miki"), + Artist(id = 56545, name = "amanuki"), + Artist(id = 177452, name = "amasora taichi"), + Artist(id = 182292, name = "amatusae"), + Artist(id = 44098, name = "ame arare"), + Artist(id = 40167, name = "ameno shigure"), + Artist(id = 3, name = "amezawa koma"), + Artist(id = 160192, name = "amiya narumi"), + Artist(id = 180835, name = "amu dora"), + Artist(id = 4933, name = "andou shuki"), + Artist(id = 56432, name = "anmi"), + Artist(id = 220630, name = "ano nimaru"), + Artist(id = 162939, name = "anponta"), + Artist(id = 218202, name = "anza yuu"), + Artist(id = 215829, name = "aoba"), + Artist(id = 31588, name = "aoba hachi"), + Artist(id = 5711, name = "ao banana"), + Artist(id = 13733, name = "aoi miharu"), + Artist(id = 370, name = "aoi nagisa"), + Artist(id = 220873, name = "aoi niwatori"), + Artist(id = 66626, name = "aoiro ichigou"), + Artist(id = 56528, name = "aomushi"), + Artist(id = 211348, name = "aonaga haname"), + Artist(id = 169415, name = "aoyama akira"), + Artist(id = 116650, name = "aoyama kiiro."), + Artist(id = 151045, name = "aozakana"), + Artist(id = 10463, name = "araiguma"), + Artist(id = 158112, name = "arai kei"), + Artist(id = 92332, name = "arai taiki"), + Artist(id = 28780, name = "arai togami"), + Artist(id = 16882, name = "arakure"), + Artist(id = 15113, name = "aramaki echizen"), + Artist(id = 14268, name = "aratagawa nikei"), + Artist(id = 105596, name = "arato asato"), + Artist(id = 216978, name = "are"), + Artist(id = 217369, name = "arekusa mahone"), + Artist(id = 115575, name = "ari"), + Artist(id = 160711, name = "arima kouichi"), + Artist(id = 72872, name = "arimura ario"), + Artist(id = 220580, name = "arimura daikon"), + Artist(id = 8131, name = "arinotowatari"), + Artist(id = 188411, name = "ariyoshi gen"), + Artist(id = 188600, name = "arurumo"), + Artist(id = 180731, name = "arutera"), + Artist(id = 217023, name = "asagi aya"), + Artist(id = 178845, name = "asahiruyou"), + Artist(id = 220679, name = "asakawa"), + Artist(id = 93486, name = "asakawa shina"), + Artist(id = 148470, name = "asaki takayuki"), + Artist(id = 164859, name = "asami aozora"), + Artist(id = 25437, name = "asamine tel"), + Artist(id = 146200, name = "asanagi"), + Artist(id = 220558, name = "asanagi rin"), + Artist(id = 206388, name = "asane ken"), + Artist(id = 101836, name = "asano yomichi"), + Artist(id = 134376, name = "asaomi shimura"), + Artist(id = 143096, name = "asawa"), + Artist(id = 120966, name = "ashina mellow"), + Artist(id = 91, name = "ashiomi masato"), + Artist(id = 95912, name = "ashizuki"), + Artist(id = 12239, name = "ash yokoshima"), + Artist(id = 29930, name = "atage"), + Artist(id = 41292, name = "awata mokane"), + Artist(id = 19849, name = "awayume"), + Artist(id = 149551, name = "ayakase chiyoko"), + Artist(id = 170882, name = "ayakawa riku"), + Artist(id = 32289, name = "ayaki"), + Artist(id = 180784, name = "ayamy"), + Artist(id = 188161, name = "ayanakitori"), + Artist(id = 136, name = "ayane"), + Artist(id = 182150, name = "ayano baru"), + Artist(id = 110109, name = "ayano rena"), + Artist(id = 29017, name = "ayase atori"), + Artist(id = 122266, name = "ayatori"), + Artist(id = 37115, name = "ayuma sayu"), + Artist(id = 138511, name = "azarashi"), + Artist(id = 143566, name = "azegami"), + Artist(id = 25206, name = "azuki yui"), + Artist(id = 1684, name = "azuma tesshin"), + Artist(id = 134573, name = "azumi kyohei"), + Artist(id = 180732, name = "azusa"), + Artist(id = 220629, name = "azusa kina"), + Artist(id = 178212, name = "baa"), + Artist(id = 220738, name = "babangida yanagida"), + Artist(id = 4314, name = "baksheesh at"), + Artist(id = 5833, name = "bakuya"), + Artist(id = 171201, name = "bambi"), + Artist(id = 217296, name = "ban"), + Artist(id = 149694, name = "bang-you"), + Artist(id = 220871, name = "banjyaku"), + Artist(id = 33991, name = "ban kazuyasu"), + Artist(id = 13139, name = "bareisho"), + Artist(id = 150105, name = "barlun"), + Artist(id = 17749, name = "baruto naisu"), + Artist(id = 124288, name = "baryu"), + Artist(id = 14834, name = "batsu"), + Artist(id = 217902, name = "bekotarou"), + Artist(id = 115, name = "benantoka"), + Artist(id = 23112, name = "benimura karu"), + Artist(id = 163417, name = "benzou"), + Artist(id = 67969, name = "berose"), + Artist(id = 220875, name = "betty"), + Artist(id = 50047, name = "b-ginga"), + Artist(id = 43276, name = "bibi"), + Artist(id = 23263, name = "bifidus"), + Artist(id = 216038, name = "billion"), + Artist(id = 166396, name = "binto"), + Artist(id = 40955, name = "blman"), + Artist(id = 219113, name = "blue gk"), + Artist(id = 7929, name = "bobobo"), + Artist(id = 216026, name = "bodoyama"), + Artist(id = 45674, name = "bonnie"), + Artist(id = 14998, name = "bonza"), + Artist(id = 146516, name = "booch"), + Artist(id = 211866, name = "bori hori"), + Artist(id = 830, name = "bosshi"), + Artist(id = 17644, name = "bota mochito"), + Artist(id = 192207, name = "bouhatei"), + Artist(id = 4573, name = "bowcan"), + Artist(id = 220512, name = "boxreeema"), + Artist(id = 220896, name = "broiler"), + Artist(id = 40842, name = "bubuzuke"), + Artist(id = 177218, name = "bukatsu"), + Artist(id = 216090, name = "bukuro yamada"), + Artist(id = 9572, name = "bun"), + Artist(id = 51013, name = "buranran"), + Artist(id = 218170, name = "butachang"), + Artist(id = 137238, name = "butatamako"), + Artist(id = 217614, name = "butayaro pork"), + Artist(id = 7418, name = "butcha-u"), + Artist(id = 117772, name = "camonome"), + Artist(id = 125373, name = "can tamax"), + Artist(id = 216040, name = "cardinal"), + Artist(id = 220589, name = "castle akumerou"), + Artist(id = 220624, name = "catking"), + Artist(id = 219945, name = "chabashira tatsukichi"), + Artist(id = 144689, name = "chanmugi"), + Artist(id = 98169, name = "chano mina"), + Artist(id = 66280, name = "chan shiden"), + Artist(id = 106759, name = "chiba toshirou"), + Artist(id = 218391, name = "chicke iii"), + Artist(id = 14100, name = "chika"), + Artist(id = 126087, name = "chiku"), + Artist(id = 151317, name = "chilt"), + Artist(id = 103103, name = "▲ chimaki"), + Artist(id = 168106, name = "chimosaku"), + Artist(id = 12693, name = "chimple hotter"), + Artist(id = 154975, name = "chin"), + Artist(id = 215000, name = "chinetsu"), + Artist(id = 175642, name = "chinpoki"), + Artist(id = 212990, name = "chinzurina"), + Artist(id = 73415, name = "chipa"), + Artist(id = 216096, name = "chiri"), + Artist(id = 177144, name = "chirinu iroha"), + Artist(id = 30524, name = "chiune"), + Artist(id = 151455, name = "chiyami"), + Artist(id = 2750, name = "chobipero"), + Artist(id = 220490, name = "chochomi"), + Artist(id = 208753, name = "chocobeam"), + Artist(id = 216080, name = "chocoro"), + Artist(id = 154412, name = "chocovanilla"), + Artist(id = 145219, name = "choipiro"), + Artist(id = 100181, name = "chorimokki"), + Artist(id = 7227, name = "chouzetsu bishoujo mine"), + Artist(id = 183352, name = "chro"), + Artist(id = 29740, name = "chupimaro"), + Artist(id = 108099, name = "chuunen"), + Artist(id = 159849, name = "clover"), + Artist(id = 120954, name = "cobra no woyatsu"), + Artist(id = 220547, name = "coffee kizoku"), + Artist(id = 198089, name = "collagen"), + Artist(id = 119068, name = "comichipota"), + Artist(id = 84039, name = "commamion"), + Artist(id = 217843, name = "como"), + Artist(id = 185504, name = "cotton"), + Artist(id = 15613, name = "coupe"), + Artist(id = 97862, name = "crew"), + Artist(id = 173981, name = "crimson"), + Artist(id = 166451, name = "crimson crown"), + Artist(id = 114373, name = "croriin"), + Artist(id = 144319, name = "cucchiore"), + Artist(id = 157923, name = "cuck manga j\u0026w"), + Artist(id = 218480, name = "cup-chan"), + Artist(id = 7074, name = "curie"), + Artist(id = 14088, name = "cuvie"), + Artist(id = 150704, name = "cyberunique"), + Artist(id = 156932, name = "cyclone"), + Artist(id = 4631, name = "dagashi"), + Artist(id = 113069, name = "daiji"), + Artist(id = 160193, name = "daisuke hiyama"), + Artist(id = 33898, name = "dam"), + Artist(id = 83636, name = "danchino"), + Artist(id = 8746, name = "dancyo"), + Artist(id = 144016, name = "daniku"), + Artist(id = 175405, name = "danimaru"), + Artist(id = 123436, name = "danrenji"), + Artist(id = 98983, name = "danshiro"), + Artist(id = 152017, name = "darabuchi"), + Artist(id = 164706, name = "dark†zone"), + Artist(id = 200291, name = "darunekohanten"), + Artist(id = 119274, name = "dasui*"), + Artist(id = 93795, name = "dawarishi"), + Artist(id = 153782, name = "de"), + Artist(id = 155441, name = "deep valley"), + Artist(id = 180736, name = "deko"), + Artist(id = 116184, name = "dekosuke 18gou"), + Artist(id = 100265, name = "delta nine"), + Artist(id = 156297, name = "denchi"), + Artist(id = 25786, name = "derauea"), + Artist(id = 220876, name = "dermar"), + Artist(id = 39685, name = "desumokun"), + Artist(id = 183701, name = "dharker studios"), + Artist(id = 25294, name = "diathorn"), + Artist(id = 12483, name = "dibi"), + Artist(id = 10496, name = "dicca suemitsu"), + Artist(id = 67501, name = "diisuke"), + Artist(id = 108772, name = "dikk0"), + Artist(id = 3101, name = "distance"), + Artist(id = 18143, name = "dobato"), + Artist(id = 198248, name = "dochashiko"), + Artist(id = 120838, name = "doemutan"), + Artist(id = 219570, name = "doji ro"), + Artist(id = 151562, name = "doku denpa"), + Artist(id = 217106, name = "dokurosan"), + Artist(id = 58109, name = "don"), + Artist(id = 193220, name = "donden"), + Artist(id = 85982, name = "dopikasu-chan"), + Artist(id = 220645, name = "doppel"), + Artist(id = 138403, name = "doranoyama"), + Artist(id = 220536, name = "dorozumi"), + Artist(id = 220649, name = "dosojin"), + Artist(id = 54479, name = "dotsuco"), + Artist(id = 306, name = "doumou"), + Artist(id = 180787, name = "doushima"), + Artist(id = 105458, name = "doxy"), + Artist(id = 161844, name = "dozamura"), + Artist(id = 91208, name = "dramus"), + Artist(id = 174069, name = "dr. p"), + Artist(id = 180788, name = "dsmile"), + Artist(id = 20828, name = "dynamite moca"), + Artist(id = 165215, name = "dytm"), + Artist(id = 122357, name = "e9"), + Artist(id = 220893, name = "ebi193"), + Artist(id = 54406, name = "ebina ebi"), + Artist(id = 1565, name = "ebi shri"), + Artist(id = 219714, name = "ebi top"), + Artist(id = 78700, name = "echigoya takeru"), + Artist(id = 168811, name = "eclipse"), + Artist(id = 220266, name = "eco heeky"), + Artist(id = 171342, name = "eda"), + Artist(id = 13899, name = "edogawa roman"), + Artist(id = 104042, name = "ee"), + Artist(id = 197795, name = "efuefu"), + Artist(id = 4155, name = "eguchi jaws"), + Artist(id = 170787, name = "eigetu"), + Artist(id = 17041, name = "eikichi"), + Artist(id = 9329, name = "eizan"), + Artist(id = 5175, name = "ekakibit"), + Artist(id = 26935, name = "electric sheep"), + Artist(id = 220647, name = "eltoria"), + Artist(id = 176753, name = "ema"), + Artist(id = 27863, name = "emily"), + Artist(id = 105514, name = "emu"), + Artist(id = 170, name = "e-musu aki"), + Artist(id = 31727, name = "endou hiroto"), + Artist(id = 63032, name = "eneko"), + Artist(id = 220929, name = "enishi"), + Artist(id = 151706, name = "ennorei"), + Artist(id = 47563, name = "eno"), + Artist(id = 215967, name = "enoka"), + Artist(id = 83414, name = "enoki"), + Artist(id = 152904, name = "enokippu"), + Artist(id = 217705, name = "eno yukimi"), + Artist(id = 16950, name = "enuhani"), + Artist(id = 38118, name = "eo masaka"), + Artist(id = 93598, name = "erect sawaru"), + Artist(id = 196928, name = "ereere"), + Artist(id = 96300, name = "erocchi"), + Artist(id = 113871, name = "eroi-roe"), + Artist(id = 44391, name = "eroki"), + Artist(id = 156615, name = "erotibot"), + Artist(id = 97107, name = "eshimoto"), + Artist(id = 41118, name = "esuke"), + Artist(id = 73731, name = "esuo"), + Artist(id = 114500, name = "etsuzan jakusui"), + Artist(id = 171003, name = "etuzan jakusui"), + Artist(id = 9128, name = "eudetenis"), + Artist(id = 14, name = "f4u"), + Artist(id = 220763, name = "fataaa"), + Artist(id = 27581, name = "fell_tale"), + Artist(id = 216059, name = "ffc"), + Artist(id = 183385, name = "flage"), + Artist(id = 44681, name = "flanvia"), + Artist(id = 140760, name = "flugel"), + Artist(id = 98664, name = "fly"), + Artist(id = 107266, name = "focke wulf"), + Artist(id = 171367, name = "freedom prophet"), + Artist(id = 52358, name = "frisuku"), + Artist(id = 220891, name = "fue"), + Artist(id = 29670, name = "fueru natto"), + Artist(id = 177897, name = "fuguta-ke"), + Artist(id = 52231, name = "fujihan"), + Artist(id = 2270, name = "fujimaru"), + Artist(id = 204530, name = "fujimoto ikura"), + Artist(id = 185126, name = "fujisaki chiro"), + Artist(id = 216254, name = "fujisaki fujiko"), + Artist(id = 40724, name = "fujisaki hikari"), + Artist(id = 220932, name = "fujisaki yuu"), + Artist(id = 129651, name = "fujitaku"), + Artist(id = 31135, name = "fujitasuku"), + Artist(id = 26414, name = "fujitsuna"), + Artist(id = 5738, name = "fujiyama"), + Artist(id = 189169, name = "fujizarashi"), + Artist(id = 157396, name = "fujoujoshi"), + Artist(id = 206800, name = "fukidamari"), + Artist(id = 6784, name = "fukumaaya"), + Artist(id = 30232, name = "fukuroumori"), + Artist(id = 83672, name = "fukuyama naoto"), + Artist(id = 17414, name = "fumio"), + Artist(id = 220689, name = "fumitsuki sou"), + Artist(id = 180738, name = "funatsu kazuki"), + Artist(id = 78926, name = "furatsu"), + Artist(id = 157888, name = "furisuku"), + Artist(id = 108632, name = "furumoto takeru"), + Artist(id = 1060, name = "fu-ta"), + Artist(id = 147729, name = "futaba yodomu"), + Artist(id = 66983, name = "futamine kobito"), + Artist(id = 121938, name = "futatan"), + Artist(id = 20875, name = "fuyukaza tsubasa"), + Artist(id = 220715, name = "fuzinoe 13b"), + Artist(id = 161675, name = "fuzui"), + Artist(id = 170228, name = "gachonjirou"), + Artist(id = 173723, name = "gagarin kichi"), + Artist(id = 31242, name = "gaien"), + Artist(id = 53093, name = "gamma ray"), + Artist(id = 76503, name = "gar"), + Artist(id = 189690, name = "geboku kazuaki"), + Artist(id = 27545, name = "gegera toshikazu"), + Artist(id = 93084, name = "gekka f-to"), + Artist(id = 181219, name = "gen"), + Artist(id = 39655, name = "gengorou"), + Artist(id = 28487, name = "gentsuki"), + Artist(id = 106270, name = "george hirune"), + Artist(id = 180739, name = "geshumaro"), + Artist(id = 104958, name = "geso smith"), + Artist(id = 61645, name = "gesundheit"), + Artist(id = 46073, name = "gggg"), + Artist(id = 160194, name = "gibuchoko"), + Artist(id = 25672, name = "gintarou"), + Artist(id = 157908, name = "ginyou haru"), + Artist(id = 17006, name = "girigiri mai"), + Artist(id = 180740, name = "giuniu"), + Artist(id = 186004, name = "godo kotaro"), + Artist(id = 157225, name = "goji ogawa"), + Artist(id = 66565, name = "gokubuto mayuge"), + Artist(id = 216082, name = "goma gorilla"), + Artist(id = 4662, name = "gomennasai"), + Artist(id = 24225, name = "gomu"), + Artist(id = 44899, name = "gonza"), + Artist(id = 13284, name = "gorgeous takarada"), + Artist(id = 180790, name = "gorobots"), + Artist(id = 82241, name = "gosaiji"), + Artist(id = 120768, name = "goten"), + Artist(id = 194286, name = "gram"), + Artist(id = 157318, name = "great mosu"), + Artist(id = 180791, name = "guchico"), + Artist(id = 21512, name = "guglielmo"), + Artist(id = 167220, name = "guhan shounen"), + Artist(id = 1044, name = "gujira"), + Artist(id = 13059, name = "gunnousa"), + Artist(id = 214595, name = "guremasu"), + Artist(id = 117415, name = "guts shihan"), + Artist(id = 35303, name = "g-wara"), + Artist(id = 2387, name = "gy"), + Artist(id = 180082, name = "gyutan"), + Artist(id = 214461, name = "hachisuto"), + Artist(id = 2893, name = "hachiya makoto"), + Artist(id = 85859, name = "hagiyoshi"), + Artist(id = 153345, name = "haiba nemumi"), + Artist(id = 220561, name = "haijima"), + Artist(id = 220743, name = "haika"), + Artist(id = 84830, name = "haitokukan"), + Artist(id = 74019, name = "haji"), + Artist(id = 6529, name = "hakano shinsir"), + Artist(id = 9674, name = "hakkyou daioujou"), + Artist(id = 41098, name = "hal"), + Artist(id = 759, name = "hamao"), + Artist(id = 175766, name = "hamidashi kanitama"), + Artist(id = 25214, name = "hanabi"), + Artist(id = 26820, name = "hanafuda sakurano"), + Artist(id = 145622, name = "hanaharu naruco"), + Artist(id = 147107, name = "hanauna"), + Artist(id = 180792, name = "hanekoto"), + Artist(id = 157238, name = "hanekumo"), + Artist(id = 108211, name = "happoubi jin"), + Artist(id = 1099, name = "hardboiled yoshiko"), + Artist(id = 59048, name = "haregama"), + Artist(id = 15762, name = "harenochiame"), + Artist(id = 11793, name = "harigane shinshi"), + Artist(id = 216259, name = "haruharu haruto"), + Artist(id = 27317, name = "harukichi"), + Artist(id = 216031, name = "harumachi uro"), + Artist(id = 164727, name = "harumare"), + Artist(id = 216057, name = "haruno manji"), + Artist(id = 27261, name = "harurun"), + Artist(id = 179206, name = "harusawa"), + Artist(id = 6391, name = "haru yukiko"), + Artist(id = 25694, name = "hashibiro kou"), + Artist(id = 35167, name = "hashimoto"), + Artist(id = 137355, name = "hashina tamaki"), + Artist(id = 152379, name = "hassen"), + Artist(id = 220921, name = "hasunoue baitsu"), + Artist(id = 32804, name = "hatimoto"), + Artist(id = 210305, name = "hatomugi munmun"), + Artist(id = 220601, name = "hatori kinoko"), + Artist(id = 188326, name = "hato tsumugi"), + Artist(id = 161613, name = "hattori masaki"), + Artist(id = 180741, name = "hayakawa akari"), + Artist(id = 75474, name = "hazakura satsuki"), + Artist(id = 72805, name = "hazu hazuki"), + Artist(id = 17529, name = "hazuki yuuto"), + Artist(id = 199992, name = "hellooo"), + Artist(id = 35221, name = "henkuma"), + Artist(id = 220856, name = "henoeno"), + Artist(id = 2254, name = "henreader"), + Artist(id = 85687, name = "henrybird"), + Artist(id = 1373, name = "heriyama"), + Artist(id = 219971, name = "hetaren"), + Artist(id = 157037, name = "hetata"), + Artist(id = 162925, name = "hidarikiki"), + Artist(id = 66019, name = "hidarite tarou"), + Artist(id = 215295, name = "hide"), + Artist(id = 220604, name = "hieizan oniku"), + Artist(id = 31491, name = "higashide irodori"), + Artist(id = 78764, name = "higashino mikan"), + Artist(id = 174981, name = "higefurai"), + Artist(id = 211, name = "higenamuchi"), + Artist(id = 64795, name = "higeta"), + Artist(id = 148743, name = "highlow"), + Artist(id = 120225, name = "hihiyama yokikana"), + Artist(id = 160459, name = "hiiragi popura"), + Artist(id = 7988, name = "himeno komomo"), + Artist(id = 220221, name = "himukai kyousuke"), + Artist(id = 180742, name = "himura kiseki"), + Artist(id = 133279, name = "himuro shunsuke"), + Artist(id = 4455, name = "hinahara emi"), + Artist(id = 1254, name = "hinasaki yo"), + Artist(id = 191133, name = "hinata aosuke"), + Artist(id = 26153, name = "hinazuka ryo"), + Artist(id = 15181, name = "hinoshita akame"), + Artist(id = 220854, name = "hino yamada"), + Artist(id = 189333, name = "hiraga daidai"), + Artist(id = 4725, name = "hirama hirokazu"), + Artist(id = 192715, name = "hiramaru akira"), + Artist(id = 161511, name = "hiramedousa"), + Artist(id = 21166, name = "hirano tetsuyuki"), + Artist(id = 74969, name = "hirayan"), + Artist(id = 7403, name = "hirno"), + Artist(id = 106369, name = "hirono azuma"), + Artist(id = 25683, name = "hiroshiki"), + Artist(id = 220612, name = "hiroyoshi kira"), + Artist(id = 220640, name = "hiroyuki"), + Artist(id = 1426, name = "hiroyuki sanadura"), + Artist(id = 70201, name = "hirune"), + Artist(id = 3737, name = "hiru okita"), + Artist(id = 53155, name = "hisagi"), + Artist(id = 147573, name = "hisama kumako"), + Artist(id = 16432, name = "hisasi"), + Artist(id = 14945, name = "hishigata tomaru"), + Artist(id = 3245, name = "hissatsukun"), + Artist(id = 220701, name = "hitonitachi"), + Artist(id = 14001, name = "hitori"), + Artist(id = 11595, name = "hiura r"), + Artist(id = 180836, name = "hiwatari rin"), + Artist(id = 12807, name = "hiyocco"), + Artist(id = 195079, name = "hiyori hamster"), + Artist(id = 945, name = "hiyoshi hana"), + Artist(id = 180794, name = "hncl"), + Artist(id = 194103, name = "hogeramu"), + Artist(id = 216054, name = "hokke"), + Artist(id = 2306, name = "homunculus"), + Artist(id = 6989, name = "hone"), + Artist(id = 154846, name = "honey bomb"), + Artist(id = 38295, name = "honryou hanaru"), + Artist(id = 57711, name = "hon toku"), + Artist(id = 31620, name = "horieros"), + Artist(id = 187189, name = "hori hiroaki"), + Artist(id = 141546, name = "horita ahan"), + Artist(id = 122410, name = "hoshii nasake"), + Artist(id = 211517, name = "hoshitani kyo"), + Artist(id = 103568, name = "hoshito lucky"), + Artist(id = 10172, name = "hota."), + Artist(id = 204950, name = "hoyhoy colo"), + Artist(id = 159351, name = "hozumi kenji"), + Artist(id = 8363, name = "hse"), + Artist(id = 176957, name = "hubrael"), + Artist(id = 87456, name = "hxxg"), + Artist(id = 6172, name = "hyji"), + Artist(id = 26392, name = "hyocorou"), + Artist(id = 216088, name = "hyougo kijima"), + Artist(id = 176463, name = "hyperdropkick"), + Artist(id = 84292, name = "ibarame hisa"), + Artist(id = 67675, name = "ibuki haruhi"), + Artist(id = 216081, name = "iburo."), + Artist(id = 35951, name = "iburou."), + Artist(id = 211344, name = "ichi"), + Artist(id = 6729, name = "ichiei"), + Artist(id = 33842, name = "ichigain"), + Artist(id = 4428, name = "ichigou"), + Artist(id = 31270, name = "ichihara hikari z"), + Artist(id = 106427, name = "ichihaya"), + Artist(id = 14053, name = "ichiko"), + Artist(id = 58, name = "ichimatsu"), + Artist(id = 141835, name = "ichimoku-san"), + Artist(id = 212086, name = "ichinomiya87"), + Artist(id = 19056, name = "ichinomiya yuu"), + Artist(id = 24482, name = "ichinose land"), + Artist(id = 119670, name = "ichi-okunen wakusei"), + Artist(id = 48956, name = "ichiren takushou"), + Artist(id = 29400, name = "ichiri"), + Artist(id = 37411, name = "ichiro"), + Artist(id = 81620, name = "idaten funisuke"), + Artist(id = 97489, name = "igedoaha"), + Artist(id = 163752, name = "iida toyoyuki"), + Artist(id = 6840, name = "ikematsu"), + Artist(id = 41097, name = "iketaki ganguten"), + Artist(id = 205003, name = "iketaraiku"), + Artist(id = 3803, name = "ikeuchi tanuma"), + Artist(id = 44225, name = "ikeya"), + Artist(id = 63710, name = "ikezaki misa"), + Artist(id = 180744, name = "iku"), + Artist(id = 41130, name = "ikuhana niiro"), + Artist(id = 220608, name = "imai yuumi"), + Artist(id = 220868, name = "ima the now"), + Artist(id = 4186, name = "imazon"), + Artist(id = 185312, name = "imotarou"), + Artist(id = 122817, name = "inagita"), + Artist(id = 27812, name = "inago"), + Artist(id = 219036, name = "inari"), + Artist(id = 61850, name = "inari mochi"), + Artist(id = 155984, name = "inato serere"), + Artist(id = 156914, name = "indo curry"), + Artist(id = 180795, name = "infinote"), + Artist(id = 137888, name = "inonaka kawazu"), + Artist(id = 6741, name = "inoue makito"), + Artist(id = 605, name = "inu"), + Artist(id = 4781, name = "inuburo"), + Artist(id = 4497, name = "inue shinsuke"), + Artist(id = 65413, name = "inukami inoji"), + Artist(id = 220905, name = "inu 犬"), + Artist(id = 155521, name = "inu (犬)"), + Artist(id = 164434, name = "iron y"), + Artist(id = 220639, name = "isaki uta"), + Artist(id = 262, name = "isao"), + Artist(id = 174578, name = "ishigaki takashi"), + Artist(id = 220559, name = "ishikarian"), + Artist(id = 16475, name = "ishikawa hirodi"), + Artist(id = 103, name = "ishikawa shisuke"), + Artist(id = 3044, name = "ishikei"), + Artist(id = 137815, name = "ishito yuhra"), + Artist(id = 32393, name = "isora inasa"), + Artist(id = 146027, name = "isya"), + Artist(id = 43896, name = "itami"), + Artist(id = 174125, name = "itaoitsuko"), + Artist(id = 216264, name = "itohana"), + Artist(id = 34561, name = "itose ikuto"), + Artist(id = 1114, name = "itou ei"), + Artist(id = 28698, name = "itou eight"), + Artist(id = 219037, name = "itou nanami"), + Artist(id = 41335, name = "itouya"), + Artist(id = 68185, name = "itsuki kuro"), + Artist(id = 12186, name = "itsutsuse"), + Artist(id = 128255, name = "iwami yasoya"), + Artist(id = 33064, name = "iwasaki yuuki"), + Artist(id = 182395, name = "iwashita"), + Artist(id = 191053, name = "iyo"), + Artist(id = 35455, name = "izumiya otoha"), + Artist(id = 22651, name = "izure"), + Artist(id = 155059, name = "j9"), + Artist(id = 158942, name = "jack"), + Artist(id = 34286, name = "jackie lesnick"), + Artist(id = 66266, name = "jagayama tarawo"), + Artist(id = 122380, name = "jaguchi"), + Artist(id = 156125, name = "jake"), + Artist(id = 149503, name = "jeans"), + Artist(id = 2851, name = "jingrock"), + Artist(id = 179976, name = "jinja ale"), + Artist(id = 75534, name = "jino"), + Artist(id = 98030, name = "jjune"), + Artist(id = 180837, name = "jonsun"), + Artist(id = 31015, name = "jony"), + Artist(id = 26805, name = "joutai ijou(doku)"), + Artist(id = 163655, name = "jūichi"), + Artist(id = 154453, name = "junshain inoue"), + Artist(id = 197934, name = "jury"), + Artist(id = 194542, name = "kaauchi"), + Artist(id = 23566, name = "kaba shiromi"), + Artist(id = 3908, name = "kaduchi"), + Artist(id = 67036, name = "kaenuco"), + Artist(id = 48663, name = "kaerunoko"), + Artist(id = 91893, name = "kaga akuru"), + Artist(id = 180838, name = "kagawa ichigo"), + Artist(id = 90976, name = "kaiduka"), + Artist(id = 275, name = "kai maruco"), + Artist(id = 26714, name = "kaitenfude"), + Artist(id = 16221, name = "kakao"), + Artist(id = 120429, name = "kakei kei"), + Artist(id = 45437, name = "kakino nashiko"), + Artist(id = 156443, name = "kakitsubata kanae"), + Artist(id = 38734, name = "kakizaki kousei"), + Artist(id = 103514, name = "kakunini"), + Artist(id = 157358, name = "kakuzato"), + Artist(id = 214007, name = "kakyubushi"), + Artist(id = 171474, name = "kamaboko"), + Artist(id = 203143, name = "kamakiri farm"), + Artist(id = 48771, name = "kamekichi"), + Artist(id = 179510, name = "kame ranppa hi"), + Artist(id = 14054, name = "kameyoshi ichiko"), + Artist(id = 1837, name = "kamishiro ryu"), + Artist(id = 26836, name = "kamitani"), + Artist(id = 180746, name = "kamiyama aya"), + Artist(id = 1756, name = "kamiya zuzu"), + Artist(id = 12936, name = "kamizuki shiki"), + Artist(id = 68199, name = "kamo"), + Artist(id = 220727, name = "kamo naberou"), + Artist(id = 220699, name = "kaname kinuco"), + Artist(id = 61764, name = "kanari tokusaku"), + Artist(id = 35740, name = "kanbayashi chiko"), + Artist(id = 5677, name = "kanbe"), + Artist(id = 25146, name = "kaneko toshiaki"), + Artist(id = 124515, name = "kangoku meika"), + Artist(id = 218649, name = "kaniguruma"), + Artist(id = 47847, name = "kanimura ebio"), + Artist(id = 157651, name = "kanju"), + Artist(id = 138053, name = "kanmuri"), + Artist(id = 15920, name = "kanna tetsuboku"), + Artist(id = 161303, name = "kanno takashi"), + Artist(id = 218439, name = "kanon ishino"), + Artist(id = 180798, name = "kantoku"), + Artist(id = 28062, name = "kanzaki maguro"), + Artist(id = 62627, name = "kanzume"), + Artist(id = 125794, name = "kapo"), + Artist(id = 114029, name = "kaponco taroh"), + Artist(id = 8653, name = "kappipe"), + Artist(id = 218512, name = "karaage-chan"), + Artist(id = 26288, name = "karakuchi choucream"), + Artist(id = 2611, name = "karasu"), + Artist(id = 205970, name = "karasu chan"), + Artist(id = 89756, name = "karasu-chan"), + Artist(id = 78, name = "karma tatsuro"), + Artist(id = 153422, name = "karory"), + Artist(id = 5555, name = "karoti"), + Artist(id = 6637, name = "karube guri"), + Artist(id = 54854, name = "kasei"), + Artist(id = 176741, name = "kashiwagi zonbi"), + Artist(id = 220726, name = "kasoku"), + Artist(id = 16295, name = "kasugano tobari"), + Artist(id = 335, name = "kasuga souichi"), + Artist(id = 67757, name = "kasukasu"), + Artist(id = 175206, name = "katanashi apollo"), + Artist(id = 1502, name = "katase minami"), + Artist(id = 19494, name = "katatsuki kei"), + Artist(id = 188918, name = "katoru panda"), + Artist(id = 3072, name = "katou rennyuu"), + Artist(id = 165018, name = "katsura harufumi"), + Artist(id = 2480, name = "katsurai yoshiaki"), + Artist(id = 160195, name = "katsura takada"), + Artist(id = 10405, name = "kätzchen"), + Artist(id = 3473, name = "kawahagi sakana"), + Artist(id = 4390, name = "kawaisaw"), + Artist(id = 190388, name = "kawakami masaki"), + Artist(id = 18464, name = "kawano masatoshi"), + Artist(id = 106216, name = "kawaraya"), + Artist(id = 201502, name = "kawasaki"), + Artist(id = 80890, name = "kawashima yoshio"), + Artist(id = 160196, name = "kaworu watashiya"), + Artist(id = 180799, name = "kayahara"), + Artist(id = 62306, name = "kayama kifumi"), + Artist(id = 135120, name = "kayama rim"), + Artist(id = 187871, name = "kayama yuichiro"), + Artist(id = 93958, name = "kayumidome"), + Artist(id = 15774, name = "kazakura"), + Artist(id = 184711, name = "kaza midori"), + Artist(id = 24699, name = "kaze no gotoku!"), + Artist(id = 103032, name = "kazepana"), + Artist(id = 106011, name = "kazuki"), + Artist(id = 1440, name = "kazuma muramasa"), + Artist(id = 220637, name = "kazutoki shiki"), + Artist(id = 220634, name = "kechin"), + Artist(id = 3004, name = "kekemotsu"), + Artist(id = 2588, name = "kekocha"), + Artist(id = 158828, name = "kemigawa"), + Artist(id = 7104, name = "kemuri haku"), + Artist(id = 29263, name = "ken-1"), + Artist(id = 47504, name = "kenji"), + Artist(id = 220483, name = "kenkou cross"), + Artist(id = 104793, name = "kento okayama"), + Artist(id = 97675, name = "keoya"), + Artist(id = 2502, name = "kerorin"), + Artist(id = 1304, name = "ketsuyuki tamon"), + Artist(id = 564, name = "key"), + Artist(id = 211121, name = "keyyan"), + Artist(id = 5658, name = "kiasa"), + Artist(id = 220712, name = "kiba satoshi"), + Artist(id = 8153, name = "kichihachi"), + Artist(id = 19750, name = "kichiroku"), + Artist(id = 170664, name = "kicktyan"), + Artist(id = 156631, name = "kid"), + Artist(id = 87730, name = "kidmo"), + Artist(id = 62307, name = "kihachi uro"), + Artist(id = 180800, name = "kii kanna"), + Artist(id = 220903, name = "kiiroi shizuku"), + Artist(id = 68080, name = "kiiroi tamago"), + Artist(id = 7264, name = "kikaider reijiro"), + Artist(id = 220492, name = "kikiga"), + Artist(id = 166476, name = "kikuichi monji"), + Artist(id = 43162, name = "kikuno sukemaru"), + Artist(id = 28566, name = "kikuta"), + Artist(id = 5210, name = "kima-gray"), + Artist(id = 19223, name = "kimi rito"), + Artist(id = 165905, name = "kinako yakumo"), + Artist(id = 70101, name = "kinata"), + Artist(id = 38605, name = "kink"), + Artist(id = 148120, name = "kin no hiyoko"), + Artist(id = 435, name = "kinntarou"), + Artist(id = 183972, name = "kinomiki"), + Artist(id = 80107, name = "kinoshita yuichi"), + Artist(id = 157861, name = "kira maru"), + Artist(id = 164618, name = "kiramaru"), + Artist(id = 168794, name = "kirei na oneesan wa suki desu kai"), + Artist(id = 173180, name = "kirekawa"), + Artist(id = 10778, name = "kirihara yuu"), + Artist(id = 89803, name = "kirimoto yuuji"), + Artist(id = 220412, name = "kirin ouji"), + Artist(id = 220683, name = "kirome"), + Artist(id = 145380, name = "kisaragi gunma"), + Artist(id = 66393, name = "kisaragi meg"), + Artist(id = 180840, name = "kisaragi yuu"), + Artist(id = 117919, name = "kise itsuki"), + Artist(id = 7880, name = "kisen"), + Artist(id = 1531, name = "kishikaisei"), + Artist(id = 220488, name = "kishizuka kenji"), + Artist(id = 79116, name = "kitahara eiji"), + Artist(id = 162667, name = "kitazato nawoki"), + Artist(id = 178995, name = "kitoen"), + Artist(id = 1877, name = "kito sakeru"), + Artist(id = 199761, name = "kiwami ichiman dageki"), + Artist(id = 16268, name = "kiyomiya ryou"), + Artist(id = 155630, name = "kiyose kaoru"), + Artist(id = 69634, name = "kiyoshiro inoue"), + Artist(id = 20888, name = "kizuka kazuki"), + Artist(id = 99350, name = "kizuki rei"), + Artist(id = 21361, name = "kloah13"), + Artist(id = 932, name = "knuckle curve"), + Artist(id = 220874, name = "kobachi kenichi"), + Artist(id = 63726, name = "kobayashi chisato"), + Artist(id = 180749, name = "kodachi natsu"), + Artist(id = 219841, name = "kodaka kazuma"), + Artist(id = 149298, name = "kogaku kazuya"), + Artist(id = 131712, name = "kogame futsu"), + Artist(id = 48705, name = "kohachi"), + Artist(id = 94012, name = "kohri"), + Artist(id = 184263, name = "kohri ms"), + Artist(id = 1792, name = "kohsaka donten"), + Artist(id = 104163, name = "koikawa minoru"), + Artist(id = 146577, name = "kojima miu"), + Artist(id = 2553, name = "kojima saya"), + Artist(id = 48171, name = "kokona"), + Artist(id = 9058, name = "kokonoki nao"), + Artist(id = 166819, name = "kokudayaka"), + Artist(id = 180750, name = "kokudou 12-go"), + Artist(id = 26857, name = "kokuryuugan"), + Artist(id = 220748, name = "komaturi tamago"), + Artist(id = 45559, name = "komezawa"), + Artist(id = 183563, name = "komota"), + Artist(id = 187354, name = "konbanwa"), + Artist(id = 37130, name = "konchiki"), + Artist(id = 215586, name = "kondo yume"), + Artist(id = 157213, name = "konecha"), + Artist(id = 86920, name = "konka"), + Artist(id = 157077, name = "kon-kit"), + Artist(id = 220894, name = "konkon tochu"), + Artist(id = 120581, name = "konnyaku"), + Artist(id = 220853, name = "konoe nanao"), + Artist(id = 158799, name = "konomi shikishiro"), + Artist(id = 106732, name = "konoshige"), + Artist(id = 3257, name = "konoshiro shinko"), + Artist(id = 183702, name = "kopi anget"), + Artist(id = 2780, name = "koppori nama beer"), + Artist(id = 137602, name = "koromotake"), + Artist(id = 220553, name = "korosuke"), + Artist(id = 60020, name = "koshino"), + Artist(id = 356, name = "kosuke haruhito"), + Artist(id = 180801, name = "kotatsu"), + Artist(id = 19040, name = "kotengu"), + Artist(id = 167469, name = "kotobuki maimu"), + Artist(id = 203672, name = "kotomaro"), + Artist(id = 164827, name = "kotoyoshi yumisuke"), + Artist(id = 216041, name = "kou"), + Artist(id = 156479, name = "kouji"), + Artist(id = 160627, name = "kouki kuu"), + Artist(id = 4715, name = "koumashiro"), + Artist(id = 245, name = "koume keito"), + Artist(id = 111546, name = "kourui"), + Artist(id = 107545, name = "koutarou"), + Artist(id = 118771, name = "koyama shigeru"), + Artist(id = 161558, name = "koyu"), + Artist(id = 12070, name = "kozakura nanane"), + Artist(id = 220479, name = "ktzw"), + Artist(id = 190208, name = "kudaraji hatsuka"), + Artist(id = 39957, name = "kudou hisashi"), + Artist(id = 180751, name = "kumanoi"), + Artist(id = 220696, name = "kumota chun"), + Artist(id = 117652, name = "kunimine yuzuki"), + Artist(id = 180752, name = "kuon michiyoshi"), + Artist(id = 151656, name = "kuratsuka riko"), + Artist(id = 148122, name = "kurenai yuuji"), + Artist(id = 8431, name = "kurimochi chizuru"), + Artist(id = 180753, name = "kuro"), + Artist(id = 152888, name = "kuroba dam"), + Artist(id = 155284, name = "kuroe"), + Artist(id = 56270, name = "kurofude anna"), + Artist(id = 155593, name = "kurogane satsuki"), + Artist(id = 12997, name = "kurohekiten"), + Artist(id = 728, name = "kuroiwa madoka"), + Artist(id = 55666, name = "kurokawa otogi"), + Artist(id = 554, name = "kurokoshi you"), + Artist(id = 220627, name = "kuron"), + Artist(id = 134980, name = "kuro-nyan"), + Artist(id = 162895, name = "kurosu gatari"), + Artist(id = 46476, name = "kurowa"), + Artist(id = 216039, name = "kuroyui"), + Artist(id = 171600, name = "kurumi moka"), + Artist(id = 20528, name = "kusada"), + Artist(id = 8676, name = "kusatsu terunyo"), + Artist(id = 29312, name = "kuunerin"), + Artist(id = 194379, name = "kuwai tomi"), + Artist(id = 27199, name = "kuze nakisu"), + Artist(id = 178016, name = "kuzuya"), + Artist(id = 26794, name = "kyockcho"), + Artist(id = 71042, name = "kyougoku touya"), + Artist(id = 99926, name = "kyou no gohan"), + Artist(id = 19792, name = "leafy"), + Artist(id = 4301, name = "leli"), + Artist(id = 881, name = "leonardo sixteen"), + Artist(id = 145654, name = "leopard"), + Artist(id = 220619, name = "lilith"), + Artist(id = 622, name = "linda"), + Artist(id = 86934, name = "lob☆star"), + Artist(id = 28384, name = "lockheart"), + Artist(id = 154520, name = "locon"), + Artist(id = 27972, name = "lolicept"), + Artist(id = 20694, name = "lolimate"), + Artist(id = 167583, name = "loopsoft"), + Artist(id = 157531, name = "loose"), + Artist(id = 156543, name = "lynus"), + Artist(id = 7435, name = "maakurou"), + Artist(id = 139330, name = "maarenka"), + Artist(id = 39814, name = "maban"), + Artist(id = 29460, name = "machimura komori"), + Artist(id = 149504, name = "madoguchiki"), + Artist(id = 140033, name = "madoka tsukumo"), + Artist(id = 6541, name = "madoutei"), + Artist(id = 180802, name = "maeda mic"), + Artist(id = 211549, name = "maemuki na doemu"), + Artist(id = 220297, name = "mafuyu"), + Artist(id = 4022, name = "mafuyu hemp"), + Artist(id = 163714, name = "magukappu"), + Artist(id = 61149, name = "maguro tekka don"), + Artist(id = 189954, name = "maid dead"), + Artist(id = 183703, name = "maid games"), + Artist(id = 216052, name = "maihara matsuge"), + Artist(id = 164703, name = "maimu-maimu"), + Artist(id = 143456, name = "majima shiroyuki"), + Artist(id = 5030, name = "majoccoid"), + Artist(id = 28510, name = "maki daikichi"), + Artist(id = 32527, name = "maki makio"), + Artist(id = 127834, name = "makin"), + Artist(id = 142355, name = "makina zero"), + Artist(id = 16363, name = "makio"), + Artist(id = 21341, name = "maki tatsuki"), + Artist(id = 6742, name = "makito"), + Artist(id = 42380, name = "makki"), + Artist(id = 5062, name = "mame denkyuu"), + Artist(id = 48398, name = "mame ojitan"), + Artist(id = 220622, name = "manial"), + Artist(id = 89228, name = "mankai kaika"), + Artist(id = 111262, name = "manno"), + Artist(id = 60642, name = "mantarou"), + Artist(id = 220216, name = "manyuu kaeru tasuke sansei"), + Artist(id = 148758, name = "maple"), + Artist(id = 211400, name = "mappadaka goutarou"), + Artist(id = 195043, name = "mappa ni natta"), + Artist(id = 49798, name = "mareo"), + Artist(id = 50820, name = "margamoid"), + Artist(id = 11002, name = "mario"), + Artist(id = 78304, name = "maririn"), + Artist(id = 27723, name = "marui maru"), + Artist(id = 160858, name = "maruta"), + Artist(id = 191919, name = "marutama negi"), + Artist(id = 27173, name = "maruwatarou"), + Artist(id = 201263, name = "mary-san"), + Artist(id = 84725, name = "ma-sa"), + Artist(id = 153692, name = "masahiro kobayashi"), + Artist(id = 148123, name = "masaru yajiro"), + Artist(id = 41597, name = "masayo"), + Artist(id = 74411, name = "mashiro shirako"), + Artist(id = 211950, name = "mashiro shiroiro"), + Artist(id = 6841, name = "masu"), + Artist(id = 220626, name = "matanoshita saguru"), + Artist(id = 142228, name = "matarou"), + Artist(id = 180754, name = "matayosi"), + Artist(id = 71720, name = "matsuda val"), + Artist(id = 220721, name = "matsuka"), + Artist(id = 6080, name = "matsukawa"), + Artist(id = 6759, name = "matsumoto drill kenkyuujo"), + Artist(id = 50280, name = "matsunami rumi"), + Artist(id = 186808, name = "matsuzono"), + Artist(id = 29370, name = "maumen"), + Artist(id = 12801, name = "maybe"), + Artist(id = 126742, name = "mayonaka taruho"), + Artist(id = 84348, name = "mayutsuba mono"), + Artist(id = 15796, name = "mda starou"), + Artist(id = 211383, name = "me"), + Artist(id = 103759, name = "meeo"), + Artist(id = 42336, name = "meika"), + Artist(id = 179258, name = "meisuke"), + Artist(id = 17516, name = "meito"), + Artist(id = 220889, name = "meito hoshina"), + Artist(id = 1293, name = "meiyamamoh"), + Artist(id = 6221, name = "meme50"), + Artist(id = 140474, name = "menbow"), + Artist(id = 5785, name = "menea the dog"), + Artist(id = 28653, name = "menoko"), + Artist(id = 216085, name = "mentaiko itto"), + Artist(id = 3675, name = "methonium"), + Artist(id = 219851, name = "meyto"), + Artist(id = 1780, name = "mg joe"), + Artist(id = 1074, name = "mg kurino"), + Artist(id = 200, name = "mgmee"), + Artist(id = 995, name = "michiking"), + Artist(id = 47225, name = "midori aoi"), + Artist(id = 180804, name = "midorikawa you"), + Artist(id = 67197, name = "midori no ruupe"), + Artist(id = 10451, name = "midorino tanuki"), + Artist(id = 101523, name = "migihaji"), + Artist(id = 220850, name = "migita"), + Artist(id = 160098, name = "miito shido"), + Artist(id = 48770, name = "mika"), + Artist(id = 64805, name = "mikaduchi"), + Artist(id = 2032, name = "mika mikami"), + Artist(id = 25809, name = "mikarin"), + Artist(id = 220427, name = "miki chika"), + Artist(id = 195213, name = "miki ooro"), + Artist(id = 73426, name = "mikuni mizuki"), + Artist(id = 156409, name = "milf shobou"), + Artist(id = 180805, name = "mimoza"), + Artist(id = 20682, name = "minagiri"), + Artist(id = 118604, name = "minakami mizuya"), + Artist(id = 18849, name = "minakuchi takashi"), + Artist(id = 220926, name = "minamax"), + Artist(id = 28741, name = "minami"), + Artist(id = 33757, name = "minamida usuke"), + Artist(id = 216045, name = "minami fumika"), + Artist(id = 38447, name = "minamino sazan"), + Artist(id = 205017, name = "minamo"), + Artist(id = 148771, name = "minamoto"), + Artist(id = 18520, name = "minasuki popuri"), + Artist(id = 149987, name = "minato fumi"), + Artist(id = 27896, name = "minato itoya"), + Artist(id = 56726, name = "minatomo"), + Artist(id = 216042, name = "minato yuu"), + Artist(id = 218339, name = "minazuki mikka"), + Artist(id = 23166, name = "minokichi"), + Artist(id = 71972, name = "minster"), + Artist(id = 159480, name = "mira"), + Artist(id = 214170, name = "mirudora"), + Artist(id = 90917, name = "misaki otoha"), + Artist(id = 1268, name = "misaoka"), + Artist(id = 396, name = "misa wasabi"), + Artist(id = 919, name = "miseo"), + Artist(id = 70492, name = "miso tanuki incan teikoku"), + Artist(id = 649, name = "mitsugi"), + Artist(id = 160958, name = "mitsuhime moka"), + Artist(id = 115416, name = "mitsuki"), + Artist(id = 33854, name = "mitsuki ponz"), + Artist(id = 220643, name = "mitsuko mouri"), + Artist(id = 198093, name = "mitsuya"), + Artist(id = 66732, name = "miura kazuki"), + Artist(id = 28464, name = "miyabi"), + Artist(id = 17276, name = "miyabi tatsuto"), + Artist(id = 211479, name = "miyahama ryo"), + Artist(id = 99925, name = "miyako no gohan"), + Artist(id = 27471, name = "miyamoto issa"), + Artist(id = 42917, name = "miyamoto liz"), + Artist(id = 125741, name = "miyazen"), + Artist(id = 1601, name = "miyuki yaya"), + Artist(id = 43027, name = "mizoguchi gelatin"), + Artist(id = 29997, name = "mizone"), + Artist(id = 216034, name = "mizue eel"), + Artist(id = 27911, name = "mizuhara yuu"), + Artist(id = 211503, name = "mizuki"), + Artist(id = 211669, name = "mizuki gai"), + Artist(id = 15860, name = "mizuki sanban"), + Artist(id = 92901, name = "mizuno chou"), + Artist(id = 148125, name = "mizuryu kei"), + Artist(id = 587, name = "mizusaki."), + Artist(id = 180755, name = "mizutame tori"), + Artist(id = 27666, name = "mizutani natsu"), + Artist(id = 163610, name = "moburaibu"), + Artist(id = 202880, name = "mocco"), + Artist(id = 216097, name = "mochi fu jin"), + Artist(id = 125240, name = "mochigome seikatsu"), + Artist(id = 11739, name = "mochi kuu usagi"), + Artist(id = 166414, name = "mochimako"), + Artist(id = 91160, name = "modare"), + Artist(id = 220682, name = "moeno yukiji"), + Artist(id = 76398, name = "mogami taketo"), + Artist(id = 171744, name = "mogemoge"), + Artist(id = 804, name = "mogg"), + Artist(id = 6139, name = "mogiki hayami"), + Artist(id = 152846, name = "mogudan"), + Artist(id = 89743, name = "mogullaz"), + Artist(id = 180841, name = "mogumo"), + Artist(id = 319, name = "mojarin"), + Artist(id = 14162, name = "moketa"), + Artist(id = 219990, name = "mokko ritchie"), + Artist(id = 20383, name = "mokufuu"), + Artist(id = 209928, name = "mokuyama hito"), + Artist(id = 7533, name = "momi"), + Artist(id = 178300, name = "momiji mimo"), + Artist(id = 3302, name = "momoduki suzu"), + Artist(id = 132430, name = "momoduzi suzu"), + Artist(id = 10596, name = "momoko"), + Artist(id = 191459, name = "momokumo"), + Artist(id = 220613, name = "momonigiri"), + Artist(id = 132365, name = "momonosuke"), + Artist(id = 40450, name = "momono yuuca"), + Artist(id = 80473, name = "momoyama hato"), + Artist(id = 105307, name = "monchan rev3"), + Artist(id = 193633, name = "monimonimo"), + Artist(id = 138970, name = "monononofu"), + Artist(id = 51223, name = "monoo kara"), + Artist(id = 15125, name = "mon-petit"), + Artist(id = 154927, name = "monyata"), + Artist(id = 180807, name = "morichika"), + Artist(id = 42427, name = "mori guruta"), + Artist(id = 57056, name = "morikoke"), + Artist(id = 189846, name = "morimarimo"), + Artist(id = 3019, name = "morimiya masayuki"), + Artist(id = 17953, name = "morimoto kiyona"), + Artist(id = 141356, name = "mori no bambi"), + Artist(id = 90867, name = "mori okojjo"), + Artist(id = 21294, name = "morishima kon"), + Artist(id = 95142, name = "mori sinrisk"), + Artist(id = 131621, name = "moriyama shijimi"), + Artist(id = 211364, name = "moriyama tarutaru"), + Artist(id = 38092, name = "motsu aki"), + Artist(id = 54143, name = "moyamoya"), + Artist(id = 111132, name = "moyori"), + Artist(id = 904, name = "mozu"), + Artist(id = 222, name = "mozuya murasaki"), + Artist(id = 58035, name = "mt"), + Artist(id = 162782, name = "mucc"), + Artist(id = 171764, name = "muchipan"), + Artist(id = 169086, name = "mugen-no-sudadokei"), + Artist(id = 185963, name = "mugicha world"), + Artist(id = 220895, name = "mukai kiyoharu"), + Artist(id = 126976, name = "mukimoto koko"), + Artist(id = 170529, name = "mumumu"), + Artist(id = 76644, name = "muneshiro"), + Artist(id = 163458, name = "munioni"), + Artist(id = 208696, name = "muoto"), + Artist(id = 220841, name = "murabito c"), + Artist(id = 147826, name = "murasakiiro orange"), + Artist(id = 33950, name = "murasaki☆nyaa"), + Artist(id = 220210, name = "muro"), + Artist(id = 40914, name = "muronaga chaashuu"), + Artist(id = 34590, name = "musashimaru"), + Artist(id = 180756, name = "musha sabu"), + Artist(id = 177286, name = "mushipan"), + Artist(id = 220771, name = "mutagawa"), + Artist(id = 5588, name = "mutou mato"), + Artist(id = 22228, name = "mutsuki haru"), + Artist(id = 153413, name = "mutsuno hexa"), + Artist(id = 576, name = "mutsutake"), + Artist(id = 5860, name = "mutya"), + Artist(id = 196138, name = "myamo"), + Artist(id = 82098, name = "n"), + Artist(id = 211729, name = "nabara shoko"), + Artist(id = 43096, name = "naenae"), + Artist(id = 1579, name = "naganoro"), + Artist(id = 102270, name = "nagase tooru"), + Artist(id = 150847, name = "nagashima chousuke"), + Artist(id = 14022, name = "nagayori"), + Artist(id = 180842, name = "nagishiro mito"), + Artist(id = 185058, name = "nagoyaka jirou"), + Artist(id = 6653, name = "naito loveca"), + Artist(id = 165594, name = "nakajima lupus"), + Artist(id = 114484, name = "nakamachi machi"), + Artist(id = 11576, name = "nakamura kuzuyu"), + Artist(id = 4542, name = "nakamura regura"), + Artist(id = 163019, name = "nakamura tenzin"), + Artist(id = 181803, name = "nakani"), + Artist(id = 6706, name = "nakano sora"), + Artist(id = 220146, name = "nako sir"), + Artist(id = 79449, name = "namae renraku"), + Artist(id = 204058, name = "namamugi"), + Artist(id = 180808, name = "namaniku atk"), + Artist(id = 974, name = "namboku"), + Artist(id = 131413, name = "namiki nazu"), + Artist(id = 116455, name = "naminori kamome"), + Artist(id = 7134, name = "namonashi"), + Artist(id = 107739, name = "nana"), + Artist(id = 86490, name = "nanae"), + Artist(id = 1159, name = "nana-g"), + Artist(id = 176703, name = "nanairo seven"), + Artist(id = 2321, name = "nanamiya tsugumi"), + Artist(id = 76754, name = "nanamoto"), + Artist(id = 44379, name = "nanao"), + Artist(id = 819, name = "nanao yukiji"), + Artist(id = 180843, name = "nanase miri"), + Artist(id = 19241, name = "nanase mizuho"), + Artist(id = 1641, name = "nanase takashi"), + Artist(id = 88947, name = "nanatsuda"), + Artist(id = 194752, name = "nanbo"), + Artist(id = 27383, name = "nanigawa rui"), + Artist(id = 123101, name = "nanita"), + Artist(id = 12880, name = "nannpu"), + Artist(id = 220869, name = "nao"), + Artist(id = 148126, name = "naokame"), + Artist(id = 211752, name = "naop"), + Artist(id = 2952, name = "napata"), + Artist(id = 105160, name = "narii ikoni"), + Artist(id = 65496, name = "narita koh"), + Artist(id = 49817, name = "narumi suzune"), + Artist(id = 149391, name = "narusawa kei"), + Artist(id = 168109, name = "narushima godou"), + Artist(id = 203997, name = "narushima kanna"), + Artist(id = 25272, name = "nashipasuta"), + Artist(id = 64658, name = "natsuhiko"), + Artist(id = 772, name = "natsuki kiyohito"), + Artist(id = 185585, name = "natsuki marina"), + Artist(id = 718, name = "natsumi iroha"), + Artist(id = 53608, name = "natsuno io"), + Artist(id = 14822, name = "natsuo wataru"), + Artist(id = 176693, name = "natsuyoshi"), + Artist(id = 15471, name = "navier haruka 2t"), + Artist(id = 220919, name = "nawofu"), + Artist(id = 4883, name = "necrosmos"), + Artist(id = 152064, name = "nectar"), + Artist(id = 2188, name = "neet"), + Artist(id = 153539, name = "neginegio"), + Artist(id = 220897, name = "negito ron"), + Artist(id = 145040, name = "neko denryoku"), + Artist(id = 210850, name = "nekoderu"), + Artist(id = 148892, name = "nekoi hikaru"), + Artist(id = 21206, name = "nekomata naomi"), + Artist(id = 153453, name = "nekorotanuki"), + Artist(id = 117294, name = "neko@ruko"), + Artist(id = 67815, name = "nekoyama kushitarou"), + Artist(id = 75129, name = "nemu"), + Artist(id = 149324, name = "nemui neru"), + Artist(id = 210107, name = "nemui nezu"), + Artist(id = 43332, name = "neo hatachi"), + Artist(id = 220603, name = "neromashin"), + Artist(id = 105102, name = "nerotarou."), + Artist(id = 220717, name = "neshia"), + Artist(id = 28156, name = "netoro morikon"), + Artist(id = 220904, name = "nezuminobo"), + Artist(id = 167080, name = "nibo niboshi"), + Artist(id = 57046, name = "nicoby"), + Artist(id = 107053, name = "nicolai no yome"), + Artist(id = 168973, name = "nico-pun-nise"), + Artist(id = 131997, name = "nigesapo"), + Artist(id = 1087, name = "niimaru yuu"), + Artist(id = 20841, name = "nijou katame"), + Artist(id = 220596, name = "niki"), + Artist(id = 103627, name = "nikubou maranoshin"), + Artist(id = 216074, name = "nikuo"), + Artist(id = 187114, name = "niku to gohan"), + Artist(id = 110626, name = "ningenjiru"), + Artist(id = 8324, name = "ninoko"), + Artist(id = 8944, name = "nippa takahide"), + Artist(id = 411, name = "niro"), + Artist(id = 72940, name = "nise"), + Artist(id = 180757, name = "nishieda"), + Artist(id = 345, name = "nishi iori"), + Artist(id = 162853, name = "nishiki ai"), + Artist(id = 158012, name = "nishimaki tohru"), + Artist(id = 32346, name = "nishio"), + Artist(id = 180844, name = "nishizawa 5mm"), + Artist(id = 72057, name = "nishizawa mizuki"), + Artist(id = 180809, name = "noco"), + Artist(id = 212721, name = "nocori"), + Artist(id = 94830, name = "nogiwa kaede"), + Artist(id = 218457, name = "no.gomes"), + Artist(id = 2837, name = "nohito"), + Artist(id = 48305, name = "noise"), + Artist(id = 17445, name = "nokin"), + Artist(id = 33430, name = "nokoppa"), + Artist(id = 209425, name = "nompang"), + Artist(id = 147340, name = "nomu"), + Artist(id = 198094, name = "nomu-tea"), + Artist(id = 1821, name = "nonaka tama"), + Artist(id = 11235, name = "non☆non"), + Artist(id = 220742, name = "nonogi"), + Artist(id = 180810, name = "nonokuro"), + Artist(id = 202729, name = "nontaro nonjiro"), + Artist(id = 35963, name = "noragami souta"), + Artist(id = 9185, name = "norasuko"), + Artist(id = 155607, name = "norigorou"), + Artist(id = 3341, name = "norinko"), + Artist(id = 157121, name = "nosa"), + Artist(id = 163258, name = "nosekichiku"), + Artist(id = 220772, name = "novice tori"), + Artist(id = 4687, name = "nozi"), + Artist(id = 189055, name = "ntntgngn"), + Artist(id = 154709, name = "ntrobo"), + Artist(id = 116730, name = "nukunuku"), + Artist(id = 38305, name = "nunnu"), + Artist(id = 216043, name = "nunogoshi taito"), + Artist(id = 204674, name = "nurumayu"), + Artist(id = 165934, name = "nusmusbim"), + Artist(id = 158925, name = "nyanko"), + Artist(id = 10747, name = "nylon"), + Artist(id = 106667, name = "obmas"), + Artist(id = 145923, name = "oda non"), + Artist(id = 52595, name = "oden70"), + Artist(id = 677, name = "ogadenmon"), + Artist(id = 452, name = "ogawa hidari"), + Artist(id = 16820, name = "ogino jun"), + Artist(id = 70045, name = "ohara makoto"), + Artist(id = 180023, name = "ohara mochisuke"), + Artist(id = 23996, name = "ohisashiburi"), + Artist(id = 9111, name = "ohkami ryosuke"), + Artist(id = 115087, name = "ohmori"), + Artist(id = 11132, name = "ojo"), + Artist(id = 140279, name = "ojou"), + Artist(id = 25138, name = "okada kou"), + Artist(id = 145422, name = "okama"), + Artist(id = 528, name = "okara"), + Artist(id = 74676, name = "okayu"), + Artist(id = 38010, name = "okinaga umanosuke"), + Artist(id = 1341, name = "okito endoh"), + Artist(id = 14180, name = "okizarisu"), + Artist(id = 208822, name = "okta"), + Artist(id = 3379, name = "okudera chiaki"), + Artist(id = 36397, name = "okumori boy"), + Artist(id = 6006, name = "okumoto yuta"), + Artist(id = 176323, name = "okuva"), + Artist(id = 193761, name = "okuyama(to)"), + Artist(id = 28841, name = "okyuuri"), + Artist(id = 49374, name = "omizu chihiro"), + Artist(id = 138195, name = "omochi"), + Artist(id = 190717, name = "onaka"), + Artist(id = 65563, name = "onaka emi"), + Artist(id = 199932, name = "ona kimaru"), + Artist(id = 169173, name = "onedollar"), + Artist(id = 61431, name = "oniben katze"), + Artist(id = 220556, name = "onigashima eryu"), + Artist(id = 172860, name = "onigirikun"), + Artist(id = 66814, name = "onigiri unicorn"), + Artist(id = 109400, name = "onigunsow"), + Artist(id = 105749, name = "oniku"), + Artist(id = 216049, name = "onizuka chris"), + Artist(id = 46824, name = "onizuka naoshi"), + Artist(id = 40799, name = "onodera"), + Artist(id = 128281, name = "ono kana"), + Artist(id = 38693, name = "onomesin"), + Artist(id = 206715, name = "ono miren"), + Artist(id = 16962, name = "onsen mantarou"), + Artist(id = 119226, name = "ooban yaki"), + Artist(id = 217783, name = "oohashi takayuki"), + Artist(id = 37325, name = "oohira sunset"), + Artist(id = 81120, name = "oomi suzu"), + Artist(id = 193428, name = "ooooalikui"), + Artist(id = 99506, name = "oosaki"), + Artist(id = 163816, name = "ooshima aki"), + Artist(id = 149944, name = "ootori mahiro"), + Artist(id = 39540, name = "ootsuka reika"), + Artist(id = 25927, name = "oouso"), + Artist(id = 31528, name = "ooyama kina"), + Artist(id = 67400, name = "ooyoko yamaame"), + Artist(id = 75731, name = "oozora wakaba"), + Artist(id = 220774, name = "oreta hone"), + Artist(id = 220635, name = "oreteki"), + Artist(id = 5318, name = "orico"), + Artist(id = 115172, name = "orihika"), + Artist(id = 216190, name = "orita"), + Artist(id = 206479, name = "orusu"), + Artist(id = 213632, name = "osakana arichi"), + Artist(id = 180813, name = "osanai"), + Artist(id = 43843, name = "osatou"), + Artist(id = 172642, name = "oshima tomo"), + Artist(id = 172643, name = "oshima towa"), + Artist(id = 220700, name = "oshiro shiroo"), + Artist(id = 71971, name = "osiimi"), + Artist(id = 8002, name = "osomatsu"), + Artist(id = 75347, name = "otochichi"), + Artist(id = 148669, name = "otoo"), + Artist(id = 18445, name = "ouchi kaeru"), + Artist(id = 153621, name = "ouma tokiichi"), + Artist(id = 115088, name = "oumikun"), + Artist(id = 220581, name = "owari ningen"), + Artist(id = 94062, name = "oyabe ryou"), + Artist(id = 192137, name = "oyuno mizuwari"), + Artist(id = 135349, name = "panda ekisu"), + Artist(id = 220931, name = "pan ☆ koojo"), + Artist(id = 5474, name = "parabola"), + Artist(id = 199592, name = "particular"), + Artist(id = 16256, name = "pei"), + Artist(id = 220654, name = "peniken"), + Artist(id = 17097, name = "pennel"), + Artist(id = 196220, name = "period ö"), + Artist(id = 18180, name = "petenshi"), + Artist(id = 61900, name = "philly"), + Artist(id = 382, name = "picao"), + Artist(id = 124217, name = "pija"), + Artist(id = 220773, name = "pikachi"), + Artist(id = 40308, name = "piririnegi"), + Artist(id = 3694, name = "piro"), + Artist(id = 18279, name = "piyopiyo"), + Artist(id = 135086, name = "pizanuko"), + Artist(id = 174566, name = "p no ji"), + Artist(id = 18993, name = "poccora"), + Artist(id = 160312, name = "pochi"), + Artist(id = 124147, name = "pochitaro"), + Artist(id = 180845, name = "pokimari"), + Artist(id = 77790, name = "pokoten"), + Artist(id = 6666, name = "polinky"), + Artist(id = 81579, name = "pome vanilla"), + Artist(id = 40931, name = "ponsuke"), + Artist(id = 18431, name = "poriure-tan"), + Artist(id = 185457, name = "poruna"), + Artist(id = 29962, name = "potekoro"), + Artist(id = 147944, name = "prime"), + Artist(id = 220872, name = "pucachi"), + Artist(id = 12527, name = "puniiyu"), + Artist(id = 220725, name = "punk"), + Artist(id = 119029, name = "purumetal"), + Artist(id = 220623, name = "pururun"), + Artist(id = 213213, name = "push mine"), + Artist(id = 166712, name = "puuzaki puuna"), + Artist(id = 27608, name = "puyocha"), + Artist(id = 15563, name = "pyon-kti"), + Artist(id = 105207, name = "pyz"), + Artist(id = 220614, name = "qudamono"), + Artist(id = 122561, name = "rabu"), + Artist(id = 25168, name = "raita"), + Artist(id = 171925, name = "raka"), + Artist(id = 2465, name = "rakko"), + Artist(id = 109966, name = "rakujin"), + Artist(id = 497, name = "rama"), + Artist(id = 81000, name = "ramu"), + Artist(id = 220907, name = "random"), + Artist(id = 26324, name = "range murata"), + Artist(id = 25228, name = "rasahan"), + Artist(id = 208581, name = "rasen kyofukaku"), + Artist(id = 14145, name = "rca"), + Artist(id = 2086, name = "rebis"), + Artist(id = 13968, name = "reco"), + Artist(id = 164532, name = "redrop"), + Artist(id = 146302, name = "red-rum"), + Artist(id = 15217, name = "regdic"), + Artist(id = 104899, name = "rei"), + Artist(id = 60371, name = "reidi"), + Artist(id = 207519, name = "reigaros"), + Artist(id = 211592, name = "reitou"), + Artist(id = 149104, name = "reitou mikan"), + Artist(id = 181162, name = "ren date"), + Artist(id = 136147, name = "rerere"), + Artist(id = 220916, name = "retsuriko oomori"), + Artist(id = 152818, name = "rib:y(uhki)"), + Artist(id = 21834, name = "rib꞉y(uhki)"), + Artist(id = 173368, name = "richard bachman"), + Artist(id = 1654, name = "rico"), + Artist(id = 101206, name = "ricochet"), + Artist(id = 203844, name = "rifuru"), + Artist(id = 100047, name = "ringo club"), + Artist(id = 220485, name = "rinon9"), + Artist(id = 3181, name = "rinu suruga"), + Artist(id = 210205, name = "ripu"), + Artist(id = 143173, name = "risui"), + Artist(id = 187515, name = "riyusa"), + Artist(id = 5628, name = "rokkaku yasosuke"), + Artist(id = 81996, name = "rokko"), + Artist(id = 67344, name = "rokkotsu"), + Artist(id = 3429, name = "rokuichi"), + Artist(id = 197457, name = "rokuroku bin"), + Artist(id = 180760, name = "rokuwata tomoe"), + Artist(id = 180846, name = "rolua"), + Artist(id = 108395, name = "ronna"), + Artist(id = 45817, name = "rororogi mogera"), + Artist(id = 57604, name = "roteri"), + Artist(id = 152106, name = "rubi-sama"), + Artist(id = 220851, name = "rukitsura."), + Artist(id = 156162, name = "runrun"), + Artist(id = 73365, name = "ruriiro sugar"), + Artist(id = 140131, name = "rustle"), + Artist(id = 30586, name = "rusty soul"), + Artist(id = 40825, name = "ryo"), + Artist(id = 112613, name = "ryoichi kurokawa"), + Artist(id = 65959, name = "ryokucha ism"), + Artist(id = 188872, name = "ryou"), + Artist(id = 94047, name = "ryoumoto hatsumi"), + Artist(id = 164179, name = "ryunosuke"), + Artist(id = 6234, name = "ryu shinonome"), + Artist(id = 220846, name = "ryuta amazume"), + Artist(id = 5618, name = "saburo"), + Artist(id = 168110, name = "sabusuka"), + Artist(id = 216087, name = "sadahiro"), + Artist(id = 185981, name = "sadao"), + Artist(id = 5684, name = "saemon"), + Artist(id = 81949, name = "sagano yuuji"), + Artist(id = 180814, name = "sage joh"), + Artist(id = 16977, name = "saijou satoru"), + Artist(id = 147908, name = "saikawa yusa"), + Artist(id = 114060, name = "saikime"), + Artist(id = 194964, name = "saikura noushu"), + Artist(id = 70335, name = "saimon"), + Artist(id = 132842, name = "saiogauma"), + Artist(id = 180761, name = "saito"), + Artist(id = 145769, name = "saitom"), + Artist(id = 220555, name = "saitou natsuki"), + Artist(id = 1488, name = "saito yamashiro no kami yukihiko"), + Artist(id = 10016, name = "sajipen"), + Artist(id = 11588, name = "sakagaki"), + Artist(id = 82176, name = "sakagami umi"), + Artist(id = 220724, name = "sakamoto kafka"), + Artist(id = 216078, name = "sakana noko"), + Artist(id = 195371, name = "sake-chan"), + Artist(id = 7605, name = "sakida saki"), + Artist(id = 29070, name = "sakofu"), + Artist(id = 95560, name = "sakujirou"), + Artist(id = 29123, name = "sakuma tsukasa"), + Artist(id = 157302, name = "sakura"), + Artist(id = 186556, name = "sakuraba rokusuke"), + Artist(id = 159608, name = "sakura hanatsumi"), + Artist(id = 1968, name = "sakurai energy"), + Artist(id = 26289, name = "sakurai maki"), + Artist(id = 81066, name = "sakura mafumi"), + Artist(id = 220933, name = "sakura yuu"), + Artist(id = 14042, name = "sakurazari hotori"), + Artist(id = 55992, name = "sameda koban"), + Artist(id = 34228, name = "samemanma"), + Artist(id = 24799, name = "samerupa"), + Artist(id = 8976, name = "samozumo tooru"), + Artist(id = 175889, name = "sanagi torajirou"), + Artist(id = 5693, name = "sanjuurou"), + Artist(id = 191813, name = "sankaku sui"), + Artist(id = 220520, name = "sankurowa"), + Artist(id = 161575, name = "sanom"), + Artist(id = 13994, name = "sanrokumaru"), + Artist(id = 189834, name = "sansyoku nerune"), + Artist(id = 1403, name = "santa"), + Artist(id = 200638, name = "sanuki"), + Artist(id = 151286, name = "saori sato"), + Artist(id = 159020, name = "sarfata"), + Artist(id = 25103, name = "sasachinn"), + Artist(id = 62858, name = "sasahara yuuki"), + Artist(id = 17811, name = "sasahiro"), + Artist(id = 220847, name = "sasai saji"), + Artist(id = 146557, name = "sasamori tomoe"), + Artist(id = 47, name = "sasayuki"), + Artist(id = 180762, name = "sasetsu"), + Artist(id = 174857, name = "sashimi"), + Artist(id = 39235, name = "satetsu"), + Artist(id = 81444, name = "satofuji masato"), + Artist(id = 112673, name = "satotsuki chiyo"), + Artist(id = 216275, name = "satou kuuki"), + Artist(id = 126830, name = "satou mizu"), + Artist(id = 7786, name = "satou souji"), + Artist(id = 155463, name = "satou tomoyuki"), + Artist(id = 207366, name = "satou yuuki"), + Artist(id = 21670, name = "satozaki"), + Artist(id = 8200, name = "satsukiasha"), + Artist(id = 37224, name = "satsuki imonet"), + Artist(id = 2576, name = "satsuki mikazu"), + Artist(id = 15438, name = "satsuki neko"), + Artist(id = 689, name = "savan"), + Artist(id = 187389, name = "sawatashi yun"), + Artist(id = 145001, name = "sayori"), + Artist(id = 220516, name = "schwinn"), + Artist(id = 220583, name = "sei"), + Artist(id = 220913, name = "sekaisaisoku no panda"), + Artist(id = 205451, name = "sekitsui"), + Artist(id = 31371, name = "sekiya asami"), + Artist(id = 190258, name = "semino hazuki"), + Artist(id = 78855, name = "senaka ga shiri"), + Artist(id = 180847, name = "sencha"), + Artist(id = 180848, name = "sencha (煎茶)"), + Artist(id = 10510, name = "sendou hachi"), + Artist(id = 110602, name = "senoo hibiteru"), + Artist(id = 43667, name = "senyuu"), + Artist(id = 25241, name = "serizawa"), + Artist(id = 171975, name = "seto kohei"), + Artist(id = 208250, name = "seto yuki"), + Artist(id = 198205, name = "sgk"), + Artist(id = 148606, name = "shake"), + Artist(id = 220749, name = "shako punch"), + Artist(id = 189034, name = "shamo"), + Artist(id = 220615, name = "shansyoku amido"), + Artist(id = 77897, name = "sharumon"), + Artist(id = 175827, name = "shayo"), + Artist(id = 216044, name = "shiba0"), + Artist(id = 49576, name = "shiba 4-chome"), + Artist(id = 78588, name = "shibaken gorou"), + Artist(id = 23032, name = "shiba nanasei"), + Artist(id = 58809, name = "shibasaki shouji"), + Artist(id = 153763, name = "shibire hitsuji"), + Artist(id = 220379, name = "shida"), + Artist(id = 294, name = "shiden"), + Artist(id = 191945, name = "shien"), + Artist(id = 167315, name = "shigemiya"), + Artist(id = 180815, name = "shigure ui"), + Artist(id = 187722, name = "shikabanekamo"), + Artist(id = 212061, name = "shikakui kuromaru"), + Artist(id = 5137, name = "shika yuno"), + Artist(id = 206986, name = "shikigami kuroko"), + Artist(id = 4284, name = "shikkarimono no takashi-kun"), + Artist(id = 180763, name = "shimahara"), + Artist(id = 147474, name = "shimantogawa"), + Artist(id = 18030, name = "shimazu tekkou"), + Artist(id = 193084, name = "shimen soka"), + Artist(id = 26401, name = "shimetta seiya"), + Artist(id = 220776, name = "shimizu kafka"), + Artist(id = 116925, name = "shimofuri"), + Artist(id = 106610, name = "shimohara"), + Artist(id = 197880, name = "shimon"), + Artist(id = 175870, name = "shimoshi"), + Artist(id = 54094, name = "shimuro"), + Artist(id = 8562, name = "shindo l"), + Artist(id = 53805, name = "shindou"), + Artist(id = 110074, name = "shine nabis"), + Artist(id = 219135, name = "shine nabyss"), + Artist(id = 61687, name = "shingo."), + Artist(id = 6913, name = "shinjiro"), + Artist(id = 38880, name = "shino"), + Artist(id = 34062, name = "shinooka homare"), + Artist(id = 512, name = "shinozuka george"), + Artist(id = 195943, name = "shinozuka yuuji"), + Artist(id = 202239, name = "shinshu takedake"), + Artist(id = 216089, name = "shintaro kago"), + Artist(id = 39827, name = "shinya"), + Artist(id = 161729, name = "shioko amekawa"), + Artist(id = 8847, name = "shiomaneki"), + Artist(id = 85152, name = "shiotsuki love"), + Artist(id = 79917, name = "shiragiku"), + Artist(id = 32443, name = "shirai nsuke"), + Artist(id = 130086, name = "shirai samoedo"), + Artist(id = 139063, name = "shiranai hitoshi"), + Artist(id = 46553, name = "shirasagi rokuwa"), + Artist(id = 192760, name = "shirasu"), + Artist(id = 128833, name = "shiroie mika"), + Artist(id = 184281, name = "shirokitsune"), + Artist(id = 220621, name = "shirokumae"), + Artist(id = 220677, name = "shiromizugi"), + Artist(id = 7192, name = "shirotadai"), + Artist(id = 159577, name = "shirouzu myuuta"), + Artist(id = 160018, name = "shirow"), + Artist(id = 69037, name = "shitara nana"), + Artist(id = 175316, name = "shittori bouzu"), + Artist(id = 154673, name = "shituzhi"), + Artist(id = 11506, name = "shiunsanchou"), + Artist(id = 464, name = "shizyou mako"), + Artist(id = 168777, name = "shobu"), + Artist(id = 218305, name = "shomu"), + Artist(id = 185, name = "shono kotaro"), + Artist(id = 87340, name = "shouna mitsuishi"), + Artist(id = 220849, name = "sho washizuka"), + Artist(id = 38050, name = "shuko"), + Artist(id = 187026, name = "shuru-ban"), + Artist(id = 220706, name = "shuten douji"), + Artist(id = 9412, name = "sian"), + Artist(id = 172069, name = "siberian hahasky"), + Artist(id = 126936, name = "signo mandara"), + Artist(id = 2761, name = "siho"), + Artist(id = 149466, name = "sin"), + Artist(id = 197990, name = "sindoll"), + Artist(id = 195298, name = "siokogashi"), + Artist(id = 30488, name = "siokonbu"), + Artist(id = 47015, name = "sio oninco"), + Artist(id = 58558, name = "soba"), + Artist(id = 82708, name = "soi"), + Artist(id = 148129, name = "soine"), + Artist(id = 1007, name = "sojihogu"), + Artist(id = 211882, name = "sola"), + Artist(id = 3285, name = "solopip b"), + Artist(id = 220642, name = "sonno"), + Artist(id = 165307, name = "son yohsyu"), + Artist(id = 198096, name = "sora hina"), + Artist(id = 100444, name = "sorai shinya"), + Artist(id = 31924, name = "soramame-san"), + Artist(id = 30539, name = "sorani"), + Artist(id = 149677, name = "sorono"), + Artist(id = 155105, name = "souryu"), + Artist(id = 101426, name = "souseki"), + Artist(id = 216037, name = "soushaboku"), + Artist(id = 220600, name = "soy"), + Artist(id = 155842, name = "soyosoyo"), + Artist(id = 193922, name = "spiritus tarou"), + Artist(id = 162969, name = "star☆chaser"), + Artist(id = 175357, name = "starling-chan"), + Artist(id = 25338, name = "stealth kaigyou"), + Artist(id = 9025, name = "strelka"), + Artist(id = 160197, name = "stu-hiro"), + Artist(id = 5240, name = "sturkey"), + Artist(id = 155806, name = "sueyuu"), + Artist(id = 2134, name = "sugaishi"), + Artist(id = 134213, name = "sugara"), + Artist(id = 64971, name = "sugarbt"), + Artist(id = 25796, name = "sugar milk"), + Artist(id = 137786, name = "sugaru shun"), + Artist(id = 67247, name = "sugi g"), + Artist(id = 201531, name = "sugimura sakon"), + Artist(id = 129969, name = "sugimura takeshi"), + Artist(id = 18092, name = "suihei sen"), + Artist(id = 152676, name = "suisui"), + Artist(id = 144775, name = "sukesuke"), + Artist(id = 33522, name = "sukoyaka gyuunyuu"), + Artist(id = 2065, name = "sumiya"), + Artist(id = 28244, name = "sumiyoshi"), + Artist(id = 144497, name = "sunaba"), + Artist(id = 220898, name = "sunagimo dx"), + Artist(id = 85664, name = "super zombie"), + Artist(id = 2905, name = "suruga kuroitsu"), + Artist(id = 26763, name = "survival knife"), + Artist(id = 185704, name = "susukumo nagi"), + Artist(id = 220617, name = "susy"), + Artist(id = 220500, name = "sutadasu"), + Artist(id = 158641, name = "suzui narumi"), + Artist(id = 34298, name = "suzuki akoni"), + Artist(id = 75845, name = "suzuki hinomi"), + Artist(id = 15385, name = "suzuki nago"), + Artist(id = 187536, name = "suzuki toto"), + Artist(id = 220922, name = "suzumiya kazuki"), + Artist(id = 111977, name = "suzunomoku"), + Artist(id = 155494, name = "suzurame"), + Artist(id = 187069, name = "suzushimo"), + Artist(id = 36534, name = "suzushiro nazuna"), + Artist(id = 83374, name = "syamonabe"), + Artist(id = 26004, name = "syou"), + Artist(id = 66454, name = "syoukaki"), + Artist(id = 8896, name = "syowmaru"), + Artist(id = 157547, name = "syukuriin"), + Artist(id = 8240, name = "syuuen"), + Artist(id = 109859, name = "tabbto"), + Artist(id = 162462, name = "tabe koji"), + Artist(id = 5571, name = "tabigarasu"), + Artist(id = 218650, name = "tabuchi"), + Artist(id = 25873, name = "tachibana aruto"), + Artist(id = 61083, name = "tachibana nagon"), + Artist(id = 148908, name = "tachibana omina"), + Artist(id = 26023, name = "tachibana yuu"), + Artist(id = 154554, name = "tachikawa negoro"), + Artist(id = 92847, name = "tachiroku"), + Artist(id = 176792, name = "tadano mezashi"), + Artist(id = 28228, name = "taira issui"), + Artist(id = 124784, name = "taira kosaka"), + Artist(id = 180764, name = "taira tsukune"), + Artist(id = 183704, name = "tai xi studio"), + Artist(id = 66358, name = "tajima"), + Artist(id = 2105, name = "tajima particle"), + Artist(id = 3389, name = "takahashi note"), + Artist(id = 34943, name = "takahashiya takabee"), + Artist(id = 190046, name = "takamaru"), + Artist(id = 220525, name = "takamichi"), + Artist(id = 153812, name = "takamiyahairi"), + Artist(id = 181015, name = "takano saku"), + Artist(id = 7661, name = "takashi"), + Artist(id = 207256, name = "takashi (anigasaru)"), + Artist(id = 220843, name = "takashima shoa"), + Artist(id = 152154, name = "takatsuki shuuya"), + Artist(id = 1974, name = "takaya ki"), + Artist(id = 29917, name = "takeda aranobu"), + Artist(id = 97907, name = "takeda hiromitsu"), + Artist(id = 176671, name = "takemaru takasaki"), + Artist(id = 19716, name = "takemasa takeshi"), + Artist(id = 220584, name = "taketa"), + Artist(id = 82558, name = "taki makura"), + Artist(id = 193499, name = "takoneru"), + Artist(id = 180324, name = "takota konu"), + Artist(id = 97951, name = "takoyaki rock"), + Artist(id = 6557, name = "takoyaki yoshi"), + Artist(id = 150083, name = "takunomi"), + Artist(id = 167117, name = "takurowo"), + Artist(id = 118566, name = "tama-bon"), + Artist(id = 220506, name = "tamai moko"), + Artist(id = 220641, name = "tamaki nao"), + Artist(id = 175328, name = "tamanobu"), + Artist(id = 5806, name = "tamano kedama"), + Artist(id = 4795, name = "tamatsuyada"), + Artist(id = 187819, name = "tamayuki hakka"), + Artist(id = 53911, name = "tamazatou"), + Artist(id = 190363, name = "tamon sakaki"), + Artist(id = 6716, name = "tanabe"), + Artist(id = 220716, name = "tanaka kanata"), + Artist(id = 215986, name = "tanakala"), + Artist(id = 160119, name = "taniguchi daisuke"), + Artist(id = 92412, name = "taniguchi-san"), + Artist(id = 213026, name = "tannu"), + Artist(id = 177722, name = "tansan kitsune"), + Artist(id = 97461, name = "tansuiken"), + Artist(id = 9520, name = "tanuma yuuichirou"), + Artist(id = 159427, name = "taono kinoko"), + Artist(id = 90820, name = "taraku"), + Artist(id = 20719, name = "tarazoo"), + Artist(id = 75906, name = "tarou t"), + Artist(id = 49945, name = "tatapopo"), + Artist(id = 152568, name = "tatsunami youtoku"), + Artist(id = 7777, name = "tatsu tairagi"), + Artist(id = 220694, name = "tatsuwaipu"), + Artist(id = 195854, name = "tawawa delivery"), + Artist(id = 91929, name = "tear"), + Artist(id = 181341, name = "tearontaron"), + Artist(id = 220704, name = "teikanokei"), + Artist(id = 78794, name = "teikuuhikou"), + Artist(id = 157582, name = "tendou itsuki"), + Artist(id = 126401, name = "teritama potekora"), + Artist(id = 220514, name = "terujirou"), + Artist(id = 56306, name = "tes_mel"), + Artist(id = 167221, name = "testter"), + Artist(id = 36273, name = "tetsuusa"), + Artist(id = 25089, name = "tetsuyama kaya"), + Artist(id = 212305, name = "the amanoja9"), + Artist(id = 147042, name = "t-heaven"), + Artist(id = 19144, name = "thomas"), + Artist(id = 220575, name = "tianoblue"), + Artist(id = 183277, name = "tiko"), + Artist(id = 476, name = "tinn hisakawa"), + Artist(id = 71426, name = "tirotata"), + Artist(id = 139596, name = "titiduki"), + Artist(id = 135832, name = "t-man"), + Artist(id = 107110, name = "tobari zaru"), + Artist(id = 8665, name = "todoroki sin"), + Artist(id = 220607, name = "tofu pizzamaru"), + Artist(id = 25605, name = "tohyama eight"), + Artist(id = 7642, name = "tohzai"), + Artist(id = 148053, name = "toilet komoru"), + Artist(id = 144373, name = "toin"), + Artist(id = 161413, name = "toitoi"), + Artist(id = 9776, name = "tokie hirohito"), + Artist(id = 197152, name = "toku"), + Artist(id = 12353, name = "tokupyon"), + Artist(id = 176647, name = "tomihero"), + Artist(id = 18778, name = "tomohiro kai"), + Artist(id = 150328, name = "tomokichi"), + Artist(id = 27161, name = "tomomimi shimon"), + Artist(id = 110560, name = "tomose shunsaku"), + Artist(id = 82841, name = "tonarino esuichi"), + Artist(id = 219959, name = "tonezato honu"), + Artist(id = 158338, name = "tonteki teishoku"), + Artist(id = 220475, name = "toono esuke"), + Artist(id = 102854, name = "torichamaru"), + Artist(id = 203353, name = "torii yoshitsuna"), + Artist(id = 206465, name = "torino karaage"), + Artist(id = 4517, name = "toroshio"), + Artist(id = 88260, name = "torotarou"), + Artist(id = 41784, name = "toruneko"), + Artist(id = 160198, name = "toshinori iinuma"), + Artist(id = 80041, name = "totoyama keiji"), + Artist(id = 85762, name = "tou"), + Artist(id = 98767, name = "toujou tsukushi"), + Artist(id = 31073, name = "touma itsuki"), + Artist(id = 96095, name = "touno itsuki"), + Artist(id = 48214, name = "tousen"), + Artist(id = 123521, name = "toushiki yubune"), + Artist(id = 48332, name = "toyama jigoku"), + Artist(id = 27769, name = "toyo"), + Artist(id = 158321, name = "triangle!"), + Artist(id = 220510, name = "try"), + Artist(id = 35530, name = "tsuchinoshita kaeru"), + Artist(id = 58559, name = "tsuchiyasu"), + Artist(id = 206920, name = "tsuda hitokuchi"), + Artist(id = 705, name = "tsuda nanafushi"), + Artist(id = 12860, name = "tsuge yasuna"), + Artist(id = 65049, name = "tsugumi suzuma"), + Artist(id = 16205, name = "tsukako"), + Artist(id = 86792, name = "tsukimiya tsutome"), + Artist(id = 2175, name = "tsukino jyogi"), + Artist(id = 32177, name = "tsukiriran"), + Artist(id = 14117, name = "tsukitokage"), + Artist(id = 211744, name = "tsukumo go"), + Artist(id = 92060, name = "tsukumo nikyuu"), + Artist(id = 178241, name = "tsukuru"), + Artist(id = 149140, name = "tsumetoro"), + Artist(id = 62222, name = "tsunekira"), + Artist(id = 206339, name = "tsunonigau"), + Artist(id = 74355, name = "tsuriganesou"), + Artist(id = 189350, name = "tsuruga"), + Artist(id = 142827, name = "tsuruomi"), + Artist(id = 121399, name = "tsurusaki takahiro"), + Artist(id = 45664, name = "tsuruta bungaku"), + Artist(id = 62880, name = "tsuruyama mito"), + Artist(id = 101000, name = "tsuttsu"), + Artist(id = 45482, name = "tulip"), + Artist(id = 43004, name = "turnover"), + Artist(id = 67270, name = "type.90"), + Artist(id = 105909, name = "tyranu"), + Artist(id = 180851, name = "u10"), + Artist(id = 176246, name = "ubuo"), + Artist(id = 220746, name = "uchigawa"), + Artist(id = 14009, name = "uchiuchi keyaki"), + Artist(id = 17026, name = "ueda yuh"), + Artist(id = 180852, name = "ueno"), + Artist(id = 120291, name = "uenosuke"), + Artist(id = 14078, name = "ugeppa"), + Artist(id = 220588, name = "ukai yudu"), + Artist(id = 160199, name = "ukanmuri"), + Artist(id = 220587, name = "ukiuki chisato"), + Artist(id = 8510, name = "ulrich"), + Artist(id = 6449, name = "umakuchi shouyu"), + Artist(id = 117468, name = "umeda nautilus"), + Artist(id = 88894, name = "umehisa"), + Artist(id = 92299, name = "umeko"), + Artist(id = 22872, name = "umihotaru harumare"), + Artist(id = 180818, name = "umiko"), + Artist(id = 49955, name = "umi no kyuuban"), + Artist(id = 206943, name = "umino ryo"), + Artist(id = 25718, name = "umiushi"), + Artist(id = 129056, name = "unacchi"), + Artist(id = 147870, name = "unadon"), + Artist(id = 147801, name = "unagimaru"), + Artist(id = 68805, name = "unasaka"), + Artist(id = 182505, name = "unbalance"), + Artist(id = 188685, name = "unohana pochiko"), + Artist(id = 23986, name = "uno ryoku"), + Artist(id = 121102, name = "unosero"), + Artist(id = 5393, name = "unou"), + Artist(id = 132471, name = "untsuku"), + Artist(id = 180766, name = "untue"), + Artist(id = 153, name = "uo denim"), + Artist(id = 25494, name = "uono shinome"), + Artist(id = 27593, name = "uousaoh"), + Artist(id = 91736, name = "upanishimaru"), + Artist(id = 192933, name = "urakuso"), + Artist(id = 107476, name = "uranokyuu"), + Artist(id = 220906, name = "urase shioji"), + Artist(id = 165948, name = "urashima yuuhi"), + Artist(id = 216266, name = "urasuji samurai"), + Artist(id = 11985, name = "uraziro"), + Artist(id = 93875, name = "urec"), + Artist(id = 105017, name = "urupina"), + Artist(id = 18121, name = "uruujima call"), + Artist(id = 78401, name = "usa"), + Artist(id = 220434, name = "usachanget"), + Artist(id = 2016, name = "usagi nagomu"), + Artist(id = 147651, name = "usashiro mani"), + Artist(id = 112981, name = "usashiromani"), + Artist(id = 41859, name = "ushimanu"), + Artist(id = 20049, name = "ushino kandume"), + Artist(id = 166887, name = "ushinomiya"), + Artist(id = 114540, name = "ushio kiyoshi"), + Artist(id = 79082, name = "ushiro muki"), + Artist(id = 182877, name = "ushizawa mikke"), + Artist(id = 113034, name = "uso ashio"), + Artist(id = 220912, name = "us them"), + Artist(id = 31741, name = "usubeni sakurako"), + Artist(id = 139685, name = "usui yui"), + Artist(id = 152959, name = "uten ameka"), + Artist(id = 80405, name = "utsumi bobota"), + Artist(id = 91500, name = "utsunomiya ukatsu"), + Artist(id = 105712, name = "utsusumi kio"), + Artist(id = 220487, name = "utsutenkai"), + Artist(id = 175706, name = "utsutsu*minoru"), + Artist(id = 4967, name = "utu"), + Artist(id = 119699, name = "vanicooo"), + Artist(id = 220902, name = "vanilla cream"), + Artist(id = 168452, name = "volvox"), + Artist(id = 31416, name = "vyo"), + Artist(id = 29432, name = "wabara hiro"), + Artist(id = 191699, name = "wacoco waco"), + Artist(id = 216211, name = "wagashi"), + Artist(id = 48815, name = "waira"), + Artist(id = 179412, name = "wakako"), + Artist(id = 15554, name = "wakame-san"), + Artist(id = 220747, name = "wakura"), + Artist(id = 182489, name = "wamuko"), + Artist(id = 2085, name = "wamusato haru"), + Artist(id = 78499, name = "wanao"), + Artist(id = 47596, name = "wantan meo"), + Artist(id = 137838, name = "warabite"), + Artist(id = 30932, name = "washizuka sho"), + Artist(id = 148619, name = "watanuki ron"), + Artist(id = 31906, name = "waves"), + Artist(id = 6573, name = "wazakita"), + Artist(id = 168405, name = "wes heartland smith"), + Artist(id = 216092, name = "wonawo"), + Artist(id = 10823, name = "woof"), + Artist(id = 4377, name = "woruto"), + Artist(id = 133001, name = "wozu satoru"), + Artist(id = 220158, name = "x36marubox"), + Artist(id = 205667, name = "xiao xiao gyoza"), + Artist(id = 200457, name = "xin"), + Artist(id = 102591, name = "yagicom"), + Artist(id = 155884, name = "yagino mekichi"), + Artist(id = 1145, name = "yahiro pochi"), + Artist(id = 14446, name = "yaki tomato"), + Artist(id = 68858, name = "yakumi benishouga"), + Artist(id = 81985, name = "yakura waka"), + Artist(id = 52932, name = "yamada gogogo"), + Artist(id = 59994, name = "yamada konayuki"), + Artist(id = 55845, name = "yamada kou"), + Artist(id = 1802, name = "yamada no seikatsu ga daiichi"), + Artist(id = 220562, name = "yamada sabun"), + Artist(id = 25182, name = "yamada yuuya"), + Artist(id = 28767, name = "yamahata rian"), + Artist(id = 62452, name = "yamaimo tororo"), + Artist(id = 54772, name = "yamaishi juhachi"), + Artist(id = 109253, name = "yamakonbu"), + Artist(id = 156949, name = "yamakumo"), + Artist(id = 170574, name = "yamamoto fcn"), + Artist(id = 80766, name = "yamamoto tomomitsu"), + Artist(id = 25854, name = "yamamoto zenzen"), + Artist(id = 187221, name = "yamanokami"), + Artist(id = 205903, name = "yamashita kurowo"), + Artist(id = 26835, name = "yamatogawa"), + Artist(id = 198441, name = "yamato hotaru"), + Artist(id = 220550, name = "yameta takashi"), + Artist(id = 148882, name = "yana"), + Artist(id = 144968, name = "yanagi"), + Artist(id = 97713, name = "yanase kotatsu"), + Artist(id = 1703, name = "yanase yanagi"), + Artist(id = 121455, name = "yano mitsuki"), + Artist(id = 219934, name = "yano toshinori"), + Artist(id = 7240, name = "yanyo"), + Artist(id = 97319, name = "yappen"), + Artist(id = 47098, name = "yasu"), + Artist(id = 83235, name = "yasui riosuke"), + Artist(id = 180767, name = "yasuyuki"), + Artist(id = 43224, name = "yatsuki hiyori"), + Artist(id = 6250, name = "yaya hinata"), + Artist(id = 662, name = "yazaki suigin"), + Artist(id = 87867, name = "yd"), + Artist(id = 179148, name = "yk"), + Artist(id = 220741, name = "yochi ryouta"), + Artist(id = 41988, name = "yoikono tt"), + Artist(id = 220499, name = "yoki kana"), + Artist(id = 17656, name = "yokohama inka"), + Artist(id = 149510, name = "yokoshima"), + Artist(id = 9838, name = "yokoshima nikki"), + Artist(id = 180768, name = "yom"), + Artist(id = 119731, name = "yomei 3-shuukan"), + Artist(id = 69281, name = "yonekura kengo"), + Artist(id = 216100, name = "yoriu mushi"), + Artist(id = 4864, name = "yoshida inuhito"), + Artist(id = 132387, name = "yoshida killy"), + Artist(id = 180820, name = "yoshihiro"), + Artist(id = 220736, name = "yoshimizu"), + Artist(id = 192678, name = "yoshimoto"), + Artist(id = 180854, name = "yoshi-o"), + Artist(id = 18318, name = "yoshioka hirosumi"), + Artist(id = 42182, name = "yoshiragi"), + Artist(id = 180821, name = "yoshitomi akihito"), + Artist(id = 156060, name = "yoshiyuki nishi"), + Artist(id = 154246, name = "yoshou"), + Artist(id = 60281, name = "yoshu ohepe"), + Artist(id = 6822, name = "yosiura kazuya"), + Artist(id = 5460, name = "yosuke"), + Artist(id = 145993, name = "yotsuba chica"), + Artist(id = 16024, name = "yozo"), + Artist(id = 71389, name = "ysmmzr"), + Artist(id = 78046, name = "yucchris"), + Artist(id = 12718, name = "yuduki kei"), + Artist(id = 5486, name = "yug"), + Artist(id = 138421, name = "yukako"), + Artist(id = 180154, name = "yukataro"), + Artist(id = 35155, name = "yukian"), + Artist(id = 147745, name = "yuki tomoshi"), + Artist(id = 68892, name = "yukiu con"), + Artist(id = 189152, name = "yumekawa dododo-chan"), + Artist(id = 138809, name = "yumeki banana"), + Artist(id = 7038, name = "yumeno tanuki"), + Artist(id = 25770, name = "yumoteliuce"), + Artist(id = 180855, name = "yu-nagi"), + Artist(id = 8803, name = "yunioshi"), + Artist(id = 220620, name = "yun kinoko"), + Artist(id = 3378, name = "yuran"), + Artist(id = 423, name = "yurikawa"), + Artist(id = 185901, name = "yurishima shiro"), + Artist(id = 117118, name = "yuruchin kyouso"), + Artist(id = 180769, name = "yuu"), + Artist(id = 39317, name = "yuuga"), + Artist(id = 1666, name = "yuugiri"), + Artist(id = 170425, name = "yuuki hb"), + Artist(id = 168512, name = "yuuki ringo"), + Artist(id = 40416, name = "yuuki shin"), + Artist(id = 149447, name = "yuuki tsumugi"), + Artist(id = 64892, name = "yuukiya sai"), + Artist(id = 38496, name = "yuzugin"), + Artist(id = 14810, name = "yuzuha"), + Artist(id = 207414, name = "yuzuki himuka"), + Artist(id = 25969, name = "yuzuki maki"), + Artist(id = 40155, name = "yuzuki n dash"), + Artist(id = 54641, name = "yuzu machi"), + Artist(id = 60458, name = "yuzuno kiichi"), + Artist(id = 188638, name = "yuzu ramune"), + Artist(id = 15876, name = "yuzuriha"), + Artist(id = 111574, name = "yuzuto sen"), + Artist(id = 51488, name = "zacro"), + Artist(id = 72471, name = "zakotsu"), + Artist(id = 636, name = "zanji"), + Artist(id = 63367, name = "zarashi"), + Artist(id = 36636, name = "zasha"), + Artist(id = 211571, name = "zawarc"), + Artist(id = 169875, name = "zettai zetsumei"), + Artist(id = 220610, name = "ziki masaya"), + Artist(id = 207318, name = "ziran"), + Artist(id = 141507, name = "zizio"), + Artist(id = 147063, name = "z-ton"), + Artist(id = 24633, name = "zunta"), + Artist(id = 220521, name = "zutako"), + ) + val circleList = listOf( + Circle(id = 197440, name = "111 touban"), + Circle(id = 167734, name = "140km/h"), + Circle(id = 181093, name = "1582"), + Circle(id = 199033, name = "180r"), + Circle(id = 145332, name = "23.4do"), + Circle(id = 213839, name = "3d live"), + Circle(id = 146028, name = "434 not found"), + Circle(id = 146716, name = "50on!"), + Circle(id = 152366, name = "8cm"), + Circle(id = 211401, name = "aadaba3"), + Circle(id = 147909, name = "abgrund"), + Circle(id = 156852, name = "ageage"), + Circle(id = 173862, name = "aigamodou"), + Circle(id = 166397, name = "akaeboshi"), + Circle(id = 165308, name = "akari blast!"), + Circle(id = 170742, name = "akatsukiya"), + Circle(id = 146277, name = "akausagi"), + Circle(id = 147684, name = "akiba maou"), + Circle(id = 147123, name = "akikaze asparagus"), + Circle(id = 176497, name = "akuochisukii classroom"), + Circle(id = 170648, name = "alexa thunder"), + Circle(id = 152770, name = "alice no takarabako"), + Circle(id = 172861, name = "alicesoft"), + Circle(id = 157038, name = "altayne"), + Circle(id = 154295, name = "amaineiro"), + Circle(id = 212306, name = "a-mania9's"), + Circle(id = 205199, name = "amatousengen"), + Circle(id = 146139, name = "amazake hatosyo-ten"), + Circle(id = 151657, name = "amulai sweets factory"), + Circle(id = 155631, name = "androgynous"), + Circle(id = 149246, name = "aneko no techo"), + Circle(id = 207257, name = "anigasaru"), + Circle(id = 151951, name = "anmitsu yomogitei"), + Circle(id = 211753, name = "anything"), + Circle(id = 147730, name = "aoba q madou"), + Circle(id = 151318, name = "aohimo familia"), + Circle(id = 195214, name = "aoi no ie"), + Circle(id = 148054, name = "aomizuan"), + Circle(id = 150011, name = "aomori ringo"), + Circle(id = 152155, name = "apocolotte"), + Circle(id = 216281, name = "arakureta monotachi"), + Circle(id = 220687, name = "area14"), + Circle(id = 148471, name = "asaki blog branch office"), + Circle(id = 187723, name = "ashi no seikou ha tsumi"), + Circle(id = 220551, name = "ashitakara ganbaru"), + Circle(id = 212722, name = "atarayo"), + Circle(id = 150084, name = "athome shuka"), + Circle(id = 153109, name = "ayakase-ke no neko"), + Circle(id = 171202, name = "babi"), + Circle(id = 166415, name = "binbou yusuri express"), + Circle(id = 197458, name = "bintoro purin"), + Circle(id = 168513, name = "bio champuru"), + Circle(id = 177991, name = "black note"), + Circle(id = 151563, name = "bluekiller"), + Circle(id = 220606, name = "blue planter"), + Circle(id = 172070, name = "boindo"), + Circle(id = 220605, name = "bonnouji"), + Circle(id = 211745, name = "box"), + Circle(id = 162970, name = "burnbright"), + Circle(id = 158829, name = "butagoya"), + Circle(id = 220745, name = "casioputer"), + Circle(id = 202522, name = "catastrophe"), + Circle(id = 149299, name = "celtrance"), + Circle(id = 209385, name = "chilukuni"), + Circle(id = 170229, name = "chimamire yashiki"), + Circle(id = 154976, name = "chinchin tei"), + Circle(id = 212991, name = "chinzuri bop"), + Circle(id = 217557, name = "cior"), + Circle(id = 147043, name = "circle romantic flight"), + Circle(id = 163418, name = "clammbon"), + Circle(id = 172644, name = "cocoa break"), + Circle(id = 154876, name = "consava"), + Circle(id = 170788, name = "contamination"), + Circle(id = 150363, name = "crimson crown"), + Circle(id = 216212, name = "dagashiya"), + Circle(id = 146845, name = "da hootch"), + Circle(id = 153934, name = "dai-6-kichi"), + Circle(id = 152889, name = "dam koubou"), + Circle(id = 220509, name = "danimaru studio"), + Circle(id = 152018, name = "darabuchidou"), + Circle(id = 147871, name = "deastim"), + Circle(id = 155825, name = "dekoboko hurricane"), + Circle(id = 154361, name = "dibi shoten"), + Circle(id = 219033, name = "diletta"), + Circle(id = 158013, name = "d-lovers"), + Circle(id = 157666, name = "dobu no hotori"), + Circle(id = 202688, name = "dochaku so happy!"), + Circle(id = 145830, name = "dodo fuguri"), + Circle(id = 162873, name = "doll play"), + Circle(id = 146303, name = "doronuma kyoudai"), + Circle(id = 161845, name = "doza village"), + Circle(id = 147697, name = "dr. vermilion"), + Circle(id = 192934, name = "dryr"), + Circle(id = 152915, name = "dso"), + Circle(id = 220845, name = "energia"), + Circle(id = 157122, name = "enokoro kurage"), + Circle(id = 220688, name = "e roman koubou"), + Circle(id = 197034, name = "eroquis"), + Circle(id = 10824, name = "fancy feeling"), + Circle(id = 146201, name = "fatalpulse"), + Circle(id = 155541, name = "frankenstein"), + Circle(id = 211572, name = "fuerzabruta"), + Circle(id = 211480, name = "fuhai nabe"), + Circle(id = 152065, name = "fujiya"), + Circle(id = 167644, name = "fuka fuka"), + Circle(id = 205726, name = "futanari★…ochinchinland"), + Circle(id = 163020, name = "futanari★ochinchinland"), + Circle(id = 161676, name = "fuzui undou"), + Circle(id = 216255, name = "fz colon"), + Circle(id = 162244, name = "gamenhaji"), + Circle(id = 160099, name = "garakuta shoujo"), + Circle(id = 212087, name = "gekiyaku rabbits"), + Circle(id = 179149, name = "gj-x"), + Circle(id = 219651, name = "golden bazooka"), + Circle(id = 194287, name = "g-planet"), + Circle(id = 147978, name = "g-power!"), + Circle(id = 155442, name = "great canyon"), + Circle(id = 156298, name = "gunjou robot"), + Circle(id = 153346, name = "haiba-nation"), + Circle(id = 152677, name = "hakkindo"), + Circle(id = 198442, name = "hanasakura"), + Circle(id = 155985, name = "hannama"), + Circle(id = 157176, name = "harapeko teishoku"), + Circle(id = 216058, name = "haruiro club"), + Circle(id = 216053, name = "hawkbit"), + Circle(id = 165512, name = "h.b.a."), + Circle(id = 198206, name = "hebitunagary"), + Circle(id = 220636, name = "hentai our own way"), + Circle(id = 156045, name = "hibon"), + Circle(id = 150671, name = "himeya"), + Circle(id = 207415, name = "himuganeya"), + Circle(id = 162526, name = "himyea"), + Circle(id = 159850, name = "hi per pinch"), + Circle(id = 216210, name = "hobukuro!"), + Circle(id = 178817, name = "hohoihoi"), + Circle(id = 216055, name = "hokkee"), + Circle(id = 201125, name = "homare works"), + Circle(id = 192451, name = "horieros' homestead"), + Circle(id = 220633, name = "hoshimaki project"), + Circle(id = 164062, name = "icchibocchi"), + Circle(id = 150299, name = "ichibocchi"), + Circle(id = 156915, name = "inbou no teikoku"), + Circle(id = 157397, name = "initiative"), + Circle(id = 220104, name = "inoha"), + Circle(id = 155843, name = "irodori"), + Circle(id = 220008, name = "isocurve"), + Circle(id = 182396, name = "iwashita shoten"), + Circle(id = 148670, name = "izanagi"), + Circle(id = 155060, name = "j9 opera company"), + Circle(id = 167857, name = "jikahatsudensho"), + Circle(id = 220517, name = "jitensha sougyou"), + Circle(id = 220518, name = "k2company"), + Circle(id = 147802, name = "kabayakiya"), + Circle(id = 216051, name = "kaeru wa nani yatte mo erai!!"), + Circle(id = 220705, name = "kaientai"), + Circle(id = 165906, name = "kaikandrug"), + Circle(id = 158642, name = "kaiyuu kikaku"), + Circle(id = 156444, name = "kakitsubata no yashiro"), + Circle(id = 163981, name = "kakitsubata yashiro"), + Circle(id = 157359, name = "kakuzato-ichi"), + Circle(id = 173674, name = "kamaboko koubou"), + Circle(id = 202881, name = "kamico!"), + Circle(id = 157909, name = "kamikadou"), + Circle(id = 150544, name = "kaminendo.corp"), + Circle(id = 158113, name = "kansai orange"), + Circle(id = 176432, name = "karajishi botan"), + Circle(id = 153423, name = "karomix"), + Circle(id = 174290, name = "karuwani"), + Circle(id = 167316, name = "kasoku edge"), + Circle(id = 170665, name = "kawazoko"), + Circle(id = 162783, name = "kazama dojo"), + Circle(id = 178213, name = "kiba wo muku"), + Circle(id = 154928, name = "kinokko"), + Circle(id = 159428, name = "kinoko931"), + Circle(id = 173369, name = "kisei toukyoku"), + Circle(id = 216099, name = "ki-software"), + Circle(id = 220480, name = "kitazawa sangyo"), + Circle(id = 154555, name = "kitsune"), + Circle(id = 172727, name = "kitsune bousouzoku"), + Circle(id = 155648, name = "kitsuneya"), + Circle(id = 164180, name = "kleitos"), + Circle(id = 155384, name = "knuckle head"), + Circle(id = 182293, name = "kokusai hihoukan"), + Circle(id = 164828, name = "kotoyoshi wired"), + Circle(id = 156126, name = "kousai comics"), + Circle(id = 220877, name = "kurogoma seizou koujou"), + Circle(id = 206987, name = "kurokoya"), + Circle(id = 157889, name = "kurokudoya"), + Circle(id = 159609, name = "kuusou riot!"), + Circle(id = 149061, name = "kyockchokyock"), + Circle(id = 148845, name = "labomagi"), + Circle(id = 167095, name = "laminaria"), + Circle(id = 152819, name = "l.g.c."), + Circle(id = 167488, name = "linda project"), + Circle(id = 147945, name = "loflat"), + Circle(id = 157532, name = "loose's doujin lab"), + Circle(id = 153746, name = "ltd."), + Circle(id = 216206, name = "machi no onikuya-san"), + Circle(id = 156163, name = "maltese"), + Circle(id = 149695, name = "manguri cannon"), + Circle(id = 194719, name = "marimo ya"), + Circle(id = 212062, name = "marushiro shikaku"), + Circle(id = 216060, name = "maruta production"), + Circle(id = 215296, name = "marutendon"), + Circle(id = 151707, name = "masochist high"), + Circle(id = 203503, name = "max gorigori"), + Circle(id = 9330, name = "mc"), + Circle(id = 148772, name = "meat field"), + Circle(id = 202730, name = "meat hammer"), + Circle(id = 153764, name = "media"), + Circle(id = 179259, name = "meimeiko"), + Circle(id = 146696, name = "meme-ya"), + Circle(id = 216086, name = "mentaiko"), + Circle(id = 211384, name = "merrow"), + Circle(id = 149141, name = "metronauts"), + Circle(id = 147574, name = "moco chouchou"), + Circle(id = 220502, name = "mokko ritch vanilla aji"), + Circle(id = 212324, name = "monji koubou"), + Circle(id = 211951, name = "moo"), + Circle(id = 172435, name = "moon light kitten"), + Circle(id = 160628, name = "moon night kitten"), + Circle(id = 178595, name = "moon ruler"), + Circle(id = 157319, name = "mosquito on"), + Circle(id = 160712, name = "motley crew"), + Circle(id = 168406, name = "move from one place to heaven"), + Circle(id = 176754, name = "mr. hokke"), + Circle(id = 148730, name = "muchakai"), + Circle(id = 177690, name = "muchi panya"), + Circle(id = 151456, name = "mukousharan"), + Circle(id = 159578, name = "mutant"), + Circle(id = 145878, name = "naitou2"), + Circle(id = 156061, name = "naivta"), + Circle(id = 154893, name = "namanamago"), + Circle(id = 149342, name = "nanakorobi yaoki"), + Circle(id = 146558, name = "nanimoshinai"), + Circle(id = 165019, name = "nazunasoft"), + Circle(id = 12719, name = "ncp"), + Circle(id = 157154, name = "nedaore"), + Circle(id = 147285, name = "negapoji~bu"), + Circle(id = 148883, name = "nekoarashi"), + Circle(id = 162940, name = "neko very cute"), + Circle(id = 154675, name = "neyagurui"), + Circle(id = 220508, name = "nhooooooooooooooo"), + Circle(id = 147667, name = "nita ken"), + Circle(id = 151133, name = "norakurari"), + Circle(id = 155608, name = "norigozen"), + Circle(id = 161131, name = "nosebleed"), + Circle(id = 17994, name = "no such agency"), + Circle(id = 149481, name = "nul_neverland"), + Circle(id = 156544, name = "nyasuverse"), + Circle(id = 216084, name = "ocha ocha honpo"), + Circle(id = 218651, name = "ogon shinshi club"), + Circle(id = 148893, name = "once only"), + Circle(id = 195832, name = "o.p/com"), + Circle(id = 159641, name = "oshiruko kan"), + Circle(id = 150106, name = "ossan sindoi"), + Circle(id = 155407, name = "otogi no kuni no soapland"), + Circle(id = 157924, name = "otoko-jyuku.com"), + Circle(id = 6730, name = "oto-love"), + Circle(id = 220616, name = "otome kibun"), + Circle(id = 155885, name = "otona teikoku"), + Circle(id = 211550, name = "otousan no kurorekishi"), + Circle(id = 174620, name = "parapluie"), + Circle(id = 159481, name = "peachpulsar"), + Circle(id = 220618, name = "peropero shuppan"), + Circle(id = 202461, name = "piro-piro-go"), + Circle(id = 164728, name = "piropiro-go"), + Circle(id = 148744, name = "piruporo"), + Circle(id = 195541, name = "p-kan"), + Circle(id = 160313, name = "pochi-goya"), + Circle(id = 175643, name = "poki no ie"), + Circle(id = 165312, name = "polinky place"), + Circle(id = 167886, name = "puchimaple"), + Circle(id = 166477, name = "push mine"), + Circle(id = 166713, name = "puu no puupuupuu"), + Circle(id = 161304, name = "px-real"), + Circle(id = 17277, name = "rakugaikidou"), + Circle(id = 156197, name = "red fox"), + Circle(id = 157042, name = "red paprika"), + Circle(id = 152569, name = "re-fire"), + Circle(id = 207520, name = "reigasou"), + Circle(id = 220713, name = "retro"), + Circle(id = 203845, name = "rifuroom"), + Circle(id = 175828, name = "riku no kotoutei"), + Circle(id = 220380, name = "ringo"), + Circle(id = 216227, name = "ringo no naru ki"), + Circle(id = 155495, name = "rock steady"), + Circle(id = 147475, name = "rorinoutage"), + Circle(id = 194928, name = "rotoest"), + Circle(id = 216101, name = "rpg company 2"), + Circle(id = 152107, name = "rubi-sama wo agameru kai"), + Circle(id = 211670, name = "rycanthropy"), + Circle(id = 215587, name = "sakuranbo nouen"), + Circle(id = 157303, name = "sakuranbu"), + Circle(id = 216056, name = "sakura no kinoshita"), + Circle(id = 162926, name = "sangeriya"), + Circle(id = 192424, name = "sanman sanzen koi king"), + Circle(id = 155464, name = "santonana"), + Circle(id = 159021, name = "sarfatation"), + Circle(id = 179803, name = "sashimi teishoku"), + Circle(id = 213577, name = "sayoshigure"), + Circle(id = 211330, name = "seikatsu sesshishou"), + Circle(id = 178242, name = "seki sabato"), + Circle(id = 177453, name = "setsunasa midare"), + Circle(id = 153414, name = "seventh zest"), + Circle(id = 148607, name = "shakestyle"), + Circle(id = 148304, name = "sheepfold"), + Circle(id = 147746, name = "shiawase kanmiryou"), + Circle(id = 148909, name = "shima-pan"), + Circle(id = 153622, name = "shimoyakedou"), + Circle(id = 168778, name = "shinsekai set"), + Circle(id = 177219, name = "shinshunshantonshou"), + Circle(id = 153747, name = "shobunkan co."), + Circle(id = 159352, name = "shouchuu mac"), + Circle(id = 147108, name = "shouwa saishuu sensen"), + Circle(id = 157652, name = "shuusei patch 3gb"), + Circle(id = 219621, name = "sinistra"), + Circle(id = 149467, name = "sin-maniax"), + Circle(id = 162176, name = "slime crown"), + Circle(id = 163753, name = "snowrich"), + Circle(id = 163459, name = "soft thigh"), + Circle(id = 219852, name = "solace thalassa"), + Circle(id = 180155, name = "sonota oozei"), + Circle(id = 188639, name = "soramune"), + Circle(id = 149678, name = "soronosanchi"), + Circle(id = 149392, name = "sound sticker"), + Circle(id = 216243, name = "squeeze candy heaven"), + Circle(id = 153783, name = "standard"), + Circle(id = 184926, name = "story circle"), + Circle(id = 149325, name = "studio diamond"), + Circle(id = 155106, name = "studio the devil"), + Circle(id = 165949, name = "subliminal dai-kaiten"), + Circle(id = 211840, name = ".suco"), + Circle(id = 155285, name = "sugar*berry*syrup"), + Circle(id = 212151, name = "suitakobara ni choudo ii"), + Circle(id = 220609, name = "sukinaco"), + Circle(id = 216265, name = "sukoburuyama"), + Circle(id = 160120, name = "surumenium"), + Circle(id = 216260, name = "sushi-ya"), + Circle(id = 172645, name = "sweet pea"), + Circle(id = 165595, name = "taiyaki pan"), + Circle(id = 202240, name = "takedake"), + Circle(id = 167118, name = "takurowo dou"), + Circle(id = 194380, name = "tamago kitchen"), + Circle(id = 160019, name = "tamago no kara"), + Circle(id = 175329, name = "tamaland"), + Circle(id = 213027, name = "tantan"), + Circle(id = 153454, name = "tanukine"), + Circle(id = 160959, name = "team harenchi"), + Circle(id = 219931, name = "teenage fanclub"), + Circle(id = 170575, name = "tempest"), + Circle(id = 157583, name = "tendoushi"), + Circle(id = 155807, name = "tengohambre"), + Circle(id = 220585, name = "tentou mushi no sanba"), + Circle(id = 220515, name = "terujirou shirushi no kibi dango"), + Circle(id = 170530, name = "three m"), + Circle(id = 161414, name = "toitoikai"), + Circle(id = 165935, name = "tokaeshina koubou"), + Circle(id = 220611, name = "tokinao"), + Circle(id = 178996, name = "toko-ya"), + Circle(id = 198399, name = "tokyo maid dead ball"), + Circle(id = 158339, name = "tonteki"), + Circle(id = 165999, name = "torotoro yume banana"), + Circle(id = 177818, name = "toushitsu catapult"), + Circle(id = 178834, name = "tozan:bu"), + Circle(id = 147652, name = "triangle!"), + Circle(id = 158322, name = "tridentworks inc."), + Circle(id = 8432, name = "tsf no f"), + Circle(id = 155594, name = "ttsy"), + Circle(id = 161559, name = "tunnel no.73"), + Circle(id = 178665, name = "ubuoya"), + Circle(id = 149105, name = "ue ni aru mikan"), + Circle(id = 154247, name = "uniyaa"), + Circle(id = 216267, name = "urasujibeya"), + Circle(id = 216246, name = "usacastle"), + Circle(id = 201086, name = "ushiro no shimamura"), + Circle(id = 213461, name = "ushiro no shimura"), + Circle(id = 157449, name = "usotsukiya"), + Circle(id = 152960, name = "uten+"), + Circle(id = 175707, name = "utsutsutsutsu"), + Circle(id = 214462, name = "violet bee"), + Circle(id = 164619, name = "violetstar"), + Circle(id = 216276, name = "vpans extasy"), + Circle(id = 157002, name = "wakuseiburo"), + Circle(id = 207463, name = "wamusho"), + Circle(id = 220848, name = "watakubi"), + Circle(id = 148620, name = "watanuki shinguten"), + Circle(id = 188284, name = "waterfall"), + Circle(id = 163146, name = "wwwave"), + Circle(id = 162854, name = "x∞model"), + Circle(id = 149945, name = "yabitsu touge"), + Circle(id = 154521, name = "yadokagaeru"), + Circle(id = 220890, name = "yajirushikey"), + Circle(id = 211365, name = "yamamori cabbage"), + Circle(id = 155281, name = "yamanashi musume"), + Circle(id = 149158, name = "yamoseven"), + Circle(id = 150533, name = "yanyanyo"), + Circle(id = 159624, name = "yatomomin"), + Circle(id = 152417, name = "yogurt"), + Circle(id = 150329, name = "yudokuya"), + Circle(id = 220914, name = "yugen-no-suda"), + Circle(id = 207367, name = "yuuki kagou butsu"), + Circle(id = 147229, name = "yuusaritsukata"), + Circle(id = 147462, name = "yuzuya"), + Circle(id = 220464, name = "zenjidou shimoneta seizou machine"), + Circle(id = 169876, name = "zettai zetsumei's hut"), + ) + val parodyList = listOf( + Parody(id = 17995, name = "a kiss for the petals"), + Parody(id = 146278, name = "amagi brilliant park"), + Parody(id = 146140, name = "ane doki"), + Parody(id = 147286, name = "angel blade"), + Parody(id = 149728, name = "azur lane"), + Parody(id = 150107, name = "black lagoon"), + Parody(id = 186645, name = "blue archive"), + Parody(id = 148411, name = "cardfight!! vanguard"), + Parody(id = 145831, name = "dagashi kashi"), + Parody(id = 178350, name = "danganronpa"), + Parody(id = 146846, name = "dark souls"), + Parody(id = 148894, name = "darling in the franxx"), + Parody(id = 148472, name = "delicious in dungeon"), + Parody(id = 174171, name = "devil may cry"), + Parody(id = 170684, name = "devil survivor 2"), + Parody(id = 103850, name = "doki doki literature club!"), + Parody(id = 62223, name = "doraemon"), + Parody(id = 151393, name = "dragon ball"), + Parody(id = 149868, name = "dragon quest"), + Parody(id = 158069, name = "dragon's crown"), + Parody(id = 155679, name = "eromanga sensei"), + Parody(id = 148436, name = "fantasy earth zero"), + Parody(id = 147463, name = "fate series"), + Parody(id = 160175, name = "final fantasy"), + Parody(id = 198207, name = "final fantasy vii"), + Parody(id = 149206, name = "fire emblem fates"), + Parody(id = 166568, name = "fire emblem: three houses"), + Parody(id = 146153, name = "food wars! shokugeki no soma"), + Parody(id = 206200, name = "full color version"), + Parody(id = 4677, name = "gate"), + Parody(id = 162971, name = "genshin impact"), + Parody(id = 150012, name = "gintama"), + Parody(id = 147762, name = "girls und panzer"), + Parody(id = 147044, name = "god eater 2"), + Parody(id = 147404, name = "go! princess precure"), + Parody(id = 146202, name = "granblue fantasy"), + Parody(id = 151081, name = "gundam build fighters"), + Parody(id = 151082, name = "gundam iron-blooded orphans"), + Parody(id = 164163, name = "gundam zz"), + Parody(id = 195724, name = "haganai"), + Parody(id = 47247, name = "haramase! honoo no oppai isekai ero mahou gakuen!"), + Parody(id = 161677, name = "hololive"), + Parody(id = 146614, name = "hundred"), + Parody(id = 148305, name = "hyperdimension neptunia"), + Parody(id = 146443, name = "is it wrong to try to pick up girls in a dungeon?"), + Parody(id = 152788, name = "kagai jugyou"), + Parody(id = 146118, name = "kantai collection"), + Parody(id = 150705, name = "kid icarus"), + Parody(id = 76765, name = "king of fighters"), + Parody(id = 167222, name = "komi can't communicate"), + Parody(id = 148688, name = "konosuba: god's blessing on this wonderful world!"), + Parody(id = 195725, name = "lagrange: the flower of rin-ne"), + Parody(id = 146517, name = "last period"), + Parody(id = 197991, name = "legend of mana"), + Parody(id = 149300, name = "love live"), + Parody(id = 219009, name = "love plus"), + Parody(id = 157290, name = "manage! kimemasu!!"), + Parody(id = 9186, name = "metroid"), + Parody(id = 147979, name = "millennium war aigis"), + Parody(id = 147861, name = "minecraft"), + Parody(id = 148671, name = "muv-luv"), + Parody(id = 156632, name = "my hero academia"), + Parody(id = 164181, name = "myriad colors phantom world"), + Parody(id = 156585, name = "nier: automata"), + Parody(id = 216002, name = "original"), + Parody(id = 148955, name = "persona 5"), + Parody(id = 146754, name = "precure"), + Parody(id = 176498, name = "pretty cure"), + Parody(id = 211867, name = "psychopath and the killer"), + Parody(id = 149277, name = "pubg"), + Parody(id = 156558, name = "puella magi madoka magica"), + Parody(id = 147827, name = "puyo puyo"), + Parody(id = 146086, name = "puzzle \u0026 dragons"), + Parody(id = 159919, name = "re:zero -starting life in another world-"), + Parody(id = 196202, name = "robot girls z"), + Parody(id = 27000, name = "rwby"), + Parody(id = 147165, name = "saki achiga-hen"), + Parody(id = 147668, name = "schoolgirl strikers"), + Parody(id = 134873, name = "scooby-doo"), + Parody(id = 197992, name = "star fox"), + Parody(id = 170666, name = "star fox series"), + Parody(id = 76766, name = "street fighter"), + Parody(id = 156600, name = "super mario odyssey"), + Parody(id = 146921, name = "sword art online"), + Parody(id = 160147, name = "taimanin yukikaze"), + Parody(id = 198129, name = "tekken"), + Parody(id = 153501, name = "tera"), + Parody(id = 10406, name = "the human reignition project"), + Parody(id = 162245, name = "the idolm@ster"), + Parody(id = 146903, name = "the idolm@ster cinderella girls"), + Parody(id = 147522, name = "the irregular at magic high school"), + Parody(id = 162514, name = "the quintessential quintuplets"), + Parody(id = 152591, name = "the ryuo's work is never done!"), + Parody(id = 146424, name = "toaru majutsu no index"), + Parody(id = 146632, name = "to love-ru"), + Parody(id = 147124, name = "touhou"), + Parody(id = 147803, name = "utawarerumono"), + Parody(id = 152019, name = "valkyria chronicles"), + Parody(id = 161546, name = "vocaloid"), + Parody(id = 147698, name = "voiceroid"), + Parody(id = 195728, name = "waiting in the summer"), + Parody(id = 4597, name = "watamote"), + Parody(id = 151027, name = "yotsuba\u0026!"), + Parody(id = 11777, name = "zelda"), + ) + val maleList = listOf( + Male(id = 216153, name = "ahegao ♂"), + Male(id = 216268, name = "armpit licking ♂"), + Male(id = 216283, name = "bald ♂"), + Male(id = 216277, name = "bbm ♂"), + Male(id = 216162, name = "beauty mark ♂"), + Male(id = 216160, name = "big areolae ♂"), + Male(id = 216170, name = "big breasts ♂"), + Male(id = 216114, name = "big penis ♂"), + Male(id = 216175, name = "blowjob ♂"), + Male(id = 216176, name = "booty ♂"), + Male(id = 216168, name = "bunny girl ♂"), + Male(id = 216166, name = "business suit ♂"), + Male(id = 216163, name = "busty ♂"), + Male(id = 216123, name = "cheating ♂"), + Male(id = 216213, name = "clone ♂"), + Male(id = 73, name = "condom ♂"), + Male(id = 216550, name = "crossdressing ♂"), + Male(id = 216383, name = "dark skin ♂"), + Male(id = 216757, name = "demon ♂"), + Male(id = 216228, name = "dilf ♂"), + Male(id = 216278, name = "facial hair ♂"), + Male(id = 216169, name = "females only ♂"), + Male(id = 216164, name = "femdom ♂"), + Male(id = 216165, name = "futanari ♂"), + Male(id = 216689, name = "gender change ♂"), + Male(id = 216229, name = "glasses ♂"), + Male(id = 216167, name = "gyaru ♂"), + Male(id = 216156, name = "handjob ♂"), + Male(id = 216289, name = "harem ♂"), + Male(id = 216178, name = "heart pupils ♂"), + Male(id = 216177, name = "lactation ♂"), + Male(id = 216161, name = "lingerie ♂"), + Male(id = 216237, name = "low shotacon ♂"), + Male(id = 216173, name = "magical girl ♂"), + Male(id = 217540, name = "maid ♂"), + Male(id = 178247, name = "males only ♂"), + Male(id = 216269, name = "masturbation ♂"), + Male(id = 216409, name = "monster ♂"), + Male(id = 216132, name = "muscles ♂"), + Male(id = 216154, name = "nakadashi ♂"), + Male(id = 216284, name = "old man ♂"), + Male(id = 218169, name = "orc ♂"), + Male(id = 216171, name = "paizuri ♂"), + Male(id = 216172, name = "petite ♂"), + Male(id = 216157, name = "ponytail ♂"), + Male(id = 216159, name = "pubic hair ♂"), + Male(id = 216335, name = "rape ♂"), + Male(id = 183321, name = "schoolboy uniform ♂"), + Male(id = 216155, name = "schoolgirl uniform ♂"), + Male(id = 446, name = "shotacon ♂"), + Male(id = 216498, name = "smegma ♂"), + Male(id = 215991, name = "sole male ♂"), + Male(id = 217346, name = "stockings ♂"), + Male(id = 216279, name = "sunglasses ♂"), + Male(id = 216270, name = "sweating ♂"), + Male(id = 216126, name = "teacher ♂"), + Male(id = 986, name = "tomgirl ♂"), + Male(id = 493, name = "ugly bastard ♂"), + Male(id = 216238, name = "virginity ♂"), + Male(id = 216271, name = "voyeurism ♂"), + Male(id = 216174, name = "x-ray ♂"), + Male(id = 6735, name = "yaoi ♂"), + ) + val femaleList = listOf( + Female(id = 35, name = "ahegao ♀"), + Female(id = 216014, name = "anal ♀"), + Female(id = 216015, name = "anal intercourse ♀"), + Female(id = 216120, name = "apron ♀"), + Female(id = 216146, name = "armpit fetish ♀"), + Female(id = 216353, name = "armpit licking ♀"), + Female(id = 216133, name = "armpit sex ♀"), + Female(id = 216389, name = "assjob ♀"), + Female(id = 216252, name = "ball sucking ♀"), + Female(id = 216381, name = "bbw ♀"), + Female(id = 216230, name = "bdsm ♀"), + Female(id = 24, name = "beauty mark ♀"), + Female(id = 218433, name = "big ♀"), + Female(id = 187532, name = "big areolae ♀"), + Female(id = 216272, name = "big ass ♀"), + Female(id = 378, name = "big breasts ♀"), + Female(id = 216200, name = "big penis ♀"), + Female(id = 216214, name = "bike shorts ♀"), + Female(id = 215992, name = "bikini ♀"), + Female(id = 216280, name = "blackmail ♀"), + Female(id = 216122, name = "blindfold ♀"), + Female(id = 216314, name = "bloomers ♀"), + Female(id = 16, name = "blowjob ♀"), + Female(id = 216215, name = "blowjob face ♀"), + Female(id = 216191, name = "bondage ♀"), + Female(id = 97, name = "booty ♀"), + Female(id = 216530, name = "breast expansion ♀"), + Female(id = 216139, name = "bukkake ♀"), + Female(id = 216202, name = "bun hair ♀"), + Female(id = 1419, name = "bunny girl ♀"), + Female(id = 392, name = "business suit ♀"), + Female(id = 32, name = "busty ♀"), + Female(id = 6, name = "catgirl ♀"), + Female(id = 216115, name = "cheating ♀"), + Female(id = 216143, name = "chubby ♀"), + Female(id = 216231, name = "clit stimulation ♀"), + Female(id = 217748, name = "closed eyes ♀"), + Female(id = 216017, name = "collar ♀"), + Female(id = 216216, name = "corruption ♀"), + Female(id = 216140, name = "cosplay ♀"), + Female(id = 216102, name = "cousin ♀"), + Female(id = 216217, name = "crotch tattoo ♀"), + Female(id = 218155, name = "cumflation ♀"), + Female(id = 458, name = "cunnilingus ♀"), + Female(id = 216116, name = "curly hair ♀"), + Female(id = 216121, name = "dark skin ♀"), + Female(id = 216192, name = "deepthroat ♀"), + Female(id = 216239, name = "defloration ♀"), + Female(id = 216233, name = "demon girl ♀"), + Female(id = 218113, name = "domination loss ♀"), + Female(id = 216141, name = "double penetration ♀"), + Female(id = 216285, name = "drunk ♀"), + Female(id = 216201, name = "elf ♀"), + Female(id = 216117, name = "exhibitionism ♀"), + Female(id = 216247, name = "exposed clothing ♀"), + Female(id = 216235, name = "eye-covering bang ♀"), + Female(id = 216134, name = "facesitting ♀"), + Female(id = 216111, name = "fangs ♀"), + Female(id = 137513, name = "females only ♀"), + Female(id = 138, name = "femdom ♀"), + Female(id = 216282, name = "filming ♀"), + Female(id = 216144, name = "fingering ♀"), + Female(id = 216142, name = "fishnets ♀"), + Female(id = 216218, name = "focus blowjob ♀"), + Female(id = 216188, name = "footjob ♀"), + Female(id = 188423, name = "fox girl ♀"), + Female(id = 216888, name = "fundoshi ♀"), + Female(id = 4884, name = "futanari ♀"), + Female(id = 216643, name = "gag ♀"), + Female(id = 216261, name = "garter belt ♀"), + Female(id = 216136, name = "glasses ♀"), + Female(id = 216262, name = "glory hole ♀"), + Female(id = 216019, name = "gloves ♀"), + Female(id = 216219, name = "gokkun ♀"), + Female(id = 72, name = "gyaru ♀"), + Female(id = 216236, name = "hairy ♀"), + Female(id = 22, name = "handjob ♀"), + Female(id = 1886, name = "harem ♀"), + Female(id = 167, name = "heart pupils ♀"), + Female(id = 216273, name = "hidden sex ♀"), + Female(id = 216193, name = "high heels ♀"), + Female(id = 216349, name = "huge breasts ♀"), + Female(id = 133, name = "impregnation ♀"), + Female(id = 216370, name = "inflation ♀"), + Female(id = 2460, name = "inverted nipples ♀"), + Female(id = 216020, name = "kemonomimi ♀"), + Female(id = 216124, name = "kimono ♀"), + Female(id = 216004, name = "kissing ♀"), + Female(id = 216342, name = "kunoichi ♀"), + Female(id = 216773, name = "lab coat ♀"), + Female(id = 561, name = "lactation ♀"), + Female(id = 216194, name = "latex ♀"), + Female(id = 216232, name = "leash ♀"), + Female(id = 216046, name = "leg lock ♀"), + Female(id = 216220, name = "leotard ♀"), + Female(id = 216118, name = "light hair ♀"), + Female(id = 233, name = "lingerie ♀"), + Female(id = 219, name = "lolicon ♀"), + Female(id = 216263, name = "long tongue ♀"), + Female(id = 216240, name = "low lolicon ♀"), + Female(id = 217534, name = "machine ♀"), + Female(id = 24138, name = "magical girl ♀"), + Female(id = 216005, name = "maid ♀"), + Female(id = 216119, name = "masturbation ♀"), + Female(id = 42, name = "mating press ♀"), + Female(id = 216221, name = "mesugaki ♀"), + Female(id = 448, name = "miko ♀"), + Female(id = 17, name = "milf ♀"), + Female(id = 218428, name = "mind ♀"), + Female(id = 216286, name = "mind break ♀"), + Female(id = 216222, name = "mind control ♀"), + Female(id = 954, name = "monster girl ♀"), + Female(id = 216223, name = "moral degeneration ♀"), + Female(id = 216428, name = "mother ♀"), + Female(id = 216224, name = "mouth mask ♀"), + Female(id = 216149, name = "muscles ♀"), + Female(id = 7, name = "nakadashi ♀"), + Female(id = 216148, name = "netorare ♀"), + Female(id = 217895, name = "nipple fuck ♀"), + Female(id = 216195, name = "nipple piercing ♀"), + Female(id = 216256, name = "nipple stimulation ♀"), + Female(id = 2365, name = "nun ♀"), + Female(id = 216339, name = "nurse ♀"), + Female(id = 40, name = "ojousama ♀"), + Female(id = 171103, name = "oneesan ♀"), + Female(id = 216245, name = "oppai loli ♀"), + Female(id = 216112, name = "orgasm denial ♀"), + Female(id = 216150, name = "over-eye bangs ♀"), + Female(id = 155, name = "paizuri ♀"), + Female(id = 216257, name = "pantyhose ♀"), + Female(id = 216532, name = "pasties ♀"), + Female(id = 218431, name = "penis enlargement ♀"), + Female(id = 141, name = "petite ♀"), + Female(id = 216362, name = "petplay ♀"), + Female(id = 216287, name = "phone sex ♀"), + Female(id = 216196, name = "piercing ♀"), + Female(id = 216602, name = "piss drinking ♀"), + Female(id = 216258, name = "pixie cut ♀"), + Female(id = 182, name = "ponytail ♀"), + Female(id = 1694, name = "pregnant ♀"), + Female(id = 216225, name = "prostitution ♀"), + Female(id = 71, name = "pubic hair ♀"), + Female(id = 216253, name = "rape ♀"), + Female(id = 218434, name = "schoolgirl ♀"), + Female(id = 34, name = "schoolgirl uniform ♀"), + Female(id = 216127, name = "sex toys ♀"), + Female(id = 216502, name = "shibari ♀"), + Female(id = 216248, name = "shimaidon ♀"), + Female(id = 216129, name = "short hair ♀"), + Female(id = 1286, name = "shortstack ♀"), + Female(id = 216244, name = "sister ♀"), + Female(id = 216234, name = "smalldom ♀"), + Female(id = 216125, name = "socks ♀"), + Female(id = 215995, name = "sole female ♀"), + Female(id = 216274, name = "solo action ♀"), + Female(id = 216147, name = "spats ♀"), + Female(id = 216022, name = "squirting ♀"), + Female(id = 216006, name = "stockings ♀"), + Female(id = 215996, name = "sweating ♀"), + Female(id = 215997, name = "swimsuit ♀"), + Female(id = 216023, name = "tail ♀"), + Female(id = 659, name = "tall girl ♀"), + Female(id = 216145, name = "tanlines ♀"), + Female(id = 216138, name = "teacher ♀"), + Female(id = 216655, name = "tentacles ♀"), + Female(id = 216131, name = "thick eyebrows ♀"), + Female(id = 216197, name = "thigh high boots ♀"), + Female(id = 216152, name = "thigh job ♀"), + Female(id = 142, name = "tomboy ♀"), + Female(id = 216241, name = "tracksuit ♀"), + Female(id = 216104, name = "transparent clothing ♀"), + Female(id = 216749, name = "triple penetration ♀"), + Female(id = 216137, name = "tsundere ♀"), + Female(id = 216249, name = "twins ♀"), + Female(id = 216113, name = "twintails ♀"), + Female(id = 216105, name = "unusual pupils ♀"), + Female(id = 216242, name = "urination ♀"), + Female(id = 215998, name = "very long hair ♀"), + Female(id = 216378, name = "waitress ♀"), + Female(id = 21, name = "x-ray ♀"), + Female(id = 5695, name = "yuri ♀"), + ) + val mixedList = listOf( + Mixed(id = 216752, name = "body swap"), + Mixed(id = 1918, name = "fffm foursome"), + Mixed(id = 272, name = "ffm threesome"), + Mixed(id = 229, name = "group"), + Mixed(id = 414, name = "incest"), + Mixed(id = 597, name = "inseki"), + Mixed(id = 878, name = "mmf threesome"), + Mixed(id = 242, name = "mmmf foursome"), + ) + val otherList = listOf( + Other(id = 145899, name = "box set"), + Other(id = 151271, name = "cg set"), + Other(id = 171843, name = "compilation"), + Other(id = 2373, name = "ecchi"), + Other(id = 49, name = "full color"), + Other(id = 216110, name = "incomplete"), + Other(id = 7691, name = "interview"), + Other(id = 80294, name = "mosaics"), + Other(id = 216000, name = "multi-work series"), + Other(id = 1376, name = "non-h"), + Other(id = 31903, name = "no penetration"), + Other(id = 163152, name = "ongoing"), + Other(id = 1375, name = "slice of life"), + Other(id = 216288, name = "soushuuhen"), + Other(id = 1852, name = "story arc"), + Other(id = 82597, name = "tankoubon"), + Other(id = 8, name = "uncensored"), + Other(id = 5, name = "vanilla"), + Other(id = 71980, name = "webtoon"), + Other(id = 2394, name = "western"), + ) +} diff --git a/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/TurnstileInterceptor.kt b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/TurnstileInterceptor.kt new file mode 100644 index 000000000..4ee469684 --- /dev/null +++ b/src/all/koharu/src/eu/kanade/tachiyomi/extension/all/koharu/TurnstileInterceptor.kt @@ -0,0 +1,242 @@ +package eu.kanade.tachiyomi.extension.all.koharu + +import android.annotation.SuppressLint +import android.app.Application +import android.os.Handler +import android.os.Looper +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient +import eu.kanade.tachiyomi.extension.all.koharu.Koharu.Companion.authorization +import eu.kanade.tachiyomi.extension.all.koharu.Koharu.Companion.token +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import okhttp3.Headers +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response +import uy.kohesive.injekt.injectLazy +import java.io.IOException +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + +/** Cloudflare Turnstile interceptor */ +class TurnstileInterceptor( + private val client: OkHttpClient, + private val domainUrl: String, + private val authUrl: String, + private val userAgent: String?, +) : Interceptor { + + private val context: Application by injectLazy() + private val handler by lazy { Handler(Looper.getMainLooper()) } + + private val lazyHeaders by lazy { + Headers.Builder().apply { + set("User-Agent", userAgent ?: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36") + set("Referer", "$domainUrl/") + set("Origin", domainUrl) + }.build() + } + + private fun authHeaders(authorization: String) = + Headers.Builder().apply { + set("User-Agent", userAgent ?: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36") + set("Referer", "$domainUrl/") + set("Origin", domainUrl) + set("Authorization", authorization) + }.build() + + private val authorizedRequestRegex by lazy { Regex("""(.+\?crt=)(.*)""") } + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + + val url = request.url.toString() + val matchResult = authorizedRequestRegex.find(url) ?: return chain.proceed(request) + if (matchResult.groupValues.size == 3) { + val requestingUrl = matchResult.groupValues[1] + val crt = matchResult.groupValues[2] + var newResponse: Response + + if (crt.isNotBlank() && crt != "null") { + // Token already set in URL, just make the request + newResponse = chain.proceed(request) + if (newResponse.code !in listOf(400, 403)) return newResponse + } else { + // Token doesn't include, add token then make request + if (token.isNullOrBlank()) resolveInWebview() + val newRequest = if (request.method == "POST") { + POST("${requestingUrl}$token", lazyHeaders) + } else { + GET("${requestingUrl}$token", lazyHeaders) + } + newResponse = chain.proceed(newRequest) + if (newResponse.code !in listOf(400, 403)) return newResponse + } + newResponse.close() + + // Request failed, refresh token then try again + clearToken() + token = null + resolveInWebview() + val newRequest = if (request.method == "POST") { + POST("${requestingUrl}$token", lazyHeaders) + } else { + GET("${requestingUrl}$token", lazyHeaders) + } + newResponse = chain.proceed(newRequest) + if (newResponse.code !in listOf(400, 403)) return newResponse + throw IOException("Open webview once to refresh token (${newResponse.code})") + } + return chain.proceed(request) + } + + @SuppressLint("SetJavaScriptEnabled") + fun resolveInWebview(): Pair { + val latch = CountDownLatch(1) + var webView: WebView? = null + + handler.post { + val webview = WebView(context) + webView = webview + with(webview.settings) { + javaScriptEnabled = true + domStorageEnabled = true + databaseEnabled = true + useWideViewPort = false + loadWithOverviewMode = false + } + + webview.webViewClient = object : WebViewClient() { + override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? { + val authHeader = request?.requestHeaders?.get("Authorization") + if (request?.url.toString().contains(authUrl) && authHeader != null) { + authorization = authHeader + if (request.method == "POST") { + // Authorize & requesting a new token. + // `authorization` here should be in format: Bearer + try { + val noRedirectClient = client.newBuilder().followRedirects(false).build() + val authHeaders = authHeaders(authHeader) + val response = noRedirectClient.newCall(POST(authUrl, authHeaders)).execute() + response.use { + if (response.isSuccessful) { + with(response) { + token = body.string() + .removeSurrounding("\"") + } + } + } + } catch (_: IOException) { + } finally { + latch.countDown() + } + } + if (request.method == "GET") { + // Site is trying to recheck old token validation here. + // If it fails then site will request a new one using POST method. + // But we will check it ourselves. + // Normally this might not occur because old token should already be acquired & rechecked via onPageFinished. + // `authorization` here should be in format: Bearer + val oldToken = authorization + ?.substringAfterLast(" ") + if (oldToken != null && recheckTokenValid(oldToken)) { + token = oldToken + latch.countDown() + } + } + } + return super.shouldInterceptRequest(view, request) + } + + /** + * Read the saved token in localStorage and use it. + * This token might already expired. Normally site will check token for expiration with a GET request. + * Here will will recheck it ourselves. + */ + override fun onPageFinished(view: WebView?, url: String?) { + if (view == null) return + val script = "javascript:localStorage['clearance']" + view.evaluateJavascript(script) { + // Avoid overwrite newly requested token + if (!it.isNullOrBlank() && it != "null" && token.isNullOrBlank()) { + val oldToken = it + .removeSurrounding("\"") + if (recheckTokenValid(oldToken)) { + token = oldToken + latch.countDown() + } + } + } + } + + private fun recheckTokenValid(token: String): Boolean { + try { + val noRedirectClient = client.newBuilder().followRedirects(false).build() + val authHeaders = authHeaders("Bearer $token") + val response = noRedirectClient.newCall(GET(authUrl, authHeaders)).execute() + response.use { + if (response.isSuccessful) { + return true + } + } + } catch (_: IOException) { + } + return false + } + } + + webview.loadUrl("$domainUrl/") + } + + latch.await(20, TimeUnit.SECONDS) + + handler.post { + // One last try to read the token from localStorage, in case it got updated last minute. + if (token.isNullOrBlank()) { + val script = "javascript:localStorage['clearance']" + webView?.evaluateJavascript(script) { + if (!it.isNullOrBlank() && it != "null") { + token = it + .removeSurrounding("\"") + } + } + } + + webView?.stopLoading() + webView?.destroy() + webView = null + } + + return token to authorization + } + + @SuppressLint("SetJavaScriptEnabled") + private fun clearToken() { + val latch = CountDownLatch(1) + handler.post { + val webView = WebView(context) + with(webView.settings) { + javaScriptEnabled = true + domStorageEnabled = true + databaseEnabled = true + } + webView.webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + if (view == null) return + val script = "javascript:localStorage.clear()" + view.evaluateJavascript(script) { + token = null + view.stopLoading() + view.destroy() + latch.countDown() + } + } + } + webView.loadUrl(domainUrl) + } + latch.await(20, TimeUnit.SECONDS) + } +}