Compare commits

...

4 Commits

Author SHA1 Message Date
Raymond
2ab2666ad0
Feat: Favorites (for all supported games) (#174) 2025-09-29 22:56:26 -07:00
alexay7
4971f2be78
[+] Add support for geki cm and fix chusan cm implementation (#175) 2025-09-29 22:47:31 -07:00
Menci
b0a49d6626
[+] Add APIs (#177) 2025-09-29 21:54:58 -07:00
凌莞~(=^▽^=)
d830854eaa
fix: X-Verse Username (#179) 2025-09-29 22:35:56 -04:00
23 changed files with 1524 additions and 25 deletions

View File

@ -107,7 +107,8 @@ export interface GenericGameSummary {
lastVersion: string
ratingComposition: { [key: string]: any }
recent: GenericGamePlaylog[]
rival?: boolean
rival?: boolean,
favorites?: number[]
}
export interface MusicMeta {

View File

@ -28,6 +28,7 @@ export const EN_REF_USER = {
'UserHome.RemoveRival': "Remove from Rival",
'UserHome.InvalidGame': "Game ${game} is not supported on the web UI yet. We only support maimai, chunithm, wacca, and ongeki for now.",
'UserHome.ShowMoreRecent': 'Show more',
'UserHome.FavoriteSongs': 'Favorite Songs'
}
export const EN_REF_Welcome = {

View File

@ -40,6 +40,7 @@ const zhUser: typeof EN_REF_USER = {
'UserHome.RemoveRival': "移除劲敌",
'UserHome.InvalidGame': "游戏 ${game} 还不支持网页端查看。我们目前只支持舞萌、中二、华卡和音击。",
'UserHome.ShowMoreRecent': "显示更多",
'UserHome.FavoriteSongs': "收藏歌曲"
}
const zhWelcome: typeof EN_REF_Welcome = {

View File

@ -325,7 +325,6 @@
<RatingComposition title="Recent 10" comp={d.user.ratingComposition.recent10} {allMusics} game={game != "auto" ? game : "mai2"} top={10}/>
{/if}
<div class="recent">
<h2>{t('UserHome.RecentScores')}</h2>
<div class="scores">
@ -368,6 +367,22 @@
{/if}
</div>
</div>
{#if d.user.favorites != null && d.user.favorites.length > 0}
<div class="favorites">
<h2>{t('UserHome.FavoriteSongs')}</h2>
<div class="scores">
{#each d.user.favorites as favoriteSongId, i}
<div>
<img src={`${DATA_HOST}/d/${game}/music/00${favoriteSongId.toString().padStart(6, '0').substring(2)}.png`} alt="" on:error={coverNotFound} />
<div class="info">
<div class="song-title">{allMusics[favoriteSongId.toString()] ? allMusics[favoriteSongId.toString()].name : t("UserHome.UnknownSong")}</div>
</div>
</div>
{/each}
</div>
</div>
{/if}
{/if}
<StatusOverlays {error} loading={!d || isLoading} />
@ -554,6 +569,60 @@
flex-direction: row
justify-content: space-between
.favorites
.scores
display: flex
flex-wrap: wrap
flex-direction: row
gap: 20px
// Image and song info
> div
display: flex
align-items: center
width: calc(calc(100% / 3) - 20px) // what the fuck is going on anymore
gap: 20px
background-color: rgba(white, 0.03)
border-radius: vars.$border-radius
img
width: 50px
height: 50px
border-radius: vars.$border-radius
object-fit: cover
// Song info and score
> div.info
flex: 1
display: flex
justify-content: space-between
overflow: hidden
flex-direction: column
.first-line
display: flex
flex-direction: row
// Limit song name to one line
.song-title
max-width: 100%
overflow: hidden
text-overflow: ellipsis
white-space: nowrap
// Make song score and rank not wrap
> div:last-child
white-space: nowrap
@media (max-width: vars.$w-mobile)
flex-direction: column
gap: 0
.rank-text
text-align: left
// Recent Scores section
.recent
.scores

View File

@ -148,7 +148,7 @@ abstract class GameApiController<T : IUserData>(val name: String, userDataClass:
userMusicRepo.findByUser_Card_ExtIdAndMusicIdIn(card.extId, musicList)
}
fun genericUserSummary(card: Card, ratingComp: Map<String, String>, rival: Boolean? = null): GenericGameSummary {
fun genericUserSummary(card: Card, ratingComp: Map<String, String>, rival: Boolean? = null, favorites: List<Int>? = null): GenericGameSummary {
// Summary values: total plays, player rating, server-wide ranking
// number of each rank, max combo, number of full combo, number of all perfect
val user = userDataRepo.findByCard(card) ?: (404 - "Game data not found")
@ -199,7 +199,8 @@ abstract class GameApiController<T : IUserData>(val name: String, userDataClass:
ratingComposition = ratingComp,
recent = plays.sortedBy { it.userPlayDate.toString() }.takeLast(100).reversed(),
lastPlayedHost = user.lastClientId?.let { us.userRepo.findByKeychip(it)?.username },
rival = rival
rival = rival,
favorites = favorites
)
}

View File

@ -47,7 +47,8 @@ data class GenericGameSummary(
val recent: List<IGenericGamePlaylog>,
val rival: Boolean?
val rival: Boolean?,
val favorites: List<Int>?
)
data class GenericRankingPlayer(

View File

@ -60,7 +60,9 @@ class Chusan(
"new" to (extra["rating_new_list"] ?: ""),
)
genericUserSummary(card, ratingComposition)
val misc = rp.userMisc.findByUser_Card_ExtId(card.extId).firstOrNull()
genericUserSummary(card, ratingComposition, null, misc?.favMusic)
}
/**

View File

@ -66,7 +66,7 @@ class Maimai2(
}
}
genericUserSummary(card, ratingComposition, isMyRival)
genericUserSummary(card, ratingComposition, isMyRival, extra["favorite_music"]?.split(",")?.mapNotNull{it -> it.toIntOrNull()})
}
@API("user-rating")

View File

@ -31,7 +31,10 @@ class Wacca(
override suspend fun userSummary(@RP username: String, @RP token: String?) = us.cardByName(username) { card ->
// TODO: Rating composition
genericUserSummary(card, mapOf())
val data = userDataRepo.findByCard_ExtId(card.extId)
genericUserSummary(card, mapOf(), null, if (data.isPresent) data.get().favoriteSongs else null)
}
override val shownRanks: List<Pair<Int, String>> = waccaScores.filter { it.first > 85 * 10000 }

View File

@ -35,7 +35,7 @@ class ChusanController(
val chusan: Chusan
): MeowApi({ api, resp ->
if (resp is String) resp
else (if ("CM" in api) cmMapper else mapper).write(resp)
else (if ("CM" in api || api == "GetUserItemApi" ) cmMapper else mapper).write(resp)
}) {
val log = LoggerFactory.getLogger(ChusanController::class.java)

View File

@ -54,10 +54,31 @@ fun ChusanController.cmApiInit() {
db.userGacha.save(it)
}
//Set the hasCompleted to true
val printState = db.userCardPrintState.findByUserAndGachaIdAndHasCompleted(u, gachaId, false)
if (printState.isEmpty()) return@api null
printState.forEach { it.hasCompleted = true }
db.userCardPrintState.saveAll(printState)
// Append the order ID to the response with the key "orderId"
val fullPrintState = printState.map {
mapOf(
"orderId" to it.id,
"hasCompleted" to it.hasCompleted,
"limitDate" to it.limitDate.toString(),
"placeId" to it.placeId,
"cardId" to it.cardId,
"gachaId" to it.gachaId,
"userId" to uid
)
}
mapOf(
"returnCode" to 1,
"apiName" to "CMUpsertUserGachaApi",
"userCardPrintStateList" to db.userCardPrintState.findByUserAndGachaIdAndHasCompleted(u, gachaId, false)
"userCardPrintStateList" to fullPrintState
)
}

View File

@ -25,7 +25,14 @@ fun ChusanController.upsertApiInit() {
val u = (userData?.get(0) ?: return@api null).apply {
id = oldUser?.id ?: 0
card = oldUser?.card ?: us.cardRepo.findByExtId(uid).expect("Card not found")
userName = userName.fromChusanUsername()
val version = data["version"] as? String ?: "0.00"
val versionNumber = version.toDoubleOrNull() ?: 0.0
userName = if (versionNumber >= 2.40) {
userName
} else {
userName.fromChusanUsername()
}
userNameEx = ""
}.also { db.userData.saveAndFlush(it) }
@ -92,10 +99,15 @@ fun ChusanController.upsertApiInit() {
score = it.score
}
selectUserName = selectUserName.fromChusanUsername()
opponentUserName1 = opponentUserName1.fromChusanUsername()
opponentUserName2 = opponentUserName2.fromChusanUsername()
opponentUserName3 = opponentUserName3.fromChusanUsername()
val version = data["version"] as? String ?: "0.00"
val versionNumber = version.toDoubleOrNull() ?: 0.0
if (versionNumber < 2.40) {
// 2.40以下版本需要转换编码
selectUserName = selectUserName.fromChusanUsername()
opponentUserName1 = opponentUserName1.fromChusanUsername()
opponentUserName2 = opponentUserName2.fromChusanUsername()
opponentUserName3 = opponentUserName3.fromChusanUsername()
}
}) }
// List data

View File

@ -3,6 +3,10 @@ package icu.samnyan.aqua.sega.chusan.model.userdata
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.JsonDeserializer
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import icu.samnyan.aqua.net.games.BaseEntity
import icu.samnyan.aqua.net.games.IUserData
@ -10,8 +14,22 @@ import icu.samnyan.aqua.sega.chusan.model.request.UserEmoney
import icu.samnyan.aqua.sega.general.model.Card
import icu.samnyan.aqua.sega.util.jackson.AccessCodeSerializer
import jakarta.persistence.*
import kotlinx.io.IOException
import lombok.NoArgsConstructor
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
class FlexibleDateTimeDeserializer : JsonDeserializer<LocalDateTime?>() {
@Throws(IOException::class)
public override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): LocalDateTime {
return LocalDateTime.parse(p.getText(), FORMATTER)
}
companion object {
// Card Maker needs the date ending with ".0" and chunithm sends the dates without it so we need a flexible parser
private val FORMATTER: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss[.S]")
}
}
@Entity(name = "ChusanUserData")
@Table(name = "chusan_user_data")
@ -50,12 +68,14 @@ class Chu3UserData : BaseEntity(), IUserData {
var totalExpertHighScore: Long = 0
var totalMasterHighScore: Long = 0
var totalUltimaHighScore: Long = 0
@JsonDeserialize(using = FlexibleDateTimeDeserializer::class)
var eventWatchedDate: LocalDateTime = LocalDateTime.now()
var friendCount = 0
var firstGameId: String = ""
var firstRomVersion: String = ""
var firstDataVersion: String = ""
@JsonDeserialize(using = FlexibleDateTimeDeserializer::class)
override var firstPlayDate: LocalDateTime = LocalDateTime.now()
var lastGameId: String = ""
@ -65,6 +85,7 @@ class Chu3UserData : BaseEntity(), IUserData {
@JsonIgnore
var lastLoginDate: LocalDateTime = LocalDateTime.now()
@JsonDeserialize(using = FlexibleDateTimeDeserializer::class)
override var lastPlayDate: LocalDateTime = LocalDateTime.now()
var lastPlaceId = 0
var lastPlaceName: String = ""

View File

@ -1,5 +1,6 @@
package icu.samnyan.aqua.sega.chusan.model.userdata
import com.fasterxml.jackson.annotation.JsonIgnore
import jakarta.persistence.Entity
import jakarta.persistence.Table
import java.time.LocalDateTime
@ -8,6 +9,8 @@ import java.time.LocalDateTime
@Table(name = "chusan_user_print_state")
class UserCardPrintState(
var hasCompleted: Boolean = false,
@JsonIgnore
var limitDate: LocalDateTime = LocalDateTime.now(),
var placeId: Int = 0,
var cardId: Int = 0,

View File

@ -9,6 +9,7 @@ import icu.samnyan.aqua.sega.maimai2.model.UserRivalMusicDetail
import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserKaleidx
import icu.samnyan.aqua.sega.maimai2.model.userdata.UserRegions
import java.time.LocalDate
import kotlin.random.Random
fun Maimai2ServletController.initApis() {
val log = logger()
@ -312,14 +313,6 @@ fun Maimai2ServletController.initApis() {
)
}
"GetServerAnnouncement" static { mapOf(
"title" to "",
"announcement" to "",
"showOnIdle" to false,
"showOnUserLogin" to false,
"imageUrl" to "",
) }
"GetGameWeeklyData" static { mapOf(
"gameWeeklyData" to mapOf(
"missionCategory" to 0,
@ -362,4 +355,71 @@ fun Maimai2ServletController.initApis() {
"userRecommendSelectionMusicIdList" to (net.recommendedMusic[user.id] ?: empty)
)
}
"GetGameFesta" { mapOf(
"eventId" to 0,
"isRallyPeriod" to false,
"isCircleJoinNotAllowed" to false,
"jackingFestaSideId" to Random.nextInt(0, 3),
"festaSideDataList" to empty,
) }
"GetPlaceCircleData" static { mapOf(
"returnCode" to 0,
"circleId" to 0,
"aggrDate" to ""
) }
"GetUserCircleData" static { mapOf(
"circleId" to 0,
"circleName" to "一緒に歌おう!",
"isPlace" to false,
"circleClass" to 0,
"lastLoginDate" to "",
"circlePointRankingList" to empty
) }
"GetUserCirclePointData" { mapOf(
"userId" to uid,
"aggrDate" to "",
"userCirclePointDataList" to empty
) }
"GetUserCirclePointRanking" static { mapOf(
"circleId" to 0,
"circleName" to "一緒に歌おう!",
"aggrDate" to "",
"lastMonthCircleRank" to 0,
"lastMonthPoint" to 0
) }
"GetUserFesta" static { mapOf(
"userFestaData" to mapOf(
"eventId" to 0,
"circleId" to 0,
"festaSideId" to 0,
"circleTotalFestaPoint" to 0,
"currentTotalFestaPoint" to 0,
"circleRankInFestaSide" to 0,
"circleRecordDate" to "",
"isDailyBonus" to false,
"participationRewardGet" to false,
"receivedRewardBorder" to 0
),
"userResultFestaData" to mapOf(
"eventId" to 0,
"circleId" to 0,
"circleName" to "一緒に歌おう!",
"festaSideId" to 0,
"circleRankInFestaSide" to 0,
"receivedRewardBorder" to 0,
"circleTotalFestaPoint" to 0,
"resultRewardGet" to false,
)
) }
"UpsertUserPlaceCircleRegist" static { mapOf(
"returnCode" to 0,
"apiName" to "UpsertUserPlaceCircleRegistApi"
) }
}

View File

@ -55,7 +55,7 @@ class Maimai2ServletController(
val endpointList = setOf("GetGameRankingApi","GetUserCharacterApi","GetUserItemApi","GetUserPortraitApi",
"GetUserRatingApi","UploadUserPhotoApi","UploadUserPlaylogApi","UploadUserPortraitApi","UpsertUserAllApi",
"CMGetUserCardApi","CMGetUserCardPrintErrorApi","CMGetUserDataApi","CMGetUserItemApi","CMUpsertUserPrintApi",
"GetUserFavoriteItemApi","GetServerAnnouncementApi")
"GetUserFavoriteItemApi")
val noopEndpoint = setOf("GetUserScoreRankingApi", "UpsertClientBookkeepingApi",
"UpsertClientSettingApi", "UpsertClientTestmodeApi", "UpsertClientUploadApi", "Ping", "RemoveTokenApi",

View File

@ -9,6 +9,7 @@ fun OngekiController.ongekiInit() {
fun <T> List<T>.staticLst(key: String) = mapOf("length" to size, key to this)
initUser()
cmApiInit()
initUpsertAll()
// Has type, but type is always 1

View File

@ -0,0 +1,345 @@
package icu.samnyan.aqua.sega.ongeki
import ext.asDateTime
import ext.empty
import ext.int
import ext.invoke
import ext.long
import ext.mapApply
import ext.minus
import ext.parsing
import icu.samnyan.aqua.sega.ongeki.model.*
import java.time.LocalDateTime
fun OngekiController.cmApiInit() {
"CMGetUserData" {
val user = db.data.findByCard_ExtId(uid)() ?: (400 - "User not found")
mapOf("userId" to uid, "userData" to user)
}
"PrinterLogin" { mapOf("returnCode" to 1) }
"PrinterLogout" { mapOf("returnCode" to 1) }
"CMGetUserCard".unpaged("userCardList"){
db.card.findByUser_Card_ExtId(uid).map { it.apply { printCount = 99 } }
}
"CMGetUserCharacter".unpaged("userCharacterList") { db.character.findByUser_Card_ExtId(uid)}
"CMGetUserItem" {
val kind = (parsing { data["nextIndex"]!!.long } / 10000000000L).toInt()
var dat = db.item.findByUser_Card_ExtIdAndItemKind(uid, kind)
// Check if user have infinite kaika
if (kind == OgkItemType.KaikaItem.ordinal) {
val u = db.data.findByCard_ExtId(uid)()
u?.card?.aquaUser?.gameOptions?.let {
if (it.ongekiInfiniteKaika) {
dat = listOf(UserItem().apply {
user = u
itemKind = OgkItemType.KaikaItem.ordinal
itemId = 1
stock = 999
})
}
}
}
mapOf("userId" to uid, "length" to dat.size, "nextIndex" to -1, "itemKind" to kind, "userItemList" to dat)
}
"GetGameGacha" {
gdb.gacha.findAll().let {
mapOf("length" to it.size, "gameGachaList" to it, "registIdList" to emptyList<Any>())
}
}
"GetGameGachaCardById" {
val gachaId = parsing { data["gachaId"]!!.long }
gdb.gachaCard.findAllByGachaId(gachaId).let {
mapOf("gachaId" to gachaId, "length" to it.size, "isPickup" to false, "gameGachaCardList" to it,
"emissionList" to empty, "afterCalcList" to empty
)
}
}
"GetUserGacha" {
db.gacha.findByUser_Card_ExtId(uid).let{
mapOf("userId" to uid, "length" to it.size, "nextIndex" to 0, "userGachaList" to it)
}
}
"RollGacha" {
val (gachaId, tmpTimes) = parsing { data["gachaId"]!!.long to data["times"]!!.int }
var times = tmpTimes
val user = db.data.findByCard_ExtId(uid)() ?: (400 - "User not found")
val foundGacha = gdb.gacha.findById(gachaId)() ?: (404 - "Gacha not found")
val foundUserGacha = db.gacha.findByUserAndGachaId(user, gachaId)
// Official gacha percentages: R 76% SR 21% SSR 3%
val probabilities = listOf(76, 21, 3)
var rarityResults: List<Int> = emptyList()
// If this is the first x5 pull or any x11 pull, an SR is guaranteed
if(foundUserGacha != null && ((times == 5 && foundUserGacha.fiveGachaCnt==0) || times==11)){
rarityResults = listOf(3)
times -= 1
}
rarityResults = rarityResults + List(times) {
val rand = (1..100).random()
when {
rand <= probabilities[0] -> 2
rand <= probabilities[0] + probabilities[1] -> 3
else -> 4
}
}
val pulledCards = if(foundGacha.kind==0 || foundGacha.kind==3) {
// If it is the free or the permanent gacha, include cards from the gacha itself
gdb.gachaCard.findAllByGachaId(gachaId).groupBy { it.rarity }
} else {
// If it is a normal gacha, include all cards from the permanent gacha
gdb.gachaCard.findAllByGachaIdAndPermanent(gachaId).groupBy { it.rarity }
}
val finalPulls = rarityResults.map { rarity -> pulledCards[rarity]?.random()}
mapOf("length" to finalPulls.size, "gameGachaCardList" to finalPulls)
}
"CMUpsertUserGacha" api@ {
val all: OngekiCMUpsertUserGacha = mapper.convert(data["cmUpsertUserGacha"]!!)
val gacha = parsing { data["gachaId"]!!.long }
val pullCount = parsing { data["gachaCnt"]!!.int }
val earnedSelectPoints = parsing { data["selectPoint"]!!.int }
// User data
val oldUser = db.data.findByCard_ExtId(uid)()
val u: UserData = all.userData?.get(0)?.apply {
id = oldUser?.id ?: 0
card = oldUser?.card ?: us.cardRepo.findByExtId(uid)() ?: (404 - "Card not found")
// Set eventWatchedDate with lastPlayDate, because client doesn't update it
cmEventWatchedDate = oldUser?.lastPlayDate ?: ""
db.data.save(this)
} ?: oldUser ?: return@api null
db.gacha.findByUserAndGachaId(u, gacha)?.apply {
totalGachaCnt += pullCount
// If the user pulled a select gacha increase the stats
if (earnedSelectPoints > 0) {
selectPoint += earnedSelectPoints
ceilingGachaCnt += pullCount
}
// Stats related with the group of pulls the user makes
if (pullCount == 5) {
fiveGachaCnt += 1
}else if (pullCount == 11) {
elevenGachaCnt+=1
}
// Update the daily gacha
val parsedDailyGachaDate = dailyGachaDate.asDateTime()!!
if (
parsedDailyGachaDate.dayOfMonth != LocalDateTime.now().dayOfMonth ||
parsedDailyGachaDate.monthValue != LocalDateTime.now().monthValue ||
parsedDailyGachaDate.year != LocalDateTime.now().year
) {
dailyGachaCnt += pullCount
dailyGachaDate = LocalDateTime.now().toString()
}else{
dailyGachaCnt += pullCount
}
}?: UserGacha().apply {
user = u
gachaId = gacha
totalGachaCnt = pullCount
selectPoint = earnedSelectPoints
ceilingGachaCnt = if (earnedSelectPoints > 0) 1 else 0
fiveGachaCnt = if (pullCount == 5) 1 else 0
elevenGachaCnt = if (pullCount == 11) 1 else 0
dailyGachaCnt = pullCount
db.gacha.save(this)
}
all.run {
// Set users
listOfNotNull(
userCharacterList, userCardList, userItemList
).flatten().forEach { it.user = u }
// UserCharacterList
userCharacterList?.let { list ->
db.character.saveAll(list.distinctBy { it.characterId }.mapApply {
id = db.character.findByUserAndCharacterId(u, characterId)()?.id ?: 0
})
}
// UserCardList
userCardList?.let { list ->
db.card.saveAll(list.distinctBy { it.cardId }.mapApply {
id = db.card.findByUserAndCardId(u, cardId)()?.id ?: 0
})
}
// UserItemList
userItemList?.let { list ->
db.item.saveAll(list.distinctBy { it.itemKind to it.itemId }.mapApply {
id = db.item.findByUserAndItemKindAndItemId(u, itemKind, itemId)()?.id ?: 0
})
}
}
null
}
"CMUpsertUserAll" api@{
val all: OngekiCMUpsertAll = mapper.convert(data["cmUpsertUserAll"]!!)
// User data
val oldUser = db.data.findByCard_ExtId(uid)()
val u: UserData = all.userData?.get(0)?.apply {
id = oldUser?.id ?: 0
card = oldUser?.card ?: us.cardRepo.findByExtId(uid)() ?: (404 - "Card not found")
// Set eventWatchedDate with lastPlayDate, because client doesn't update it
cmEventWatchedDate = oldUser?.lastPlayDate ?: ""
db.data.save(this)
} ?: oldUser ?: return@api null
all.run {
// Set users
listOfNotNull(
userActivityList, userCharacterList, userCardList, userItemList
).flatten().forEach { it.user = u }
// UserActivityList
userActivityList?.let { list ->
db.activity.saveAll(list.distinctBy { it.activityId to it.kind }.mapApply {
id = db.activity.findByUserAndKindAndActivityId(u, kind, activityId)()?.id ?: 0
})
}
// UserCharacterList
userCharacterList?.let { list ->
db.character.saveAll(list.distinctBy { it.characterId }.mapApply {
id = db.character.findByUserAndCharacterId(u, characterId)()?.id ?: 0
})
}
// UserCardList
userCardList?.let { list ->
db.card.saveAll(list.distinctBy { it.cardId }.mapApply {
id = db.card.findByUserAndCardId(u, cardId)()?.id ?: 0
})
}
// UserItemList
userItemList?.let { list ->
db.item.saveAll(list.distinctBy { it.itemKind to it.itemId }.mapApply {
id = db.item.findByUserAndItemKindAndItemId(u, itemKind, itemId)()?.id ?: 0
})
}
}
null
}
"CMUpsertUserSelectGacha" api@ {
val all: OngekiCMUpsertUserSelectGacha = mapper.convert(data["cmUpsertUserSelectGacha"]!!)
val selectLog:List<OngekiCMSelectGachaLog> = mapper.convert(data["selectGachaLogList"]!!)
// User data
val oldUser = db.data.findByCard_ExtId(uid)()
val u: UserData = all.userData?.get(0)?.apply {
id = oldUser?.id ?: 0
card = oldUser?.card ?: us.cardRepo.findByExtId(uid)() ?: (404 - "Card not found")
// Set eventWatchedDate with lastPlayDate, because client doesn't update it
cmEventWatchedDate = oldUser?.lastPlayDate ?: ""
db.data.save(this)
} ?: oldUser ?: return@api null
if(selectLog.isNotEmpty()) {
val selectionInfo = selectLog.first()
db.gacha.findByUserAndGachaId(u, selectionInfo.gachaId)?.apply {
// Total reset of selectPoints
selectPoint = 0
// Set the flag for the selection gacha so that the user cant use it anymore
useSelectPoint = 1
} ?: UserGacha().apply {
// It should be impossible to reach this
user = u
gachaId = selectionInfo.gachaId
db.gacha.save(this)
}
}
all.run {
// Set users
listOfNotNull(
userCharacterList, userCardList
).flatten().forEach { it.user = u }
if (all.isNewCharacterList?.contains("1") ?: false) {
// UserCharacterList
userCharacterList?.let { list ->
db.character.saveAll(list.distinctBy { it.characterId }.mapApply {
id = db.character.findByUserAndCharacterId(u, characterId)()?.id ?: 0
})
}
}
if (all.isNewCardList?.contains("1") ?: false) {
// UserCardList
userCardList?.let { list ->
db.card.saveAll(list.distinctBy { it.cardId }.mapApply {
id = db.card.findByUserAndCardId(u, cardId)()?.id ?: 0
})
}
}
}
null
}
"CMUpsertUserPrintPlaylog" api@ {
// User payment logs, useless
null
}
"CMUpsertUserPrint" api@ {
// User print information, useless
null
}
"CMUpsertUserPrintlog" api@ {
// User print logs, useless
null
}
"CMGetUserGachaSupply" {
// Mock function, not sure of functionality
mapOf("supplyId" to 0, "length" to 0, "supplyCardList" to emptyList<Any>())
}
"GetGameTheater" {
// Mock function, not sure of functionality
mapOf("length" to 0, "gameTheaterList" to emptyList<Any>(), "registIdList" to emptyList<Any>())
}
}

View File

@ -151,6 +151,19 @@ interface OgkUserRegionsRepo: OngekiUserLinked<UserRegions> {
fun findByUserAndRegionId(user: UserData, regionId: Int): UserRegions?
}
interface OgkGameGachaCardRepo : JpaRepository<GameGachaCard, Long> {
fun findAllByGachaId(gachaId: Long): List<GameGachaCard>
@Query("SELECT g FROM OngekiGameGachaCard g WHERE g.gachaId = :gachaId OR g.gachaId = 1112")
fun findAllByGachaIdAndPermanent(gachaId: Long): List<GameGachaCard>
}
interface OgkGameGachaRepo : JpaRepository<GameGacha, Long>
interface OgkUserGachaRepo : OngekiUserLinked<UserGacha> {
fun findByUserAndGachaId(user: UserData, gachaId: Long): UserGacha?
}
// Re:Fresh
interface OgkUserEventMapRepo : OngekiUserLinked<UserEventMap>
interface OgkUserSkinRepo : OngekiUserLinked<UserSkin>
@ -195,6 +208,7 @@ class OngekiUserRepos(
val eventMap: OgkUserEventMapRepo,
val skin: OgkUserSkinRepo,
val regions: OgkUserRegionsRepo,
val gacha: OgkUserGachaRepo,
)
@Component
@ -207,6 +221,8 @@ class OngekiGameRepos(
val present: OgkGamePresentRepo,
val reward: OgkGameRewardRepo,
val skill: OgkGameSkillRepo,
val gachaCard: OgkGameGachaCardRepo,
val gacha:OgkGameGachaRepo
)
@Component

View File

@ -1,6 +1,7 @@
package icu.samnyan.aqua.sega.ongeki.model
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonProperty
import jakarta.persistence.*
@Entity(name = "OngekiGameCard")
@ -112,3 +113,41 @@ class GameSkill {
var category: String = ""
var info: String = ""
}
@Entity(name = "OngekiGameGachaCard")
@Table(name = "ongeki_game_gacha_card")
class GameGachaCard {
@Id
var cardId: Long = 0
var gachaId: Long = 0
var rarity: Int = 0
var weight: Int = 0
@JsonProperty("isPickup")
var isPickup: Boolean = false
@JsonProperty("isSelect")
var isSelect: Boolean = false
}
@Entity(name = "OngekiGameGacha")
@Table(name = "ongeki_game_gacha")
class GameGacha {
@Id
var gachaId: Long = 0
var gachaName: String = ""
var type: Int = 0
var kind: Int = 0
var maxSelectPoint: Int = 0
var ceilingCnt: Int = 0
var changeRateCnt1: Int = 0
var changeRateCnt2: Int = 0
var startDate: String = ""
var endDate: String = ""
var noticeStartDate: String = ""
var noticeEndDate: String = ""
var convertEndDate: String = ""
@JsonProperty("isCeiling")
var isCeiling: Boolean = false
}

View File

@ -0,0 +1,44 @@
package icu.samnyan.aqua.sega.ongeki.model
class OngekiCMUpsertUserGacha {
var userData: List<UserData>? = null
var userCharacterList: List<UserCharacter>? = null
var userCardList: List<UserCard>? = null
var gameGachaCardList: List<GameGachaCard>? = null
var userItemList: List<UserItem>? = null
// These are strings with as many 1s as new elements are present
var isNewCharacterList: String? = null
var isNewCardList: String? = null
var isNewItemList: String? = null
}
class OngekiCMUpsertAll {
var userData: List<UserData>? = null
var userActivityList: List<UserActivity>? = null
var userCharacterList: List<UserCharacter>? = null
var userCardList: List<UserCard>? = null
var userItemList: List<UserItem>? = null
// These are strings with as many 1s as new elements are given
var isNewCharacterList: String? = null
var isNewCardList: String? = null
var isNewItemList: String? = null
}
class OngekiCMUpsertUserSelectGacha {
var userData: List<UserData>? = null
var userCharacterList: List<UserCharacter>? = null
var userCardList: List<UserCard>? = null
// These are strings with as many 1s as new elements are given
var isNewCharacterList: String? = null
var isNewCardList: String? = null
}
class OngekiCMSelectGachaLog {
var gachaId: Long = 0
var useSelectPoint: Int = 0
var convertType: Int = 0
var convertItem: Int = 0
}

View File

@ -8,6 +8,7 @@ import icu.samnyan.aqua.sega.general.model.Card
import icu.samnyan.aqua.sega.util.jackson.AccessCodeSerializer
import jakarta.persistence.*
import java.time.LocalDate
import java.time.LocalDateTime
@MappedSuperclass
class OngekiUserEntity : BaseEntity(), IUserEntity<UserData> {
@ -517,10 +518,27 @@ class UserSkin : OngekiUserEntity() {
@Entity(name = "OngekiUserRegions")
@Table(
name = "ongeki_user_regions",
uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "regionId"])]
uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "region_id"])]
)
class UserRegions : OngekiUserEntity() {
var regionId = 0
var playCount = 1
var created: String = LocalDate.now().toString()
}
@Entity(name="OngekiUserGacha")
@Table(
name = "ongeki_user_gacha",
uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "gacha_id"])]
)
class UserGacha : OngekiUserEntity() {
var gachaId:Long = 0
var totalGachaCnt = 0
var ceilingGachaCnt = 0
var selectPoint = 0
var useSelectPoint = 0
var dailyGachaCnt = 0
var fiveGachaCnt = 0
var elevenGachaCnt = 0
var dailyGachaDate: String = LocalDateTime.now().toString()
}

View File

@ -0,0 +1,840 @@
CREATE TABLE ongeki_game_gacha
(
gacha_id BIGINT AUTO_INCREMENT NOT NULL,
gacha_name VARCHAR(255) NOT NULL,
type INT NOT NULL,
kind INT NOT NULL,
is_ceiling BOOLEAN NOT NULL,
max_select_point INT NOT NULL,
ceiling_cnt INT NOT NULL,
change_rate_cnt1 INT NOT NULL,
change_rate_cnt2 INT NOT NULL,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
notice_start_date DATETIME NOT NULL,
notice_end_date DATETIME NOT NULL,
convert_end_date DATETIME NOT NULL,
CONSTRAINT pk_ongk_gacha PRIMARY KEY (gacha_id)
);
CREATE TABLE ongeki_game_gacha_card
(
card_id BIGINT AUTO_INCREMENT NOT NULL,
gacha_id BIGINT NOT NULL,
rarity INT NOT NULL,
weight INT NOT NULL,
is_pickup BOOLEAN NOT NULL,
is_select BOOLEAN NOT NULL,
CONSTRAINT pk_ongk_gacha_card PRIMARY KEY (card_id, gacha_id)
);
ALTER TABLE ongeki_game_gacha_card
ADD CONSTRAINT FK_ONGEKI_GAME_GACHA_CARD_ON_GACHA FOREIGN KEY (gacha_id) REFERENCES ongeki_game_gacha (gacha_id );
CREATE TABLE ongeki_user_gacha
(
id BIGINT AUTO_INCREMENT NOT NULL,
user_id BIGINT NOT NULL,
gacha_id BIGINT NOT NULL,
total_gacha_cnt INT NOT NULL,
ceiling_gacha_cnt INT NOT NULL,
select_point INT NOT NULL,
use_select_point INT NOT NULL,
daily_gacha_cnt INT NOT NULL,
five_gacha_cnt INT NOT NULL,
eleven_gacha_cnt INT NOT NULL,
daily_gacha_date DATETIME NOT NULL,
CONSTRAINT pk_ongk_user_gacha PRIMARY KEY (id)
);
ALTER TABLE ongeki_user_gacha
ADD CONSTRAINT FK_ONGEKI_USER_GACHA_ON_USER FOREIGN KEY (user_id) REFERENCES ongeki_user_data (id);
ALTER TABLE ongeki_user_gacha
ADD CONSTRAINT FK_ONGEKI_USER_GACHA_ON_GACHA FOREIGN KEY (gacha_id) REFERENCES ongeki_game_gacha (gacha_id);
ALTER TABLE ongeki_user_gacha
ADD CONSTRAINT unq_ongk_user_gacha UNIQUE (user_id, gacha_id);
INSERT INTO ongeki_game_gacha (gacha_id, gacha_name, `type`, kind, is_ceiling, max_select_point, ceiling_cnt, change_rate_cnt1, change_rate_cnt2, start_date, end_date, notice_start_date, notice_end_date, convert_end_date)
VALUES
(1011, '無料ガチャ', 0, 3, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1012, '無料ガチャSR確定', 0, 3, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1112, 'レギュラーガチャ', 0, 0, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1123, 'AQUA属性オンリーガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1128, 'bitter chocolate kiss ガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1135, 'オンゲキ bright 大感謝祭ガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1137, 'テアトル展開!プロジェクト奏坂ドールズリミテッドガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1138, 'WONDER SHOOTER EASTER ガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1139, 'ラスボス登場!?悪の侵略者ガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1140, 'カラフルアンブレラガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1141, 'It''s Showtimeワンダフルサーカスガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1143, 'マーチングポケッツ ピックアップガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1144, 'bitter flavor ピックアップガチャ', 0, 4, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1145, '7EVENDAYS⇔HOLIDAYS ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1146, '⊿TRiEDGE ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1147, 'R.B.P. ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1148, '皇城 セツナ ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1149, 'ASTERISM ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1151, 'スラッシュスキル ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1152, '高瀬 梨緒オンリーガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1154, 'トラストスキル ピックアップガチャ', 0, 1, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1156, 'bright memory振り返りガチャ', 0, 2, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1159, 'オンゲキ&オンゲキ PLUS ピックアップガチャ', 0, 2, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1160, 'SUMMER SUMMER PLUS ピックアップガチャ', 0, 2, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1161, 'R.E.D. & R.E.D. PLUS ピックアップガチャ', 0, 2, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1162, 'bright & bright MEMORY ピックアップガチャ', 0, 2, 0, 0, 0, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000'),
(1167, '6周年記念!! 6rd Anniversaryセレクトガチャ', 0, 2, 1, 11, 11, 0, 0, '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2020-01-01 00:00:00.000', '2999-01-01 00:00:00.000', '2999-01-01 00:00:00.000');
INSERT INTO ongeki_game_gacha_card (card_id, gacha_id,rarity,weight,is_pickup,is_select)
VALUES
(100003, 1112, 2, 100, 0, 0),
(100003, 1149, 2, 100, 0, 0),
(100004, 1112, 2, 100, 0, 0),
(100004, 1149, 2, 100, 0, 0),
(100006, 1112, 3, 100, 0, 0),
(100006, 1159, 3, 100, 0, 0),
(100007, 1112, 3, 100, 0, 0),
(100007, 1159, 3, 100, 0, 0),
(100008, 1112, 4, 100, 0, 0),
(100008, 1159, 4, 100, 0, 0),
(100008, 1167, 4, 100, 0, 1),
(100012, 1112, 2, 100, 0, 0),
(100012, 1149, 2, 100, 0, 0),
(100013, 1112, 2, 100, 0, 0),
(100013, 1149, 2, 100, 0, 0),
(100015, 1112, 3, 100, 0, 0),
(100015, 1159, 3, 100, 0, 0),
(100016, 1112, 3, 100, 0, 0),
(100016, 1159, 3, 100, 0, 0),
(100017, 1112, 4, 100, 0, 0),
(100017, 1159, 4, 100, 0, 0),
(100017, 1167, 4, 100, 0, 1),
(100021, 1112, 2, 100, 0, 0),
(100021, 1149, 2, 100, 0, 0),
(100022, 1112, 2, 100, 0, 0),
(100022, 1149, 2, 100, 0, 0),
(100024, 1112, 3, 100, 0, 0),
(100024, 1159, 3, 100, 0, 0),
(100025, 1112, 3, 100, 0, 0),
(100025, 1159, 3, 100, 0, 0),
(100026, 1112, 4, 100, 0, 0),
(100026, 1159, 4, 100, 0, 0),
(100026, 1167, 4, 100, 0, 1),
(100030, 1112, 2, 100, 0, 0),
(100030, 1146, 2, 100, 0, 0),
(100030, 1152, 2, 100, 1, 0),
(100033, 1152, 3, 100, 1, 0),
(100033, 1159, 3, 100, 0, 0),
(100034, 1112, 4, 100, 0, 0),
(100034, 1152, 4, 100, 1, 0),
(100034, 1159, 4, 100, 0, 0),
(100034, 1167, 4, 100, 0, 1),
(100037, 1112, 2, 100, 0, 0),
(100037, 1146, 2, 100, 0, 0),
(100040, 1112, 3, 100, 0, 0),
(100040, 1159, 3, 100, 0, 0),
(100041, 1112, 4, 100, 0, 0),
(100041, 1159, 4, 100, 0, 0),
(100041, 1167, 4, 100, 0, 1),
(100044, 1112, 2, 100, 0, 0),
(100044, 1146, 2, 100, 0, 0),
(100047, 1112, 3, 100, 0, 0),
(100047, 1159, 3, 100, 0, 0),
(100048, 1112, 4, 100, 0, 0),
(100048, 1159, 4, 100, 0, 0),
(100048, 1167, 4, 100, 0, 1),
(100051, 1112, 2, 100, 0, 0),
(100051, 1144, 2, 100, 0, 0),
(100053, 1112, 3, 100, 0, 0),
(100053, 1144, 3, 100, 0, 0),
(100053, 1159, 3, 100, 0, 0),
(100054, 1112, 4, 100, 0, 0),
(100054, 1144, 4, 100, 0, 0),
(100054, 1159, 4, 100, 0, 0),
(100054, 1167, 4, 100, 0, 1),
(100057, 1112, 2, 100, 0, 0),
(100057, 1144, 2, 100, 0, 0),
(100059, 1112, 3, 100, 0, 0),
(100059, 1144, 3, 100, 0, 0),
(100059, 1159, 3, 100, 0, 0),
(100060, 1112, 4, 100, 0, 0),
(100060, 1144, 4, 100, 0, 0),
(100060, 1159, 4, 100, 0, 0),
(100060, 1167, 4, 100, 0, 1),
(100063, 1112, 2, 100, 0, 0),
(100063, 1147, 2, 100, 0, 0),
(100065, 1112, 3, 100, 0, 0),
(100065, 1147, 3, 100, 0, 0),
(100065, 1159, 3, 100, 0, 0),
(100066, 1112, 4, 100, 0, 0),
(100066, 1147, 4, 100, 0, 0),
(100066, 1159, 4, 100, 0, 0),
(100066, 1167, 4, 100, 0, 1),
(100069, 1112, 2, 100, 0, 0),
(100069, 1145, 2, 100, 0, 0),
(100071, 1112, 3, 100, 0, 0),
(100071, 1145, 3, 100, 0, 0),
(100071, 1159, 3, 100, 0, 0),
(100072, 1112, 4, 100, 0, 0),
(100072, 1145, 4, 100, 0, 0),
(100072, 1159, 4, 100, 0, 0),
(100072, 1167, 4, 100, 0, 1),
(100075, 1112, 2, 100, 0, 0),
(100075, 1145, 2, 100, 0, 0),
(100077, 1112, 3, 100, 0, 0),
(100077, 1145, 3, 100, 0, 0),
(100077, 1159, 3, 100, 0, 0),
(100078, 1112, 4, 100, 0, 0),
(100078, 1145, 4, 100, 0, 0),
(100078, 1159, 4, 100, 0, 0),
(100078, 1167, 4, 100, 0, 1),
(100081, 1112, 2, 100, 0, 0),
(100081, 1147, 2, 100, 0, 0),
(100083, 1112, 3, 100, 0, 0),
(100083, 1147, 3, 100, 0, 0),
(100083, 1159, 3, 100, 0, 0),
(100084, 1112, 4, 100, 0, 0),
(100084, 1147, 4, 100, 0, 0),
(100084, 1159, 4, 100, 0, 0),
(100084, 1167, 4, 100, 0, 1),
(100087, 1112, 2, 100, 0, 0),
(100087, 1147, 2, 100, 0, 0),
(100089, 1112, 3, 100, 0, 0),
(100089, 1147, 3, 100, 0, 0),
(100089, 1159, 3, 100, 0, 0),
(100090, 1112, 4, 100, 0, 0),
(100090, 1147, 4, 100, 0, 0),
(100090, 1159, 4, 100, 0, 0),
(100090, 1167, 4, 100, 0, 1),
(100173, 1112, 2, 100, 0, 0),
(100173, 1149, 2, 100, 0, 0),
(100174, 1112, 2, 100, 0, 0),
(100174, 1149, 2, 100, 0, 0),
(100175, 1112, 2, 100, 0, 0),
(100175, 1149, 2, 100, 0, 0),
(100176, 1112, 2, 100, 0, 0),
(100176, 1146, 2, 100, 0, 0),
(100176, 1152, 2, 100, 1, 0),
(100177, 1112, 2, 100, 0, 0),
(100177, 1146, 2, 100, 0, 0),
(100178, 1112, 2, 100, 0, 0),
(100178, 1146, 2, 100, 0, 0),
(100179, 1112, 2, 100, 0, 0),
(100179, 1144, 2, 100, 0, 0),
(100180, 1112, 2, 100, 0, 0),
(100180, 1144, 2, 100, 0, 0),
(100181, 1112, 2, 100, 0, 0),
(100181, 1147, 2, 100, 0, 0),
(100182, 1112, 2, 100, 0, 0),
(100182, 1145, 2, 100, 0, 0),
(100183, 1112, 2, 100, 0, 0),
(100183, 1145, 2, 100, 0, 0),
(100184, 1112, 2, 100, 0, 0),
(100184, 1147, 2, 100, 0, 0),
(100185, 1112, 2, 100, 0, 0),
(100185, 1147, 2, 100, 0, 0),
(100209, 1011, 2, 100, 0, 0),
(100223, 1112, 2, 100, 0, 0),
(100223, 1149, 2, 100, 0, 0),
(100224, 1112, 2, 100, 0, 0),
(100224, 1149, 2, 100, 0, 0),
(100225, 1112, 2, 100, 0, 0),
(100225, 1149, 2, 100, 0, 0),
(100226, 1112, 2, 100, 0, 0),
(100226, 1146, 2, 100, 0, 0),
(100226, 1152, 2, 100, 1, 0),
(100227, 1112, 2, 100, 0, 0),
(100227, 1146, 2, 100, 0, 0),
(100228, 1112, 2, 100, 0, 0),
(100228, 1146, 2, 100, 0, 0),
(100229, 1112, 2, 100, 0, 0),
(100229, 1144, 2, 100, 0, 0),
(100230, 1112, 2, 100, 0, 0),
(100230, 1144, 2, 100, 0, 0),
(100231, 1112, 2, 100, 0, 0),
(100231, 1147, 2, 100, 0, 0),
(100232, 1112, 2, 100, 0, 0),
(100232, 1145, 2, 100, 0, 0),
(100233, 1112, 2, 100, 0, 0),
(100233, 1145, 2, 100, 0, 0),
(100234, 1112, 2, 100, 0, 0),
(100234, 1147, 2, 100, 0, 0),
(100235, 1112, 2, 100, 0, 0),
(100235, 1147, 2, 100, 0, 0),
(100236, 1011, 3, 100, 0, 0),
(100236, 1012, 3, 100, 0, 0),
(100237, 1011, 3, 100, 0, 0),
(100237, 1012, 3, 100, 0, 0),
(100238, 1011, 3, 100, 0, 0),
(100238, 1012, 3, 100, 0, 0),
(100239, 1011, 3, 100, 0, 0),
(100239, 1012, 3, 100, 0, 0),
(100240, 1011, 3, 100, 0, 0),
(100240, 1012, 3, 100, 0, 0),
(100241, 1011, 3, 100, 0, 0),
(100241, 1012, 3, 100, 0, 0),
(100242, 1011, 3, 100, 0, 0),
(100242, 1012, 3, 100, 0, 0),
(100243, 1011, 3, 100, 0, 0),
(100243, 1012, 3, 100, 0, 0),
(100244, 1011, 3, 100, 0, 0),
(100244, 1012, 3, 100, 0, 0),
(100245, 1011, 3, 100, 0, 0),
(100245, 1012, 3, 100, 0, 0),
(100246, 1011, 3, 100, 0, 0),
(100246, 1012, 3, 100, 0, 0),
(100247, 1011, 3, 100, 0, 0),
(100247, 1012, 3, 100, 0, 0),
(100248, 1011, 3, 100, 0, 0),
(100248, 1012, 3, 100, 0, 0),
(100249, 1112, 3, 100, 0, 0),
(100249, 1159, 3, 100, 0, 0),
(100250, 1112, 3, 100, 0, 0),
(100250, 1159, 3, 100, 0, 0),
(100251, 1112, 3, 100, 0, 0),
(100251, 1159, 3, 100, 0, 0),
(100252, 1011, 3, 100, 0, 0),
(100252, 1012, 3, 100, 0, 0),
(100253, 1011, 3, 100, 0, 0),
(100253, 1012, 3, 100, 0, 0),
(100254, 1011, 3, 100, 0, 0),
(100254, 1012, 3, 100, 0, 0),
(100255, 1011, 3, 100, 0, 0),
(100255, 1012, 3, 100, 0, 0),
(100256, 1011, 3, 100, 0, 0),
(100256, 1012, 3, 100, 0, 0),
(100257, 1011, 3, 100, 0, 0),
(100257, 1012, 3, 100, 0, 0),
(100258, 1011, 3, 100, 0, 0),
(100258, 1012, 3, 100, 0, 0),
(100259, 1011, 3, 100, 0, 0),
(100259, 1012, 3, 100, 0, 0),
(100260, 1011, 3, 100, 0, 0),
(100260, 1012, 3, 100, 0, 0),
(100261, 1011, 3, 100, 0, 0),
(100261, 1012, 3, 100, 0, 0),
(100262, 1112, 3, 100, 0, 0),
(100262, 1159, 3, 100, 0, 0),
(100263, 1112, 3, 100, 0, 0),
(100263, 1159, 3, 100, 0, 0),
(100264, 1112, 3, 100, 0, 0),
(100264, 1159, 3, 100, 0, 0),
(100265, 1112, 3, 100, 0, 0),
(100265, 1152, 3, 100, 1, 0),
(100265, 1159, 3, 100, 0, 0),
(100266, 1112, 3, 100, 0, 0),
(100266, 1159, 3, 100, 0, 0),
(100267, 1112, 3, 100, 0, 0),
(100267, 1159, 3, 100, 0, 0),
(100268, 1112, 3, 100, 0, 0),
(100268, 1144, 3, 100, 0, 0),
(100268, 1159, 3, 100, 0, 0),
(100269, 1112, 3, 100, 0, 0),
(100269, 1144, 3, 100, 0, 0),
(100269, 1159, 3, 100, 0, 0),
(100270, 1112, 3, 100, 0, 0),
(100270, 1147, 3, 100, 0, 0),
(100270, 1159, 3, 100, 0, 0),
(100271, 1112, 3, 100, 0, 0),
(100271, 1145, 3, 100, 0, 0),
(100271, 1159, 3, 100, 0, 0),
(100272, 1112, 3, 100, 0, 0),
(100272, 1145, 3, 100, 0, 0),
(100272, 1159, 3, 100, 0, 0),
(100273, 1112, 3, 100, 0, 0),
(100273, 1147, 3, 100, 0, 0),
(100273, 1159, 3, 100, 0, 0),
(100274, 1112, 3, 100, 0, 0),
(100274, 1147, 3, 100, 0, 0),
(100274, 1159, 3, 100, 0, 0),
(100275, 1112, 4, 100, 0, 0),
(100275, 1159, 4, 100, 0, 0),
(100275, 1167, 4, 100, 0, 1),
(100276, 1112, 4, 100, 0, 0),
(100276, 1159, 4, 100, 0, 0),
(100276, 1167, 4, 100, 0, 1),
(100277, 1112, 4, 100, 0, 0),
(100277, 1159, 4, 100, 0, 0),
(100277, 1167, 4, 100, 0, 1),
(100278, 1112, 4, 100, 0, 0),
(100278, 1152, 4, 100, 1, 0),
(100278, 1159, 4, 100, 0, 0),
(100278, 1167, 4, 100, 0, 1),
(100280, 1112, 4, 100, 0, 0),
(100280, 1159, 4, 100, 0, 0),
(100280, 1167, 4, 100, 0, 1),
(100282, 1112, 4, 100, 0, 0),
(100282, 1144, 4, 100, 0, 0),
(100282, 1159, 4, 100, 0, 0),
(100282, 1167, 4, 100, 0, 1),
(100284, 1112, 4, 100, 0, 0),
(100284, 1145, 4, 100, 0, 0),
(100284, 1159, 4, 100, 0, 0),
(100284, 1167, 4, 100, 0, 1),
(100285, 1112, 4, 100, 0, 0),
(100285, 1145, 4, 100, 0, 0),
(100285, 1159, 4, 100, 0, 0),
(100285, 1167, 4, 100, 0, 1),
(100286, 1112, 4, 100, 0, 0),
(100286, 1147, 4, 100, 0, 0),
(100286, 1159, 4, 100, 0, 0),
(100286, 1167, 4, 100, 0, 1),
(100336, 1011, 3, 100, 0, 0),
(100336, 1012, 3, 100, 0, 0),
(100337, 1011, 3, 100, 0, 0),
(100337, 1012, 3, 100, 0, 0),
(100338, 1011, 3, 100, 0, 0),
(100338, 1012, 3, 100, 0, 0),
(100339, 1112, 2, 100, 0, 0),
(100339, 1149, 2, 100, 0, 0),
(100340, 1112, 2, 100, 0, 0),
(100340, 1149, 2, 100, 0, 0),
(100341, 1112, 2, 100, 0, 0),
(100341, 1149, 2, 100, 0, 0),
(100342, 1112, 2, 100, 0, 0),
(100342, 1146, 2, 100, 0, 0),
(100342, 1152, 2, 100, 1, 0),
(100343, 1112, 2, 100, 0, 0),
(100343, 1146, 2, 100, 0, 0),
(100344, 1112, 2, 100, 0, 0),
(100344, 1146, 2, 100, 0, 0),
(100345, 1112, 2, 100, 0, 0),
(100345, 1144, 2, 100, 0, 0),
(100346, 1112, 2, 100, 0, 0),
(100346, 1144, 2, 100, 0, 0),
(100347, 1112, 2, 100, 0, 0),
(100347, 1147, 2, 100, 0, 0),
(100348, 1112, 2, 100, 0, 0),
(100348, 1145, 2, 100, 0, 0),
(100349, 1112, 2, 100, 0, 0),
(100349, 1145, 2, 100, 0, 0),
(100350, 1112, 2, 100, 0, 0),
(100350, 1147, 2, 100, 0, 0),
(100351, 1112, 2, 100, 0, 0),
(100351, 1147, 2, 100, 0, 0),
(100407, 1112, 4, 100, 0, 0),
(100407, 1143, 4, 100, 0, 0),
(100407, 1160, 4, 100, 0, 0),
(100407, 1167, 4, 100, 0, 1),
(100411, 1112, 2, 100, 0, 0),
(100411, 1146, 2, 100, 0, 0),
(100411, 1152, 2, 100, 1, 0),
(100412, 1112, 2, 100, 0, 0),
(100412, 1146, 2, 100, 0, 0),
(100413, 1112, 2, 100, 0, 0),
(100413, 1146, 2, 100, 0, 0),
(100414, 1112, 2, 100, 0, 0),
(100415, 1112, 2, 100, 0, 0),
(100416, 1112, 2, 100, 0, 0),
(100417, 1112, 2, 100, 0, 0),
(100418, 1112, 3, 100, 0, 0),
(100418, 1149, 3, 100, 0, 0),
(100418, 1160, 3, 100, 0, 0),
(100419, 1112, 3, 100, 0, 0),
(100419, 1160, 3, 100, 0, 0),
(100420, 1112, 3, 100, 0, 0),
(100420, 1144, 3, 100, 0, 0),
(100421, 1147, 3, 100, 0, 0),
(100421, 1160, 3, 100, 0, 0),
(100422, 1112, 3, 100, 0, 0),
(100422, 1144, 3, 100, 0, 0),
(100422, 1160, 3, 100, 0, 0),
(100423, 1112, 3, 100, 0, 0),
(100423, 1160, 3, 100, 0, 0),
(100424, 1112, 3, 100, 0, 0),
(100424, 1143, 3, 100, 0, 0),
(100424, 1160, 3, 100, 0, 0),
(100425, 1112, 3, 100, 0, 0),
(100425, 1160, 3, 100, 0, 0),
(100426, 1112, 3, 100, 0, 0),
(100426, 1147, 3, 100, 0, 0),
(100426, 1160, 3, 100, 0, 0),
(100427, 1112, 3, 100, 0, 0),
(100427, 1160, 3, 100, 0, 0),
(100428, 1112, 3, 100, 0, 0),
(100428, 1160, 3, 100, 0, 0),
(100429, 1112, 3, 100, 0, 0),
(100429, 1160, 3, 100, 0, 0),
(100430, 1112, 3, 100, 0, 0),
(100430, 1160, 3, 100, 0, 0),
(100431, 1112, 4, 100, 0, 0),
(100431, 1143, 4, 100, 0, 0),
(100431, 1160, 4, 100, 0, 0),
(100431, 1167, 4, 100, 0, 1),
(100432, 1112, 4, 100, 0, 0),
(100432, 1143, 4, 100, 0, 0),
(100432, 1160, 4, 100, 0, 0),
(100432, 1167, 4, 100, 0, 1),
(100433, 1112, 4, 100, 0, 0),
(100433, 1160, 4, 100, 0, 0),
(100433, 1167, 4, 100, 0, 1),
(100434, 1112, 4, 100, 0, 0),
(100434, 1144, 4, 100, 0, 0),
(100434, 1160, 4, 100, 0, 0),
(100434, 1167, 4, 100, 0, 1),
(100435, 1112, 4, 100, 0, 0),
(100435, 1123, 4, 100, 0, 0),
(100435, 1147, 4, 100, 0, 0),
(100435, 1154, 4, 100, 0, 0),
(100435, 1160, 4, 100, 0, 0),
(100435, 1167, 4, 100, 0, 1),
(100436, 1112, 4, 100, 0, 0),
(100436, 1160, 4, 100, 0, 0),
(100436, 1167, 4, 100, 0, 1),
(100437, 1112, 4, 100, 0, 0),
(100437, 1160, 4, 100, 0, 0),
(100437, 1167, 4, 100, 0, 1),
(100438, 1112, 4, 100, 0, 0),
(100438, 1147, 4, 100, 0, 0),
(100438, 1160, 4, 100, 0, 0),
(100438, 1167, 4, 100, 0, 1),
(100439, 1112, 4, 100, 0, 0),
(100439, 1146, 4, 100, 0, 0),
(100439, 1152, 4, 100, 1, 0),
(100439, 1160, 4, 100, 0, 0),
(100439, 1167, 4, 100, 0, 1),
(100440, 1011, 2, 100, 0, 0),
(100441, 1011, 2, 100, 0, 0),
(100445, 1112, 2, 100, 0, 0),
(100445, 1143, 2, 100, 0, 0),
(100447, 1112, 2, 100, 0, 0),
(100447, 1143, 2, 100, 0, 0),
(100449, 1112, 2, 100, 0, 0),
(100449, 1143, 2, 100, 0, 0),
(100454, 1011, 4, 100, 0, 0),
(100606, 1112, 3, 100, 0, 0),
(100607, 1112, 3, 100, 0, 0),
(100608, 1112, 3, 100, 0, 0),
(100608, 1143, 3, 100, 0, 0),
(100608, 1160, 3, 100, 0, 0),
(100609, 1112, 3, 100, 0, 0),
(100609, 1143, 3, 100, 0, 0),
(100609, 1160, 3, 100, 0, 0),
(100610, 1112, 3, 100, 0, 0),
(100610, 1143, 3, 100, 0, 0),
(100610, 1160, 3, 100, 0, 0),
(100634, 1011, 3, 100, 0, 0),
(100634, 1012, 3, 100, 0, 0),
(100636, 1011, 3, 100, 0, 0),
(100636, 1012, 3, 100, 0, 0),
(100637, 1011, 3, 100, 0, 0),
(100637, 1012, 3, 100, 0, 0),
(100638, 1011, 3, 100, 0, 0),
(100638, 1012, 3, 100, 0, 0),
(100639, 1011, 3, 100, 0, 0),
(100639, 1012, 3, 100, 0, 0),
(100640, 1011, 3, 100, 0, 0),
(100640, 1012, 3, 100, 0, 0),
(100641, 1011, 3, 100, 0, 0),
(100641, 1012, 3, 100, 0, 0),
(100642, 1011, 3, 100, 0, 0),
(100642, 1012, 3, 100, 0, 0),
(100643, 1011, 3, 100, 0, 0),
(100643, 1012, 3, 100, 0, 0),
(100644, 1011, 3, 100, 0, 0),
(100644, 1012, 3, 100, 0, 0),
(100645, 1011, 3, 100, 0, 0),
(100645, 1012, 3, 100, 0, 0),
(100646, 1011, 3, 100, 0, 0),
(100646, 1012, 3, 100, 0, 0),
(100647, 1112, 2, 100, 0, 0),
(100648, 1112, 2, 100, 0, 0),
(100649, 1112, 2, 100, 0, 0),
(100650, 1011, 2, 100, 0, 0),
(100651, 1011, 2, 100, 0, 0),
(100652, 1011, 2, 100, 0, 0),
(100653, 1112, 2, 100, 0, 0),
(100653, 1143, 2, 100, 0, 0),
(100654, 1112, 2, 100, 0, 0),
(100654, 1143, 2, 100, 0, 0),
(100655, 1112, 2, 100, 0, 0),
(100655, 1143, 2, 100, 0, 0),
(100662, 1112, 2, 100, 0, 0),
(100665, 1011, 3, 100, 0, 0),
(100665, 1012, 3, 100, 0, 0),
(100666, 1011, 3, 100, 0, 0),
(100666, 1012, 3, 100, 0, 0),
(100667, 1011, 3, 100, 0, 0),
(100667, 1012, 3, 100, 0, 0),
(100692, 1112, 2, 100, 0, 0),
(100692, 1149, 2, 100, 0, 0),
(100693, 1112, 2, 100, 0, 0),
(100693, 1149, 2, 100, 0, 0),
(100694, 1112, 2, 100, 0, 0),
(100694, 1149, 2, 100, 0, 0),
(100701, 1112, 2, 100, 0, 0),
(100701, 1146, 2, 100, 0, 0),
(100701, 1152, 2, 100, 1, 0),
(100702, 1011, 2, 100, 0, 0),
(100703, 1011, 2, 100, 0, 0),
(100711, 1112, 3, 100, 0, 0),
(100711, 1161, 3, 100, 0, 0),
(100712, 1112, 3, 100, 0, 0),
(100712, 1161, 3, 100, 0, 0),
(100725, 1112, 4, 100, 0, 0),
(100725, 1146, 4, 100, 0, 0),
(100725, 1161, 4, 100, 0, 0),
(100725, 1167, 4, 100, 0, 1),
(100726, 1112, 4, 100, 0, 0),
(100726, 1161, 4, 100, 0, 0),
(100726, 1167, 4, 100, 0, 1),
(100755, 1112, 2, 100, 0, 0),
(100756, 1112, 2, 100, 0, 0),
(100757, 1112, 3, 100, 0, 0),
(100757, 1160, 3, 100, 0, 0),
(100758, 1112, 3, 100, 0, 0),
(100758, 1160, 3, 100, 0, 0),
(100759, 1112, 3, 100, 0, 0),
(100759, 1160, 3, 100, 0, 0),
(100760, 1112, 4, 100, 0, 0),
(100760, 1149, 4, 100, 0, 0),
(100760, 1160, 4, 100, 0, 0),
(100760, 1167, 4, 100, 0, 1),
(100761, 1112, 4, 100, 0, 0),
(100761, 1160, 4, 100, 0, 0),
(100761, 1167, 4, 100, 0, 1),
(100762, 1112, 3, 100, 0, 0),
(100762, 1160, 3, 100, 0, 0),
(100763, 1112, 3, 100, 0, 0),
(100763, 1160, 3, 100, 0, 0),
(100764, 1112, 3, 100, 0, 0),
(100764, 1160, 3, 100, 0, 0),
(100765, 1112, 3, 100, 0, 0),
(100765, 1160, 3, 100, 0, 0),
(100766, 1112, 3, 100, 0, 0),
(100766, 1146, 3, 100, 0, 0),
(100766, 1160, 3, 100, 0, 0),
(100767, 1112, 4, 100, 0, 0),
(100767, 1160, 4, 100, 0, 0),
(100767, 1167, 4, 100, 0, 1),
(100768, 1112, 4, 100, 0, 0),
(100768, 1160, 4, 100, 0, 0),
(100768, 1167, 4, 100, 0, 1),
(100771, 1112, 2, 100, 0, 0),
(100772, 1011, 3, 100, 0, 0),
(100772, 1012, 3, 100, 0, 0),
(100777, 1112, 3, 100, 0, 0),
(100777, 1146, 3, 100, 0, 0),
(100777, 1152, 3, 100, 1, 0),
(100777, 1160, 3, 100, 0, 0),
(100778, 1112, 3, 100, 0, 0),
(100778, 1160, 3, 100, 0, 0),
(100779, 1112, 4, 100, 0, 0),
(100779, 1154, 4, 100, 0, 0),
(100779, 1160, 4, 100, 0, 0),
(100779, 1167, 4, 100, 0, 1),
(100780, 1112, 4, 100, 0, 0),
(100780, 1149, 4, 100, 0, 0),
(100780, 1160, 4, 100, 0, 0),
(100780, 1167, 4, 100, 0, 1),
(100783, 1112, 3, 100, 0, 0),
(100783, 1160, 3, 100, 0, 0),
(100784, 1112, 4, 100, 0, 0),
(100784, 1160, 4, 100, 0, 0),
(100784, 1167, 4, 100, 0, 1),
(100785, 1112, 3, 100, 0, 0),
(100785, 1149, 3, 100, 0, 0),
(100785, 1151, 3, 100, 0, 0),
(100785, 1161, 3, 100, 0, 0),
(100786, 1112, 3, 100, 0, 0),
(100786, 1149, 3, 100, 0, 0),
(100786, 1151, 3, 100, 0, 0),
(100786, 1161, 3, 100, 0, 0),
(100787, 1112, 4, 100, 0, 0),
(100787, 1151, 4, 100, 0, 0),
(100787, 1161, 4, 100, 0, 0),
(100787, 1167, 4, 100, 0, 1),
(100805, 1112, 3, 100, 0, 0),
(100805, 1160, 3, 100, 0, 0),
(100842, 1112, 3, 100, 0, 0),
(100980, 1011, 4, 100, 0, 0),
(100982, 1112, 4, 100, 0, 0),
(100982, 1161, 4, 100, 0, 0),
(100982, 1167, 4, 100, 0, 1),
(100983, 1112, 4, 100, 0, 0),
(100983, 1161, 4, 100, 0, 0),
(100983, 1167, 4, 100, 0, 1),
(100984, 1137, 4, 100, 1, 0),
(100984, 1146, 4, 100, 0, 0),
(100984, 1167, 4, 100, 0, 1),
(100985, 1112, 4, 100, 0, 0),
(100985, 1161, 4, 100, 0, 0),
(100985, 1167, 4, 100, 0, 1),
(100986, 1137, 4, 100, 1, 0),
(100986, 1167, 4, 100, 0, 1),
(100987, 1112, 4, 100, 0, 0),
(100987, 1149, 4, 100, 0, 0),
(100987, 1154, 4, 100, 0, 0),
(100987, 1161, 4, 100, 0, 0),
(100987, 1167, 4, 100, 0, 1),
(100988, 1112, 4, 100, 0, 0),
(100988, 1154, 4, 100, 0, 0),
(100988, 1161, 4, 100, 0, 0),
(100988, 1167, 4, 100, 0, 1),
(100989, 1112, 4, 100, 0, 0),
(100989, 1123, 4, 100, 0, 0),
(100989, 1146, 4, 100, 0, 0),
(100989, 1152, 4, 100, 1, 0),
(100989, 1161, 4, 100, 0, 0),
(100989, 1167, 4, 100, 0, 1),
(100996, 1112, 3, 100, 0, 0),
(100996, 1161, 3, 100, 0, 0),
(100997, 1137, 3, 100, 1, 0),
(100998, 1137, 3, 100, 1, 0),
(100999, 1112, 3, 100, 0, 0),
(100999, 1161, 3, 100, 0, 0),
(101000, 1112, 3, 100, 0, 0),
(101000, 1161, 3, 100, 0, 0),
(101001, 1137, 3, 100, 1, 0),
(101002, 1137, 3, 100, 1, 0),
(101002, 1146, 3, 100, 0, 0),
(101003, 1112, 3, 100, 0, 0),
(101003, 1161, 3, 100, 0, 0),
(101004, 1112, 3, 100, 0, 0),
(101004, 1161, 3, 100, 0, 0),
(101005, 1112, 3, 100, 0, 0),
(101005, 1149, 3, 100, 0, 0),
(101005, 1161, 3, 100, 0, 0),
(101020, 1112, 2, 100, 0, 0),
(101020, 1149, 2, 100, 0, 0),
(101021, 1112, 2, 100, 0, 0),
(101021, 1146, 2, 100, 0, 0),
(101021, 1152, 2, 100, 1, 0),
(101022, 1112, 2, 100, 0, 0),
(101023, 1112, 2, 100, 0, 0),
(101023, 1146, 2, 100, 0, 0),
(101024, 1112, 2, 100, 0, 0),
(101024, 1146, 2, 100, 0, 0),
(101025, 1112, 2, 100, 0, 0),
(101025, 1149, 2, 100, 0, 0),
(101026, 1112, 2, 100, 0, 0),
(101293, 1112, 4, 100, 0, 0),
(101293, 1123, 4, 100, 0, 0),
(101293, 1137, 4, 100, 1, 0),
(101293, 1154, 4, 100, 0, 0),
(101293, 1161, 4, 100, 0, 0),
(101293, 1167, 4, 100, 0, 1),
(101294, 1112, 4, 100, 0, 0),
(101294, 1161, 4, 100, 0, 0),
(101294, 1167, 4, 100, 0, 1),
(101295, 1112, 4, 100, 0, 0),
(101295, 1123, 4, 100, 0, 0),
(101295, 1149, 4, 100, 0, 0),
(101295, 1161, 4, 100, 0, 0),
(101295, 1167, 4, 100, 0, 1),
(101296, 1112, 4, 100, 0, 0),
(101296, 1149, 4, 100, 0, 0),
(101296, 1151, 4, 100, 0, 0),
(101296, 1154, 4, 100, 0, 0),
(101296, 1161, 4, 100, 0, 0),
(101296, 1167, 4, 100, 0, 1),
(101297, 1137, 4, 100, 1, 0),
(101297, 1167, 4, 100, 0, 1),
(101298, 1112, 3, 100, 0, 0),
(101298, 1146, 3, 100, 0, 0),
(101298, 1161, 3, 100, 0, 0),
(101299, 1112, 3, 100, 0, 0),
(101299, 1161, 3, 100, 0, 0),
(101300, 1112, 3, 100, 0, 0),
(101300, 1151, 3, 100, 0, 0),
(101300, 1161, 3, 100, 0, 0),
(101301, 1137, 3, 100, 1, 0),
(101301, 1146, 3, 100, 0, 0),
(101301, 1152, 3, 100, 1, 0),
(101315, 1146, 2, 100, 0, 0),
(101315, 1151, 2, 100, 0, 0),
(101316, 1151, 2, 100, 0, 0),
(101320, 1112, 4, 100, 0, 0),
(101320, 1146, 4, 100, 0, 0),
(101320, 1161, 4, 100, 0, 0),
(101320, 1167, 4, 100, 0, 1),
(101321, 1112, 3, 100, 0, 0),
(101321, 1161, 3, 100, 0, 0),
(101553, 1011, 4, 100, 0, 0),
(101566, 1112, 3, 100, 0, 0),
(101566, 1135, 3, 100, 1, 0),
(101566, 1148, 3, 100, 0, 0),
(101566, 1162, 3, 100, 0, 0),
(101567, 1112, 4, 100, 0, 0),
(101567, 1135, 4, 100, 1, 0),
(101567, 1148, 4, 100, 0, 0),
(101567, 1151, 4, 100, 0, 0),
(101567, 1162, 4, 100, 0, 0),
(101567, 1167, 4, 100, 0, 1),
(101589, 1011, 2, 100, 0, 0),
(101592, 1112, 4, 100, 0, 0),
(101592, 1135, 4, 100, 1, 0),
(101592, 1149, 4, 100, 0, 0),
(101592, 1154, 4, 100, 0, 0),
(101592, 1162, 4, 100, 0, 0),
(101592, 1167, 4, 100, 0, 1),
(101593, 1137, 4, 100, 1, 0),
(101593, 1167, 4, 100, 0, 1),
(101594, 1112, 4, 100, 0, 0),
(101594, 1123, 4, 100, 0, 0),
(101594, 1135, 4, 100, 1, 0),
(101594, 1154, 4, 100, 0, 0),
(101594, 1162, 4, 100, 0, 0),
(101594, 1167, 4, 100, 0, 1),
(101595, 1112, 4, 100, 0, 0),
(101595, 1123, 4, 100, 0, 0),
(101595, 1128, 4, 100, 1, 0),
(101595, 1135, 4, 100, 1, 0),
(101595, 1167, 4, 100, 0, 1),
(101596, 1112, 4, 100, 0, 0),
(101596, 1138, 4, 100, 1, 0),
(101596, 1146, 4, 100, 0, 0),
(101596, 1154, 4, 100, 0, 0),
(101596, 1156, 4, 100, 1, 0),
(101596, 1162, 4, 100, 0, 0),
(101596, 1167, 4, 100, 0, 1),
(101597, 1112, 4, 100, 0, 0),
(101597, 1139, 4, 100, 1, 0),
(101597, 1156, 4, 100, 1, 0),
(101597, 1162, 4, 100, 0, 0),
(101597, 1167, 4, 100, 0, 1),
(101598, 1137, 4, 100, 1, 0),
(101598, 1148, 4, 100, 0, 0),
(101599, 1112, 4, 100, 0, 0),
(101599, 1140, 4, 100, 1, 0),
(101599, 1156, 4, 100, 1, 0),
(101599, 1162, 4, 100, 0, 0),
(101599, 1167, 4, 100, 0, 1),
(101600, 1112, 4, 100, 0, 0),
(101600, 1141, 4, 100, 1, 0),
(101600, 1156, 4, 100, 1, 0),
(101600, 1162, 4, 100, 0, 0),
(101600, 1167, 4, 100, 0, 1),
(101601, 1137, 3, 100, 1, 0),
(101602, 1112, 3, 100, 0, 0),
(101602, 1135, 3, 100, 1, 0),
(101602, 1149, 3, 100, 0, 0),
(101602, 1162, 3, 100, 0, 0),
(101603, 1112, 3, 100, 0, 0),
(101603, 1128, 3, 100, 1, 0),
(101603, 1135, 3, 100, 1, 0),
(101603, 1146, 3, 100, 0, 0),
(101603, 1162, 3, 100, 0, 0),
(101604, 1112, 3, 100, 0, 0),
(101604, 1138, 3, 100, 1, 0),
(101604, 1149, 3, 100, 0, 0),
(101604, 1156, 3, 100, 1, 0),
(101604, 1162, 3, 100, 0, 0),
(101605, 1112, 3, 100, 0, 0),
(101605, 1139, 3, 100, 1, 0),
(101605, 1156, 3, 100, 1, 0),
(101605, 1162, 3, 100, 0, 0),
(101606, 1137, 3, 100, 1, 0),
(101606, 1167, 3, 100, 0, 1),
(101607, 1112, 3, 100, 0, 0),
(101607, 1140, 3, 100, 1, 0),
(101607, 1156, 3, 100, 1, 0),
(101607, 1162, 3, 100, 0, 0),
(101608, 1112, 3, 100, 0, 0),
(101608, 1141, 3, 100, 1, 0),
(101608, 1156, 3, 100, 1, 0),
(101608, 1162, 3, 100, 0, 0),
(101619, 1112, 2, 100, 0, 0),
(101619, 1135, 2, 100, 1, 0),
(101619, 1148, 2, 100, 0, 0),
(101620, 1011, 2, 100, 0, 0),
(101627, 1011, 4, 100, 0, 0);