lt 1 год назад
Родитель
Сommit
23a868c12b

+ 72 - 2
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config.go

@@ -638,6 +638,10 @@ var HardMissionTaskList = map[uint32]*HardMissionTaskData{}
 var HardMissionTaskIdList []uint32
 var HardGroupMissionTaskList = map[uint32]*HardMissionTaskData{}
 var HardGroupMissionTaskIdList []uint32
+var Hard2MissionTaskList = map[uint32]*HardMissionTaskData{}
+var Hard2MissionTaskIdList []uint32
+var Hard2GroupMissionTaskList = map[uint32]*HardMissionTaskData{}
+var Hard2GroupMissionTaskIdList []uint32
 var ConvertMainTaskOriginalList = map[uint32]uint32{} //[taskid,originaltask]
 var ConvertDailyTaskScoreRewardList = map[uint32]*CovertTaskScoreData{}
 var ConvertWeekTaskScoreRewardList = map[uint32]*CovertTaskScoreData{}
@@ -650,8 +654,10 @@ const (
 	TASK_TYPE_TODAY  = 4
 	TASK_TYPE_GROWUP = 5
 
-	TASK_TYPE_HARD       = 6
-	TASK_TYPE_HARD_GROUP = 7
+	TASK_TYPE_HARD        = 6
+	TASK_TYPE_HARD_GROUP  = 7
+	TASK_TYPE_HARD2       = 8
+	TASK_TYPE_HARD2_GROUP = 9
 )
 
 func convertTaskCfg() {
@@ -781,6 +787,70 @@ func convertTaskCfg() {
 	sort.Slice(HardGroupMissionTaskIdList, func(i, j int) bool {
 		return HardGroupMissionTaskIdList[i] < HardGroupMissionTaskIdList[j]
 	})
+
+	for _, data := range serverproto.Hard2MissionCfgLoader {
+		convertData := &HardMissionTaskData{
+			TaskId:      uint32(data.MissionID),
+			TaskType:    TASK_TYPE_HARD2,
+			GroupTaskId: uint32(data.GroupID),
+			Condition:   map[int32][]int32{},
+		}
+
+		//任务条件
+		for index, _ := range data.MissionCondition {
+			valueList := strings.Split(data.MissionCondition[index], ":")
+			if len(valueList) >= 2 {
+				taskType, _ := Str2Num(valueList[0])
+				convertData.Condition[int32(taskType)] = append(convertData.Condition[int32(taskType)], int32(taskType))
+				for i := 1; i < len(valueList); i++ {
+					taskValue, _ := Str2Num(valueList[i])
+					convertData.Condition[int32(taskType)] = append(convertData.Condition[int32(taskType)], int32(taskValue))
+				}
+			}
+		}
+
+		//任务奖励
+		for index, _ := range data.Reward {
+			key, value := Str2Res(data.Reward[index])
+			convertData.TaskReward = append(convertData.TaskReward, &serverproto.KeyValueType{
+				Key:   key,
+				Value: value,
+			})
+		}
+
+		for index, _ := range data.GroupReward {
+			key2, value2 := Str2Res(data.GroupReward[index])
+			convertData.GroupTaskReward = append(convertData.GroupTaskReward, &serverproto.KeyValueType{
+				Key:   key2,
+				Value: value2,
+			})
+		}
+		if convertData.TaskType == TASK_TYPE_HARD2 {
+			Hard2MissionTaskIdList = append(Hard2MissionTaskIdList, convertData.TaskId)
+			Hard2MissionTaskList[convertData.TaskId] = convertData
+		}
+		//util.InfoF("groupaward:%v", data.GroupReward)
+		if len(data.GroupReward) > 0 && data.GroupReward[0] != "" {
+			data2 := &HardMissionTaskData{
+				TaskId:          convertData.TaskId,
+				TaskType:        TASK_TYPE_HARD2_GROUP,
+				GroupTaskId:     convertData.GroupTaskId,
+				Condition:       convertData.Condition,
+				TaskReward:      convertData.TaskReward,
+				GroupTaskReward: convertData.GroupTaskReward,
+			}
+			//convertData.TaskId = uint32(data.GroupID)
+			Hard2GroupMissionTaskIdList = append(Hard2GroupMissionTaskIdList, convertData.GroupTaskId)
+			Hard2GroupMissionTaskList[convertData.GroupTaskId] = data2
+			//util.InfoF("groupaward:%v len:%v", convertData, len(data.GroupReward))
+		}
+	}
+	sort.Slice(Hard2MissionTaskIdList, func(i, j int) bool {
+		return Hard2MissionTaskIdList[i] < Hard2MissionTaskIdList[j]
+	})
+	sort.Slice(Hard2GroupMissionTaskIdList, func(i, j int) bool {
+		return Hard2GroupMissionTaskIdList[i] < Hard2GroupMissionTaskIdList[j]
+	})
 	//util.InfoF("len taskId:%v,len task group:%v", len(HardMissionTaskIdList), len(HardGroupMissionTaskIdList))
 	//util.InfoF("task group:%v", HardGroupMissionTaskIdList)
 	for _, data := range serverproto.LineMissionCfgLoader {

+ 1 - 1
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/base_config_global.go

@@ -720,7 +720,7 @@ func convertGlobalCfg() {
 	}
 
 	GlobalGuildKickMemberCount = getGlobalCfgValI(serverproto.GlobalType_Global_Guild_Kick_Max_Count)
-
+	// 0 ,299 ,19999 ,59999
 	GlobalTotalRechargeList = []*serverproto.KeyValueType{}
 	tmpStrList = strings.Split(getGlobalCfgValS(serverproto.GlobalType_Global_TotalRecharge_List), ";")
 	for idx := 0; idx < len(tmpStrList); idx++ {

+ 2 - 0
RO_Server_Trunk-branch_0.1.39/roserver/baseserver/model/orm_common.go

@@ -37,6 +37,8 @@ const (
 	MapRankPrefix = "rank:map"
 	//困难地图通关进度排名
 	MapHardRankPrefix = "rank_hard:map"
+	//噩梦地图通关进度排名
+	MapHard2RankPrefix = "rank_hard2:map"
 	//历史最大战力
 	MaxFightPowerRankPrefix = "rank:fight"
 

+ 6 - 6
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role.go

@@ -55,8 +55,8 @@ type RoleOuter interface {
 	GetClientParam() *NeteaseLogCommonInfo
 	SetClientIP(ip string)
 	GetClientIP() string
-	GetHardFight() bool
-	SetHardFight(b bool)
+	GetHardFight() int
+	SetHardFight(b int)
 	SetYuanRankScore()
 }
 
@@ -498,7 +498,7 @@ type Role struct {
 	reLogin      bool                                //是否是重新登陆
 	isLoad       bool                                //是否已经加载过
 	activeCode   string                              //激活码
-	isHardFight  bool                                //是否是困难模式
+	isHardFight  int                                 //是否是困难模式 //0普通.1困难,2噩梦
 
 	base            *RoleBase    //角色基础信息
 	roleHero        *RoleHero    //伙伴信息
@@ -672,7 +672,7 @@ func (this *Role) GetOpenId() string {
 	return this.openId
 }
 
-func (this *Role) GetHardFight() bool {
+func (this *Role) GetHardFight() int {
 	return this.isHardFight
 }
 func (this *Role) SetSelectZone(selectZone int32) {
@@ -689,7 +689,7 @@ func (this *Role) SetPlatform(platform string) {
 	this.platform = platform
 }
 
-func (this *Role) SetHardFight(b bool) {
+func (this *Role) SetHardFight(b int) {
 	this.isHardFight = b
 }
 func (this *Role) SetYuanRankScore() {
@@ -811,7 +811,7 @@ func (this *Role) SetSelectUUid(id uint64) {
 func (this *Role) SetReLogin(re bool) {
 	this.reLogin = re
 	if re {
-		this.isHardFight = false
+		this.isHardFight = 0
 	}
 }
 func (this *Role) GetRoleBase() *RoleBase {

+ 139 - 15
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role_battle.go

@@ -249,6 +249,8 @@ type RoleBattle struct {
 	mapId          uint32
 	mapLevelHard   uint32 //困难模式
 	mapIdHard      uint32 //困难模式
+	mapLevelHard2  uint32 //噩梦模式
+	mapIdHard2     uint32 //噩梦模式
 	mapRewardCount uint32 //累计的挑战boss成功次数
 	mapRewardId    uint32
 	mapRewardLevel uint32
@@ -262,6 +264,9 @@ type RoleBattle struct {
 	selfHardRank             uint32
 	totalHardRanks           uint32
 	topHardRankList          []*serverproto.RankPlayerInfo
+	selfHard2Rank            uint32
+	totalHard2Ranks          uint32
+	topHard2RankList         []*serverproto.RankPlayerInfo
 	getRankTimeStamp         int64
 	mapLevelChallengeNumList []*serverproto.KeyValueType
 
@@ -326,6 +331,8 @@ func (this *RoleBattle) Load(msg interface{}) bool {
 		this.mapId = proRole.RoleBattle.MapId
 		this.mapLevelHard = proRole.RoleBattle.MapLevelHard
 		this.mapIdHard = proRole.RoleBattle.MapIdHard
+		this.mapLevelHard2 = proRole.RoleBattle.MapLevelHard2
+		this.mapIdHard2 = proRole.RoleBattle.MapIdHard2
 		//累计的挑战boss成功次数
 		this.mapRewardCount = proRole.RoleBattle.RewardMapCount
 		this.mapRewardId = proRole.RoleBattle.RewardMapId
@@ -350,6 +357,11 @@ func (this *RoleBattle) Load(msg interface{}) bool {
 			this.mapIdHard = 1
 			this.SetDirty(true)
 		}
+		if this.mapLevelHard2 == 0 || this.mapIdHard2 == 0 {
+			this.mapLevelHard2 = 1
+			this.mapIdHard2 = 1
+			this.SetDirty(true)
+		}
 		//if this.mapRewardIdHard == 0 || this.mapRewardLevelHard == 0 {
 		//	this.mapRewardIdHard = 1
 		//	this.mapRewardLevelHard = 1
@@ -488,7 +500,9 @@ func (this *RoleBattle) Save() {
 			LastRecordBattleAcceTime: this.lastRecordBattleAcceTime,
 			BattleAcceDuration:       this.battleAcceDuration,
 			MapIdHard:                this.mapIdHard,
+			MapIdHard2:               this.mapIdHard2,
 			MapLevelHard:             this.mapLevelHard,
+			MapLevelHard2:            this.mapLevelHard2,
 			//todo...
 			//MapChallengeNumList: this.mapLevelChallengeNumList, 数据太大后续做优化处理
 		},
@@ -635,10 +649,14 @@ func (this *RoleBattle) changeBattleDataNtf() {
 		QuickBattle:    this.quickBattle,
 		RewardMapCount: this.getMapRewardShowCount(),
 	}
-	if this.role.GetHardFight() {
+	if this.role.GetHardFight() == 1 {
 		ntfMsg.MapId = this.mapIdHard
 		ntfMsg.MapLevel = this.mapLevelHard
 	}
+	if this.role.GetHardFight() == 2 {
+		ntfMsg.MapId = this.mapIdHard2
+		ntfMsg.MapLevel = this.mapLevelHard2
+	}
 	this.role.ReplayGate(ntfMsg, true)
 }
 
@@ -651,11 +669,18 @@ func (this *RoleBattle) changeQuickBattleNtf(errorCode int32, itemList []*server
 }
 
 func (this *RoleBattle) SetMapRank(selfRank, totalRanks uint32, topRankList []*serverproto.RankPlayerInfo, addSystemMsg bool) {
-	if this.role.isHardFight {
+	if this.role.isHardFight == 1 {
 		this.selfHardRank = selfRank
 		this.totalHardRanks = totalRanks
 		this.topHardRankList = topRankList
 
+		//刚打完战斗时,会回调并设置,这边需要重新设置时间
+		this.getRankTimeStamp = util.GetTimeSeconds()
+	} else if this.role.isHardFight == 2 {
+		this.selfHard2Rank = selfRank
+		this.totalHard2Ranks = totalRanks
+		this.topHard2RankList = topRankList
+
 		//刚打完战斗时,会回调并设置,这边需要重新设置时间
 		this.getRankTimeStamp = util.GetTimeSeconds()
 	} else {
@@ -694,6 +719,13 @@ func (this *RoleBattle) GetPassHardBattleIdNum(passBattleId int32) int32 {
 	return 0
 }
 
+func (this *RoleBattle) GetPassHardBattle2IdNum(passBattleId int32) int32 {
+	if this.getLevelId(this.mapIdHard2, this.mapLevelHard2) > passBattleId {
+		return 1
+	}
+	return 0
+}
+
 func (this *RoleBattle) SetIncomeTime(incomeTime uint64) {
 	this.incomeTime = incomeTime
 	this.SetDirty(true)
@@ -781,7 +813,7 @@ func (this *RoleBattle) addHardMapRank(rewardCount uint32, oldMapId, oldMapLevel
 	dbMsg := &serverproto.SSMapLevelChangeReq{
 		NewMapLevelId: uint32(NewMapLevelId),
 		PassTime:      uint64(util.GetTimeMilliseconds()),
-		IsHard:        true,
+		IsHard:        1,
 	}
 
 	dbMsg.RecordInfo = &serverproto.BattleRecordInfo{
@@ -818,6 +850,50 @@ func (this *RoleBattle) addHardMapRank(rewardCount uint32, oldMapId, oldMapLevel
 	this.role.GetRoleBase().SetFightPower(0)
 }
 
+// 噩梦模式
+func (this *RoleBattle) addHard2MapRank(rewardCount uint32, oldMapId, oldMapLevel uint32, passTime uint32, recordTimeStamp uint64) {
+	NewMapLevelId := this.getLevelId(this.mapIdHard2, this.mapLevelHard2)
+	oldMapLevelId := this.getLevelId(oldMapId, oldMapLevel)
+	dbMsg := &serverproto.SSMapLevelChangeReq{
+		NewMapLevelId: uint32(NewMapLevelId),
+		PassTime:      uint64(util.GetTimeMilliseconds()),
+		IsHard:        2,
+	}
+
+	dbMsg.RecordInfo = &serverproto.BattleRecordInfo{
+		Uid:            this.role.GetUUid(),
+		BattleRecordId: model.GenerateUid(),
+		NickName:       this.role.GetNickName(),
+		ImgId:          this.role.GetImageId(),
+		Gender:         this.role.GetRoleBase().GetRoleSex(),
+		Level:          this.role.GetRoleLevel(),
+		ConfigId:       this.role.GetRoleBase().RoleData().HeroData.ConfigId,
+		FightPower:     int32(this.role.roleBattleAttr.curTotalFightPower),
+		//FightPower:     int32(this.role.GetRoleFightPower().TotalFightPower),
+		RecordTime:  recordTimeStamp,
+		BattleTime:  passTime,
+		MapLevelId:  oldMapLevelId,
+		HeadFrameId: this.role.GetRoleBase().RoleData().HeadFrameId,
+	}
+	oldLevelCfgData, ok := serverproto.LevelCfgLoader[oldMapLevelId]
+	if ok {
+		dbMsg.RecordInfo.BattleVersion = oldLevelCfgData.Version
+	}
+
+	this.role.SendRank(dbMsg)
+
+	//this.addMapRewardCount(rewardCount)
+
+	//任务处理
+	//TaskMagCheck(this.role, serverproto.TaskType_Level_Battle_Count, 0)
+	//TaskMagCheck(this.role, serverproto.TaskType_Battle_Boss_Reward_Count, 1)
+	TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle2_Count, 0)
+
+	this.role.GetRoleBase().UpdatePlayerBriefInfo(false)
+
+	this.role.GetRoleBase().SetFightPower(0)
+}
+
 // 收益
 func (this *RoleBattle) Income() serverproto.ErrorCode {
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
@@ -1129,8 +1205,10 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 	//}
 	isHard := this.role.isHardFight
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
-	if isHard {
+	if isHard == 1 {
 		levelId = this.getLevelId(this.mapIdHard, this.mapLevelHard)
+	} else if isHard == 2 {
+		levelId = this.getLevelId(this.mapIdHard2, this.mapLevelHard2)
 	}
 	levelCfgData, ok := serverproto.LevelCfgLoader[levelId]
 	if !ok {
@@ -1145,10 +1223,12 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 	nowTime := util.GetTimeMilliseconds()
 	oldMapId := this.mapId
 	oldMapLevel := this.mapLevel
-	oldHardMapId := this.mapId
-	oldHardMapLevel := this.mapLevel
+	oldHardMapId := this.mapIdHard
+	oldHardMapLevel := this.mapLevelHard
+	oldHard2MapId := this.mapIdHard2
+	oldHard2MapLevel := this.mapLevelHard2
 	var addItemList = map[int32]int32{}
-	if isHard {
+	if isHard == 1 {
 		hardLevelCfgData, ok2 := serverproto.HardLevelCfgLoader[levelId]
 		if !ok2 {
 			return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_DATA_NOT_FOUND
@@ -1175,6 +1255,29 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 		//for idx := 0; idx < len(dropId); idx++ {
 		//	this.DropProcess(addItemList, dropId[idx])
 		//}
+	} else if isHard == 2 {
+		hardLevelCfgData, ok2 := serverproto.Hard2LevelCfgLoader[levelId]
+		if !ok2 {
+			return serverproto.ErrorCode_ERROR_BATTLE_LEVEL_DATA_NOT_FOUND
+		}
+		//baseExp
+		addItemList[int32(serverproto.ResType_Res_RoleBaseExp)] = hardLevelCfgData.BaseExp
+		//伙伴经验
+		addItemList[int32(serverproto.ResType_Res_HeroBaseExp)] = hardLevelCfgData.Parter
+		//jobExp
+		addItemList[int32(serverproto.ResType_Res_RoleJobExp)] = hardLevelCfgData.JobExp
+		//rmb
+		addItemList[int32(serverproto.ResType_Res_Rmb)] = hardLevelCfgData.Gold
+		//通关免费充值额度
+		addItemList[int32(serverproto.ResType_Res_CreditRecharge)] = hardLevelCfgData.FreeInvest
+		//cash//做活动时间判定,活动时间内才给
+		if !this.role.FuncDisable() {
+			if ok := CheckHDItemAdd(int32(serverproto.ResType_Res_CashTicket), this.role); ok && (hardLevelCfgData.Cash != 0) {
+				addItemList[int32(serverproto.ResType_Res_CashTicket)] = hardLevelCfgData.Cash
+			}
+		}
+		//coin
+		addItemList[int32(serverproto.ResType_Res_Coin)] = hardLevelCfgData.Zeny
 	} else {
 		//baseExp
 		addItemList[int32(serverproto.ResType_Res_RoleBaseExp)] = levelCfgData.BaseExp
@@ -1213,19 +1316,27 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 	_, ok1 := serverproto.LevelCfgLoader[levelId+1]
 	if !ok1 {
 		nextLevelId := this.getLevelId(this.mapId+1, 1)
-		if isHard {
+		if isHard == 1 {
 			nextLevelId = this.getLevelId(this.mapIdHard+1, 1)
+		} else if isHard == 2 {
+			nextLevelId = this.getLevelId(this.mapIdHard2+1, 1)
 		}
 		_, ok2 := serverproto.LevelCfgLoader[nextLevelId]
 		if !ok2 {
 			util.WarnF("uid=%v BossReward next level cfg data not found!!!", this.role.GetUUid())
 		} else {
-			if isHard {
+			if isHard == 1 {
 				this.mapIdHard++
 				this.mapLevelHard = 1
 				//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
 				this.addHardMapRank(1, oldHardMapId, oldHardMapLevel, challengeTime, recordTimeStamp)
 				util.InfoF("uid=%v hard BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard+1, 1)
+			} else if isHard == 2 {
+				this.mapIdHard2++
+				this.mapLevelHard2 = 1
+				//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
+				this.addHard2MapRank(1, oldHard2MapId, oldHard2MapLevel, challengeTime, recordTimeStamp)
+				util.InfoF("uid=%v hard2 BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard2+1, 1)
 			} else {
 				this.mapId++
 				this.mapLevel = 1
@@ -1239,11 +1350,16 @@ func (this *RoleBattle) BossReward(challengeTime uint32, mapId, mapLevel uint32,
 			this.changeBattleDataNtf()
 		}
 	} else {
-		if isHard {
+		if isHard == 1 {
 			this.mapLevelHard++
 			//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
 			this.addHardMapRank(1, oldHardMapId, oldHardMapLevel, challengeTime, recordTimeStamp)
 			util.InfoF("uid=%v hard BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard, this.mapLevelHard)
+		} else if isHard == 2 {
+			this.mapLevelHard2++
+			//TaskMagCheck(this.role, serverproto.TaskType_Level_Hard_Battle_Count, 0)
+			this.addHardMapRank(1, oldHard2MapId, oldHard2MapLevel, challengeTime, recordTimeStamp)
+			util.InfoF("uid=%v hard2 BossReward to next mapId=%v level=%v", this.role.GetUUid(), this.mapIdHard2, this.mapLevelHard2)
 		} else {
 			this.mapLevel++
 			//修改地图通关排名(需要通关该关卡)
@@ -1321,8 +1437,11 @@ func (this *RoleBattle) bossRewardCheck(challengeTime uint32, mapId, mapLevel ui
 func (this *RoleBattle) mapFightCheck() serverproto.ErrorCode {
 	//战斗力校验
 	levelId := this.getLevelId(this.mapId, this.mapLevel)
-	if this.role.GetHardFight() {
+	hard := this.role.GetHardFight()
+	if hard == 1 {
 		levelId = this.getLevelId(this.mapIdHard, this.mapLevelHard)
+	} else if hard == 2 {
+		levelId = this.getLevelId(this.mapIdHard2, this.mapLevelHard2)
 	}
 	levelCfgData, ok := serverproto.LevelCfgLoader[levelId]
 	if !ok {
@@ -1396,13 +1515,19 @@ func (this *RoleBattle) DropProcess(dropList map[int32]int32, dropId int32) {
 
 func (this *RoleBattle) GetMapRank() {
 	nowTime := util.GetTimeSeconds()
+	hard := this.role.isHardFight
 	if this.getRankTimeStamp > 0 && (nowTime-this.getRankTimeStamp) < 5 {
 		ackMsg := &serverproto.SCGetMapRankAck{}
-		if this.role.isHardFight {
+		if hard == 1 {
 			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 			ackMsg.SelfRank = this.selfHardRank
 			ackMsg.TotalRank = this.totalHardRanks
 			ackMsg.TopPlayerList = append(this.topHardRankList)
+		} else if hard == 2 {
+			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
+			ackMsg.SelfRank = this.selfHard2Rank
+			ackMsg.TotalRank = this.totalHard2Ranks
+			ackMsg.TopPlayerList = append(this.topHardRankList)
 		} else {
 			ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 			ackMsg.SelfRank = this.selfRank
@@ -1417,9 +1542,8 @@ func (this *RoleBattle) GetMapRank() {
 	this.getRankTimeStamp = nowTime
 	//重新获取排名
 	dbMsg := &serverproto.SSMapLevelChangeReq{}
-	if this.role.isHardFight {
-		dbMsg.IsHard = true
-	}
+	dbMsg.IsHard = int32(hard)
+
 	this.role.SendRank(dbMsg)
 }
 

+ 493 - 22
RO_Server_Trunk-branch_0.1.39/roserver/game/model/role_task.go

@@ -49,12 +49,14 @@ type RoleTask struct {
 	jobCondition []*serverproto.ChangeJob //只针对主角//伙伴转职出案子再做
 	roleHeadCond serverproto.RoleHeadCond
 
-	taskTypeList         map[int32]set.Interface //根据枚举类型对任务做区分[serverproto.TaskType, taslidlist]
-	dailyTaskList        map[uint32]*serverproto.TaskData
-	weekTaskList         map[uint32]*serverproto.TaskData
-	mainTaskList         map[uint32]*serverproto.TaskData
-	mapHardTaskList      map[uint32]*serverproto.TaskData //困难模式任务
-	mapGroupHardTaskList map[uint32]*serverproto.TaskData //困难模式组任务
+	taskTypeList          map[int32]set.Interface //根据枚举类型对任务做区分[serverproto.TaskType, taslidlist]
+	dailyTaskList         map[uint32]*serverproto.TaskData
+	weekTaskList          map[uint32]*serverproto.TaskData
+	mainTaskList          map[uint32]*serverproto.TaskData
+	mapHardTaskList       map[uint32]*serverproto.TaskData //困难模式任务
+	mapGroupHardTaskList  map[uint32]*serverproto.TaskData //困难模式组任务
+	mapHard2TaskList      map[uint32]*serverproto.TaskData //噩梦模式任务
+	mapGroupHard2TaskList map[uint32]*serverproto.TaskData //噩梦模式组任务
 
 	dailyTaskScore serverproto.KeyValueType //活跃度/活跃度对应的奖励,按位处理(完成任务累加的积分)
 	weekTaskScore  serverproto.KeyValueType
@@ -72,12 +74,14 @@ func newRoleTask(r *Role) *RoleTask {
 		SaveObject: SaveObject{
 			role: r,
 		},
-		loadTaskData:         &serverproto.RoleTask{},
-		dailyTaskList:        map[uint32]*serverproto.TaskData{},
-		weekTaskList:         map[uint32]*serverproto.TaskData{},
-		mainTaskList:         map[uint32]*serverproto.TaskData{},
-		mapHardTaskList:      map[uint32]*serverproto.TaskData{},
-		mapGroupHardTaskList: map[uint32]*serverproto.TaskData{},
+		loadTaskData:          &serverproto.RoleTask{},
+		dailyTaskList:         map[uint32]*serverproto.TaskData{},
+		weekTaskList:          map[uint32]*serverproto.TaskData{},
+		mainTaskList:          map[uint32]*serverproto.TaskData{},
+		mapHardTaskList:       map[uint32]*serverproto.TaskData{},
+		mapGroupHardTaskList:  map[uint32]*serverproto.TaskData{},
+		mapHard2TaskList:      map[uint32]*serverproto.TaskData{},
+		mapGroupHard2TaskList: map[uint32]*serverproto.TaskData{},
 
 		taskTypeList: map[int32]set.Interface{},
 		recTypeCnt:   map[int32]*serverproto.KeyValueType{},
@@ -127,8 +131,12 @@ func (this *RoleTask) Load(msg interface{}) bool {
 					this.mainTaskList[taskInfo.TaskId] = taskInfo
 				} else if taskInfo.TaskType == model.TASK_TYPE_HARD {
 					this.mapHardTaskList[taskInfo.TaskId] = taskInfo
+				} else if taskInfo.TaskType == model.TASK_TYPE_HARD2 {
+					this.mapHard2TaskList[taskInfo.TaskId] = taskInfo
 				} else if taskInfo.TaskType == model.TASK_TYPE_HARD_GROUP {
 					this.mapGroupHardTaskList[taskInfo.TaskId] = taskInfo
+				} else if taskInfo.TaskType == model.TASK_TYPE_HARD2_GROUP {
+					this.mapGroupHard2TaskList[taskInfo.TaskId] = taskInfo
 				}
 			}
 			//util.InfoF("qqqqqq:%v bbbbbb:%v", this.mapHardTaskList, this.mapGroupHardTaskList)
@@ -214,7 +222,14 @@ func (this *RoleTask) CopyData() *serverproto.RoleTask {
 	for _, val := range this.mapGroupHardTaskList {
 		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
 	}
-	util.InfoF("send task group:%v task:%v all task:%v", this.mapGroupHardTaskList, this.mapHardTaskList, tmpRoleTask.TaskList)
+	for _, val := range this.mapHard2TaskList {
+		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
+	}
+
+	for _, val := range this.mapGroupHard2TaskList {
+		tmpRoleTask.TaskList = append(tmpRoleTask.TaskList, val)
+	}
+	util.DebugF("send task group:%v task:%v all task:%v", this.mapGroupHardTaskList, this.mapHardTaskList, tmpRoleTask.TaskList)
 
 	for _, val := range this.recTypeCnt {
 		tmpRoleTask.TypeRecCount = append(tmpRoleTask.TypeRecCount, val)
@@ -399,7 +414,7 @@ func (this *RoleTask) initTaskDataFromConfig() {
 			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		}
 	}
-	util.InfoF("uuid:%v init hard task2:%v", this.role.GetUUid(), this.mapHardTaskList)
+	//util.InfoF("uuid:%v init hard task2:%v", this.role.GetUUid(), this.mapHardTaskList)
 
 	var curGroupId uint32
 	if len(this.mapGroupHardTaskList) > 0 {
@@ -431,10 +446,71 @@ func (this *RoleTask) initTaskDataFromConfig() {
 			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		}
 	}
+	curId = 0
+	if len(this.mapHard2TaskList) > 0 {
+		for _, v := range this.mapHard2TaskList {
+			if curId <= v.TaskId {
+				curId = v.TaskId
+			}
+		}
+	}
+	for _, val := range model.Hard2MissionTaskIdList {
+		//每组任务3个,目前只初始化5组所以是15个任务
+		if len(this.mapHard2TaskList) >= 15 {
+			break
+		}
+		if val < curId {
+			continue
+		}
+		bSave = true
+		data := model.Hard2MissionTaskList[val]
+		if data != nil {
+			taskInfo := &serverproto.TaskData{
+				TaskId: data.TaskId,
+				State:  TASK_REWARD_STATE_NONE,
+				//BeginTime: util.GetTimeMilliseconds(),
+				TaskType: data.TaskType,
+			}
+			this.mapHard2TaskList[data.TaskId] = taskInfo
+			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		}
+	}
+	util.InfoF("uuid:%v init hard2 task2:%v", this.role.GetUUid(), this.mapHard2TaskList)
+
+	curGroupId = 0
+	if len(this.mapGroupHard2TaskList) > 0 {
+		for _, v := range this.mapGroupHard2TaskList {
+			if curGroupId <= v.TaskId {
+				curGroupId = v.TaskId
+			}
+		}
+	}
+	//util.InfoF("uuid:%v init hard task group1:%v", this.role.GetUUid(), this.mapGroupHardTaskList)
+	for _, val := range model.Hard2GroupMissionTaskIdList {
+		//初始化5组 组任务
+		if len(this.mapGroupHard2TaskList) >= 5 {
+			break
+		}
+		if val < curGroupId {
+			continue
+		}
+		bSave = true
+		data := model.Hard2GroupMissionTaskList[val]
+		if data != nil {
+			taskInfo := &serverproto.TaskData{
+				TaskId: data.GroupTaskId,
+				State:  TASK_REWARD_STATE_NONE,
+				//BeginTime: util.GetTimeMilliseconds(),
+				TaskType: data.TaskType,
+			}
+			this.mapGroupHard2TaskList[data.GroupTaskId] = taskInfo
+			this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		}
+	}
 	if bSave {
 		this.SetDirty(true)
 	}
-	util.InfoF("uuid:%v init hard task group2:%v", this.role.GetUUid(), this.mapGroupHardTaskList)
+	util.InfoF("uuid:%v init hard task2 group2:%v", this.role.GetUUid(), this.mapGroupHard2TaskList)
 }
 
 func (this *RoleTask) getTaskData(taskId uint32) *serverproto.TaskData {
@@ -463,6 +539,16 @@ func (this *RoleTask) getTaskHardAllData(taskId uint32) *serverproto.TaskData {
 	return nil
 }
 
+func (this *RoleTask) getTaskHard2AllData(taskId uint32) *serverproto.TaskData {
+	if taskInfo, ok := this.mapHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	if taskInfo, ok := this.mapGroupHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	return nil
+}
+
 func (this *RoleTask) getTaskHardData(taskId uint32) *serverproto.TaskData {
 	if taskInfo, ok := this.mapHardTaskList[taskId]; ok {
 		return taskInfo
@@ -477,6 +563,20 @@ func (this *RoleTask) getGroupTaskHardData(taskId uint32) *serverproto.TaskData
 	return nil
 }
 
+func (this *RoleTask) getTaskHard2Data(taskId uint32) *serverproto.TaskData {
+	if taskInfo, ok := this.mapHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	return nil
+}
+
+func (this *RoleTask) getGroupTaskHard2Data(taskId uint32) *serverproto.TaskData {
+	if taskInfo, ok := this.mapGroupHard2TaskList[taskId]; ok {
+		return taskInfo
+	}
+	return nil
+}
+
 func (this *RoleTask) initTaskTypeList() {
 	if len(this.taskTypeList) <= 0 {
 		//dailyTaskList
@@ -554,6 +654,38 @@ func (this *RoleTask) initTaskTypeList() {
 				this.taskTypeList[key].Add(taskInfo.TaskId)
 			}
 		}
+
+		for _, taskInfo := range this.mapHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2MissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
+
+		for _, taskInfo := range this.mapGroupHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2GroupMissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
 	}
 }
 
@@ -606,6 +738,46 @@ func (this *RoleTask) TaskCheck(taskType serverproto.TaskType, count int32) {
 						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
 
+						this.SetDirty(true)
+					}
+				}
+			}
+		} else if taskType == serverproto.TaskType_Level_Hard_Battle2_Count {
+			if taskInfo := this.getTaskHard2AllData(tmpTaskId); taskInfo != nil {
+				if taskInfo.TaskType == model.TASK_TYPE_HARD2 {
+					convertTaskData, ok := model.Hard2MissionTaskList[taskInfo.TaskId]
+					if !ok {
+						util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
+						continue
+					}
+					if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
+						taskInfo.State != TASK_REWARD_STATE_REWARD {
+						util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
+					}
+					//多条件处理
+					ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
+					if ret {
+						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+
+						this.SetDirty(true)
+					}
+				} else if taskInfo.TaskType == model.TASK_TYPE_HARD2_GROUP {
+					convertTaskData, ok := model.Hard2GroupMissionTaskList[taskInfo.TaskId]
+					if !ok {
+						util.ErrorF("uid=%v TaskCheck TaskCfgData not exist", this.role.GetUUid(), taskInfo)
+						continue
+					}
+					if taskInfo.State != TASK_REWARD_STATE_COMPLETED &&
+						taskInfo.State != TASK_REWARD_STATE_REWARD {
+						util.InfoF("uid=%v TaskCheck before taskInfo=%v", this.role.GetUUid(), taskInfo)
+					}
+					//多条件处理
+					ret := TaskConditionCheck(this.role, taskInfo, taskType, convertTaskData.Condition, count, false)
+					if ret {
+						this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+						ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+
 						this.SetDirty(true)
 					}
 				}
@@ -636,6 +808,9 @@ func (this *RoleTask) TaskCheck(taskType serverproto.TaskType, count int32) {
 	if taskType == serverproto.TaskType_Level_Hard_Battle_Count {
 		this.AddHardTask()
 	}
+	if taskType == serverproto.TaskType_Level_Hard_Battle2_Count {
+		this.AddHard2Task()
+	}
 	if len(ntfMsg.TaskChangeList) > 0 {
 		this.role.ReplayGate(ntfMsg, true)
 		util.InfoF("uid=%v TaskCheck changelist=%v", this.role.GetUUid(), ntfMsg.TaskChangeList)
@@ -903,7 +1078,146 @@ func (this *RoleTask) AddHardTask() bool {
 
 		this.role.ReplayGate(ntfMsg, true)
 		this.role.roleTask.SetDirty(true)
-		util.InfoF("uuid:%v add start hard group taskId:%v  little taskId:%v task info:%v  group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
+		//util.InfoF("uuid:%v add start hard group taskId:%v  little taskId:%v task info:%v  group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
+		if len(ntfMsg.TaskChangeList) > 0 {
+			return true
+		} else {
+			return false
+		}
+	}
+	return false
+}
+
+func (this *RoleTask) AddHard2Task() bool {
+	var (
+		count2     int32  //未完成任务组数量
+		maxGroupId uint32 //最后一组 组id
+		//ggId       uint32
+	)
+
+	for _, v := range this.mapGroupHard2TaskList {
+		if v.State == TASK_REWARD_STATE_NONE {
+			count2++
+			//if maxGroupId < v.TaskId {
+			//	maxGroupId = v.TaskId
+			//}
+			break
+		}
+		if maxGroupId < v.TaskId {
+			maxGroupId = v.TaskId
+		}
+	}
+
+	if count2 < 1 {
+		////一下全部完成了任务
+		//if maxGroupId == 0 {
+		//	maxGroupId = ggId
+		//}
+		var (
+			count3 int32
+			count4 int32
+			maxId  uint32 //最后一个小任务id
+		)
+		if v, ok := model.Hard2GroupMissionTaskList[maxGroupId]; ok {
+			maxId = v.TaskId
+		}
+		ntfMsg := &serverproto.SCTaskChangeNtf{
+			DailyTaskScore: &this.dailyTaskScore,
+			WeekTaskScore:  &this.weekTaskScore,
+		}
+		for _, val := range model.Hard2GroupMissionTaskIdList {
+			//初始化5组 组任务
+			if count3 >= 5 {
+				break
+			}
+			if val <= maxGroupId {
+				continue
+			}
+			data := model.Hard2GroupMissionTaskList[val]
+			if data != nil {
+				taskInfo := &serverproto.TaskData{
+					TaskId: data.GroupTaskId,
+					State:  TASK_REWARD_STATE_NONE,
+					//BeginTime: util.GetTimeMilliseconds(),
+					TaskType: data.TaskType,
+				}
+				passNum := this.role.GetRoleBattle().GetPassHardBattle2IdNum(data.Condition[int32(serverproto.TaskType_Level_Hard_Battle2_Count)][1])
+				if passNum == 1 {
+					taskInfo.State = TASK_REWARD_STATE_COMPLETED
+					taskInfo.Progress = []*serverproto.TaskProgressType{{Key: 102, Value: 1, State: 1}}
+				}
+				this.mapGroupHard2TaskList[data.GroupTaskId] = taskInfo
+				//role.roleTask.loadTaskData.TaskList = append(role.roleTask.loadTaskData.TaskList, taskInfo)
+				this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+				ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+				//util.InfoF("add task gg:%v", taskInfo)
+				count3++
+			}
+		}
+		for _, val := range model.Hard2MissionTaskIdList {
+			//每组任务3个,目前只初始化5组所以是15个任务
+			if count4 >= 15 {
+				break
+			}
+			if val <= maxId {
+				continue
+			}
+			data := model.Hard2MissionTaskList[val]
+			if data != nil {
+				taskInfo := &serverproto.TaskData{
+					TaskId: data.TaskId,
+					State:  TASK_REWARD_STATE_NONE,
+					//BeginTime: util.GetTimeMilliseconds(),
+					TaskType: data.TaskType,
+				}
+				passNum := this.role.GetRoleBattle().GetPassHardBattle2IdNum(data.Condition[int32(serverproto.TaskType_Level_Hard_Battle2_Count)][1])
+				if passNum == 1 {
+					taskInfo.State = TASK_REWARD_STATE_COMPLETED
+					taskInfo.Progress = []*serverproto.TaskProgressType{{Key: 102, Value: 1, State: 1}}
+				}
+				this.mapHard2TaskList[data.TaskId] = taskInfo
+				//this.loadTaskData.TaskList = append(this.loadTaskData.TaskList, taskInfo)
+				this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+				ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, taskInfo)
+				//util.InfoF("add task gg2:%v", taskInfo)
+				count4++
+			}
+		}
+		for _, taskInfo := range this.mapHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2MissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
+
+		for _, taskInfo := range this.mapGroupHard2TaskList {
+			if taskInfo.State == TASK_REWARD_STATE_COMPLETED {
+				continue
+			}
+			convertData, ok := model.Hard2GroupMissionTaskList[taskInfo.TaskId]
+			if !ok {
+				continue
+			}
+			for key := range convertData.Condition {
+				if _, ok := this.taskTypeList[key]; !ok {
+					this.taskTypeList[key] = set.New(set.NonThreadSafe)
+				}
+				this.taskTypeList[key].Add(taskInfo.TaskId)
+			}
+		}
+
+		this.role.ReplayGate(ntfMsg, true)
+		this.role.roleTask.SetDirty(true)
+		//util.InfoF("uuid:%v add start hard2 group taskId:%v  little taskId:%v task info:%v  group info:%v", this.role.GetUUid(), maxGroupId, maxId, this.role.roleTask.mapHardTaskList, this.role.roleTask.mapGroupHardTaskList)
 		if len(ntfMsg.TaskChangeList) > 0 {
 			return true
 		} else {
@@ -1035,6 +1349,59 @@ func (this *RoleTask) GetTaskScoreReward(rewardType, rewardIdx uint32) serverpro
 		taskInfo.State = TASK_REWARD_STATE_REWARD
 		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
 		this.SetDirty(true)
+	} else if rewardType == model.TASK_TYPE_HARD2 {
+		taskInfo := this.getTaskHard2Data(rewardIdx)
+		if taskInfo == nil {
+			return serverproto.ErrorCode_ERROR_FAIL
+		}
+		if taskInfo.State == TASK_REWARD_STATE_REWARD || taskInfo.State == TASK_REWARD_STATE_NONE {
+			return serverproto.ErrorCode_ERROR_TASK_REWARDED
+		}
+		convertData, ok := model.Hard2MissionTaskList[rewardIdx]
+		if !ok {
+			return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
+		}
+		for _, value := range convertData.TaskReward {
+			addItemList[value.Key] = value.Value
+		}
+		if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
+			return ret
+		}
+		taskInfo.State = TASK_REWARD_STATE_REWARD
+		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		this.SetDirty(true)
+	} else if rewardType == model.TASK_TYPE_HARD2_GROUP {
+		taskInfo := this.getGroupTaskHard2Data(rewardIdx)
+		if taskInfo == nil {
+			return serverproto.ErrorCode_ERROR_FAIL
+		}
+		if taskInfo.State == TASK_REWARD_STATE_REWARD || taskInfo.State == TASK_REWARD_STATE_NONE {
+			return serverproto.ErrorCode_ERROR_TASK_REWARDED
+		}
+		convertData, ok := model.Hard2GroupMissionTaskList[rewardIdx]
+		if !ok {
+			return serverproto.ErrorCode_ERROR_ROLE_TASK_SCORE_NOT_FOUND
+		}
+		//没找到这组的奖励
+		if len(convertData.GroupTaskReward) == 0 {
+			for _, v := range model.HardMissionTaskList {
+				if v.GroupTaskId == convertData.GroupTaskId {
+					if len(v.GroupTaskReward) != 0 {
+						convertData.GroupTaskReward = v.GroupTaskReward
+						break
+					}
+				}
+			}
+		}
+		for _, value := range convertData.GroupTaskReward {
+			addItemList[value.Key] = value.Value
+		}
+		if ret := this.role.CanAddItemList(addItemList); ret != serverproto.ErrorCode_ERROR_OK {
+			return ret
+		}
+		taskInfo.State = TASK_REWARD_STATE_REWARD
+		this.saveTaskDataList = append(this.saveTaskDataList, taskInfo)
+		this.SetDirty(true)
 	}
 	for key, val := range addItemList {
 		ackMsg.ItemList = append(ackMsg.ItemList, &serverproto.KeyValueType{
@@ -1047,18 +1414,27 @@ func (this *RoleTask) GetTaskScoreReward(rewardType, rewardIdx uint32) serverpro
 		DailyTaskScore: &this.dailyTaskScore,
 		WeekTaskScore:  &this.weekTaskScore,
 	}
-	if rewardType == model.TASK_TYPE_HARD {
+	switch rewardType {
+	case model.TASK_TYPE_HARD:
 		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getTaskHardData(rewardIdx))
-	}
-	if rewardType == model.TASK_TYPE_HARD_GROUP {
+	case model.TASK_TYPE_HARD_GROUP:
 		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getGroupTaskHardData(rewardIdx))
+	case model.TASK_TYPE_HARD2:
+		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getTaskHard2Data(rewardIdx))
+	case model.TASK_TYPE_HARD2_GROUP:
+		ntfMsg.TaskChangeList = append(ntfMsg.TaskChangeList, this.getGroupTaskHard2Data(rewardIdx))
 	}
 	this.role.ReplayGate(ntfMsg, true)
-	if rewardType == model.TASK_TYPE_HARD {
+
+	switch rewardType {
+	case model.TASK_TYPE_HARD:
 		this.CheckHardTaskAndDelete(rewardIdx)
-	}
-	if rewardType == model.TASK_TYPE_HARD_GROUP {
+	case model.TASK_TYPE_HARD_GROUP:
 		this.CheckHardGroupTaskAndDelete(rewardIdx)
+	case model.TASK_TYPE_HARD2:
+		this.CheckHard2TaskAndDelete(rewardIdx)
+	case model.TASK_TYPE_HARD2_GROUP:
+		this.CheckHard2GroupTaskAndDelete(rewardIdx)
 	}
 	this.role.AddItemList(addItemList, AddFrom_Task, true)
 	this.role.ReplayGate(ackMsg, true)
@@ -1108,6 +1484,46 @@ func (this *RoleTask) CheckHardGroupTaskAndDelete(groupTaskId uint32) {
 	}
 }
 
+func (this *RoleTask) CheckHard2GroupTaskAndDelete(groupTaskId uint32) {
+	groupTask := this.getGroupTaskHard2Data(groupTaskId)
+	isDelete := true
+	list := make([]uint32, 0)
+	for _, v := range this.mapHard2TaskList {
+		if v2, ok := model.Hard2MissionTaskList[v.TaskId]; ok {
+			if v2.GroupTaskId == groupTask.TaskId {
+				list = append(list, v.TaskId)
+				if v.State != TASK_REWARD_STATE_REWARD {
+					isDelete = false
+					break
+				}
+			}
+		}
+	}
+	if isDelete {
+		//最后一组任务删除前新增任务
+		if len(this.mapGroupHard2TaskList) == 1 {
+			if !this.AddHard2Task() {
+				return
+			}
+
+		}
+		for _, v := range list {
+			task := this.getTaskHard2Data(v)
+			task.HardState = TASK_REWARD_STATE_DELETE
+			this.saveTaskDataList = append(this.saveTaskDataList, task)
+			delete(this.mapHard2TaskList, v)
+		}
+		task2 := this.getGroupTaskHard2Data(groupTaskId)
+		if task2 != nil {
+			task2.HardState = TASK_REWARD_STATE_DELETE
+		}
+		this.saveTaskDataList = append(this.saveTaskDataList, task2)
+		this.SetDirty(true)
+		delete(this.mapGroupHard2TaskList, groupTaskId)
+		util.InfoF("uuid:%v delete groupId2:%v saveTask:%v ", this.role.GetUUid(), groupTaskId, this.saveTaskDataList)
+	}
+}
+
 func (this *RoleTask) CheckHardTaskAndDelete(TaskId uint32) {
 
 	var (
@@ -1163,6 +1579,61 @@ func (this *RoleTask) CheckHardTaskAndDelete(TaskId uint32) {
 	}
 }
 
+func (this *RoleTask) CheckHard2TaskAndDelete(TaskId uint32) {
+
+	var (
+		groupId     uint32
+		isOver      bool
+		isGroupOver bool
+	)
+	list := make([]uint32, 0)
+	if g, ok := model.Hard2MissionTaskList[TaskId]; ok {
+		groupId = g.GroupTaskId
+	}
+	if v, ok := this.mapGroupHard2TaskList[groupId]; ok {
+		if v.State != TASK_REWARD_STATE_REWARD {
+			isGroupOver = true
+		}
+	}
+	for _, v := range this.mapHard2TaskList {
+		if v2, ok := model.Hard2MissionTaskList[v.TaskId]; ok {
+			if v2.GroupTaskId == groupId {
+				list = append(list, v.TaskId)
+				if v.State != TASK_REWARD_STATE_REWARD {
+					isOver = true
+					break
+				}
+			}
+		}
+	}
+	if !isOver && !isGroupOver {
+		//for _, v := range list {
+		//	delete(this.mapHardTaskList, v)
+		//}
+		//delete(this.mapGroupHardTaskList, groupId)
+		//最后一组任务不删除
+		if len(this.mapGroupHard2TaskList) == 1 {
+			if !this.AddHard2Task() {
+				return
+			}
+		}
+		for _, v := range list {
+			task := this.getTaskHard2Data(v)
+			task.HardState = TASK_REWARD_STATE_DELETE
+			this.saveTaskDataList = append(this.saveTaskDataList, task)
+			delete(this.mapHard2TaskList, v)
+		}
+		task2 := this.getGroupTaskHard2Data(groupId)
+		if task2 != nil {
+			task2.HardState = TASK_REWARD_STATE_DELETE
+		}
+		this.saveTaskDataList = append(this.saveTaskDataList, task2)
+		delete(this.mapGroupHard2TaskList, groupId)
+		this.SetDirty(true)
+		util.InfoF("uuid:%v delete groupId2:%v hard2 task:%v ", this.role.GetUUid(), groupId, list)
+	}
+}
+
 // 来自上一个任务的继承数值preTaskCount
 func (this *RoleTask) genNextTask(nextTaskId uint32, preTaskCount int32) *serverproto.TaskData {
 	convertTaskData, ok := model.ConvertTaskList[nextTaskId]

+ 9 - 0
RO_Server_Trunk-branch_0.1.39/roserver/game/model/task_manager.go

@@ -183,6 +183,15 @@ func conditionCheck(role *Role, taskData *serverproto.TaskData, taskType serverp
 		//todo...关卡通关次数会在battle结构中做记录
 		passNum := role.GetRoleBattle().GetPassHardBattleIdNum(passBattleId)
 		return changeTaskProgressSet(&taskData.Progress, passNum, int32(taskType), targetNum)
+	case serverproto.TaskType_Level_Hard_Battle2_Count:
+		passBattleId := conditionList[1]
+		var targetNum int32 = 1
+		if len(conditionList) >= 3 {
+			targetNum = conditionList[2]
+		}
+		//todo...关卡通关次数会在battle结构中做记录
+		passNum := role.GetRoleBattle().GetPassHardBattle2IdNum(passBattleId)
+		return changeTaskProgressSet(&taskData.Progress, passNum, int32(taskType), targetNum)
 		// 总战力达到指定数值
 	case serverproto.TaskType_Total_Power:
 		targetNum := conditionList[1]

+ 1 - 1
RO_Server_Trunk-branch_0.1.39/roserver/game/msg/login_msg.go

@@ -65,7 +65,7 @@ func init() {
 		role.SetPlatform(msg.Platform)
 		role.SetClientIP(msg.Ip)
 		role.SetSelectZone(msg.SelectZone) //客户端登陆时选择的服务器zone
-		role.SetHardFight(false)
+		role.SetHardFight(0)
 
 		//利用缓存数据
 		if bHas {

+ 9 - 4
RO_Server_Trunk-branch_0.1.39/roserver/game/msg/role_msg.go

@@ -1121,16 +1121,21 @@ func init() {
 		}
 		//转为困难模式
 		if msg.Type == 1 {
-			if role.GetHardFight() {
+			if role.GetHardFight() == 1 {
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
 			}
-			role.SetHardFight(true)
+			role.SetHardFight(1)
 			//ackMsg.Type = role.GetHardFightHigh()
 		} else if msg.Type == 0 { //转为普通模式
-			if !role.GetHardFight() {
+			if role.GetHardFight() == 0 {
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
 			}
-			role.SetHardFight(false)
+			role.SetHardFight(0)
+		} else if msg.Type == 2 { //噩梦模式
+			if role.GetHardFight() == 2 {
+				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_FAIL)
+			}
+			role.SetHardFight(2)
 		}
 		util.InfoF("uid=%v cliId=%v receive CSMapLevelTypeChangeReq msg=%v", role.GetUUid(), cliId, msg)
 		role.ReplayGate(ackMsg, true)

+ 102 - 0
RO_Server_Trunk-branch_0.1.39/roserver/rank/model/rank_map.go

@@ -28,6 +28,7 @@ const (
 
 var MapRankTopThree []*serverproto.RankPlayerInfo
 var MapHardRankTopThree []*serverproto.RankPlayerInfo
+var MapHard2RankTopThree []*serverproto.RankPlayerInfo
 
 // zSet rank
 // https://www.jianshu.com/p/2cbf358b933b
@@ -134,6 +135,57 @@ func AddHardMapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo
 	return uint32(selfRank), uint32(rankList), 0
 }
 
+func AddHard2MapRank(uid uint64, newMapLevel uint32, passTime uint64, recordInfo *serverproto.BattleRecordInfo) (uint32, uint32, uint64) {
+	if uid <= 0 {
+		return 0, 0, 0
+	}
+
+	//score
+	scoreStr := getRankScore(uint64(newMapLevel), passTime)
+	//uid
+	keyStr := strconv.FormatUint(uid, 10)
+
+	//todo... 通过多命令方式处理
+	_, err := service.GetRedis().ZAdd(model2.MapHard2RankPrefix, redis.Z{Score: float64(scoreStr), Member: keyStr}).Result()
+	if err != nil {
+		util.ErrorF("AddMapRank err=%v uid=%v", err, uid)
+		return 0, 0, 0
+	}
+
+	//util.InfoF("[AddMapRank] ret:%v %v %v", ret, scoreStr, keyStr)
+	//retRank,err1 := service.GetRedis().ZRevRange(MapRankPrefix, 0, -1).Result()
+	//if err1 == nil {
+	//	util.DebugF("[AddMapRank] rankList:%v", retRank)
+	//}
+
+	selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHard2RankPrefix, keyStr).Result()
+	if err2 != nil {
+		util.DebugF("AddMapRank selfRank err=%v uid=%v", err2, uid)
+		return 0, 0, 0
+	}
+	util.DebugF("AddMapRank selfRank=%v uid=%v score=%v", selfRank+1, uid, scoreStr)
+
+	rankList, err3 := service.GetRedis().ZCard(model2.MapHard2RankPrefix).Result()
+	if err3 != nil {
+		util.DebugF("AddMapRank totalRanks err=%v uid=%v", err2, uid)
+		return 0, 0, 0
+	}
+	util.DebugF("AddMapRank totalRanks=%v uid=%v", rankList, uid)
+
+	////记录战斗回复记录数据(不包括战斗过程记录)
+	//recordId := battleRecord(uid, int32(selfRank), recordInfo)
+	//if recordId > 0 {
+	//	service.GetRedis().SAdd(model2.BattleRecordDetailCheckPrefix, recordId)
+	//}
+
+	//如果自己在前3名内,重新获取排名前3的玩家列表
+	if selfRank < MAPRANK_TOP_3 {
+		getTop3MapHard2Rank()
+	}
+
+	return uint32(selfRank), uint32(rankList), 0
+}
+
 func GetMapRank(uid uint64) (uint32, uint32) {
 	//获取排名前3的玩家列表
 	//if len(MapRankTopThree) <= 0 {
@@ -190,6 +242,34 @@ func GetMapHardRank(uid uint64) (uint32, uint32) {
 	return uint32(selfRank), uint32(rankList)
 }
 
+func GetMapHard2Rank(uid uint64) (uint32, uint32) {
+	//获取排名前3的玩家列表
+	//if len(MapRankTopThree) <= 0 {
+	//	getTop3MapRank()
+	//}
+	//暂时处理成每次重新获取,因为简介信息可能发生变化
+	getTop3MapHard2Rank()
+
+	//uid
+	keyStr := strconv.FormatUint(uid, 10)
+
+	selfRank, err2 := service.GetRedis().ZRevRank(model2.MapHard2RankPrefix, keyStr).Result()
+	if err2 != nil {
+		util.DebugF("uid=%v GetMapRank selfRank keystr=%v err=%v", uid, model2.MapHard2RankPrefix, err2)
+		return 0, 0
+	}
+	util.DebugF("uid=%v GetMapRank keystr=%v selfRank=%v", uid, model2.MapHard2RankPrefix, selfRank+1)
+
+	rankList, err3 := service.GetRedis().ZCard(model2.MapHard2RankPrefix).Result()
+	if err3 != nil {
+		util.DebugF("uid=%v GetMapRank keystr=%v totalRanks err=%v", uid, model2.MapHard2RankPrefix, err2)
+		return 0, 0
+	}
+	util.DebugF("uid=%v GetMapRank keystr=%v totalRanks=%v", uid, model2.MapHard2RankPrefix, rankList)
+
+	return uint32(selfRank), uint32(rankList)
+}
+
 func GetRankByKeyUid(KeyStr string, uid uint64, compId int32) (uint32, uint32, uint32) {
 	//uid
 	uidStr := strconv.FormatUint(uid, 10)
@@ -335,6 +415,28 @@ func getTop3MapHardRank() {
 	}
 }
 
+func getTop3MapHard2Rank() {
+	//topList,err4 := service.GetRedis().ZRevRange(MapRankPrefix, 0, MAPRANK_TOP_3 -1).Result()
+	topListWithScore, err4 := service.GetRedis().ZRevRangeWithScores(model2.MapHard2RankPrefix, 0, MAPRANK_TOP_3-1).Result()
+	if err4 == nil {
+		MapHard2RankTopThree = MapHard2RankTopThree[:0]
+		for index, _ := range topListWithScore {
+			rankUid, _ := strconv.ParseUint(topListWithScore[index].Member.(string), 10, 64)
+			mapId, mapLevel, _ := getValByRankScore(topListWithScore[index].Score)
+			topRankPlayer := &serverproto.RankPlayerInfo{
+				Uid:      rankUid,
+				MapId:    mapId,
+				MapLevel: mapLevel,
+				Brief:    &serverproto.CommonPlayerBriefInfo{},
+			}
+
+			//获取top rank player nickName
+			model.GetSystemDataFromRedis(model.RolePlayerBriefPrefix, rankUid, topRankPlayer.Brief)
+			MapHard2RankTopThree = append(MapHard2RankTopThree, topRankPlayer)
+		}
+	}
+}
+
 func battleRecord(uid uint64, selfRank int32, recordInfo *serverproto.BattleRecordInfo) uint64 {
 	var retId uint64 = 0
 	if recordInfo.RecordTime <= 0 {

+ 22 - 1
RO_Server_Trunk-branch_0.1.39/roserver/rank/msg/rank_msg.go

@@ -20,7 +20,7 @@ func init() {
 			//Error:  int32(serverproto.ErrorCode_ERROR_FAIL),
 			Notify: false,
 		}
-		if msg.IsHard {
+		if msg.IsHard == 1 {
 			var selfRank uint32 = 0
 			var totalRank uint32 = 0
 			var battleRecordId uint64 = 0
@@ -35,6 +35,27 @@ func init() {
 				ackMsg.RecordTimeStamp = msg.RecordInfo.RecordTime
 			}
 
+			if totalRank > 0 {
+				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
+				ackMsg.Rank = selfRank + 1
+			}
+			ackMsg.RankPlayers = totalRank
+			ackMsg.TopPlayerList = append(rankMode.MapHardRankTopThree)
+		} else if msg.IsHard == 2 {
+			var selfRank uint32 = 0
+			var totalRank uint32 = 0
+			var battleRecordId uint64 = 0
+			//获取排名
+			if msg.NewMapLevelId == 0 && msg.PassTime == 0 {
+				selfRank, totalRank = rankMode.GetMapHard2Rank(cliId.SessID)
+				ackMsg.Notify = true
+			} else {
+				//设置排名
+				selfRank, totalRank, battleRecordId = rankMode.AddHard2MapRank(cliId.SessID, msg.NewMapLevelId, msg.PassTime, msg.RecordInfo)
+				ackMsg.BattleRecordId = battleRecordId
+				ackMsg.RecordTimeStamp = msg.RecordInfo.RecordTime
+			}
+
 			if totalRank > 0 {
 				ackMsg.Error = int32(serverproto.ErrorCode_ERROR_OK)
 				ackMsg.Rank = selfRank + 1

+ 2 - 2
RO_Server_Trunk-branch_0.1.39/roserver/serverproto/config_csv.go

@@ -2273,7 +2273,7 @@ type Hard2MissionCfg struct {
 func Hard2MissionCfgLoad(path string) {
 	cfg := []*Hard2MissionCfg{}
 	Hard2MissionCfgLoader = map[int32]*Hard2MissionCfg{}
-	loadCsvCfg(path+"Hard2MissionCfg.csv", &cfg)
+	loadCsvCfg(path+"EMMissionCfg.csv", &cfg)
 	for _, row := range cfg {
 		Hard2MissionCfgLoader[row.MissionID] = row
 	}
@@ -3927,7 +3927,7 @@ type Hard2LevelCfg struct {
 func Hard2LevelCfgLoad(path string) {
 	cfg := []*Hard2LevelCfg{}
 	Hard2LevelCfgLoader = map[int32]*Hard2LevelCfg{}
-	loadCsvCfg(path+"Hard2LevelCfg.csv", &cfg)
+	loadCsvCfg(path+"EMLevelCfg.csv", &cfg)
 	for _, row := range cfg {
 		Hard2LevelCfgLoader[row.Id] = row
 	}

+ 204 - 204
RO_Server_Trunk-branch_0.1.39/roserver/serverproto/db.pb.go

@@ -2206,7 +2206,7 @@ type SSMapLevelChangeReq struct {
 	NewMapLevelId        uint32            `protobuf:"varint,1,opt,name=new_map_level_id,json=newMapLevelId,proto3" json:"new_map_level_id,omitempty"`
 	PassTime             uint64            `protobuf:"varint,2,opt,name=pass_time,json=passTime,proto3" json:"pass_time,omitempty"`
 	RecordInfo           *BattleRecordInfo `protobuf:"bytes,3,opt,name=record_info,json=recordInfo,proto3" json:"record_info,omitempty"`
-	IsHard               bool              `protobuf:"varint,4,opt,name=isHard,proto3" json:"isHard,omitempty"`
+	IsHard               int32             `protobuf:"varint,4,opt,name=isHard,proto3" json:"isHard,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
 	XXX_unrecognized     []byte            `json:"-"`
 	XXX_sizecache        int32             `json:"-"`
@@ -2258,11 +2258,11 @@ func (m *SSMapLevelChangeReq) GetRecordInfo() *BattleRecordInfo {
 	return nil
 }
 
-func (m *SSMapLevelChangeReq) GetIsHard() bool {
+func (m *SSMapLevelChangeReq) GetIsHard() int32 {
 	if m != nil {
 		return m.IsHard
 	}
-	return false
+	return 0
 }
 
 type SSMapLevelChangeAck struct {
@@ -7378,7 +7378,7 @@ func init() {
 }
 
 var fileDescriptor_8817812184a13374 = []byte{
-	// 5082 bytes of a gzipped FileDescriptorProto
+	// 5080 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x5d, 0x6f, 0x1c, 0x47,
 	0x72, 0xd8, 0x2f, 0x72, 0xb7, 0x96, 0x4b, 0x52, 0x63, 0x59, 0xa2, 0xac, 0xb3, 0x4f, 0x1e, 0x9f,
 	0x1d, 0xf9, 0xe3, 0xec, 0x3b, 0x49, 0x91, 0x6d, 0x59, 0xb1, 0x4d, 0x52, 0x12, 0xc5, 0xb3, 0x28,
@@ -7497,204 +7497,204 @@ var fileDescriptor_8817812184a13374 = []byte{
 	0x38, 0x92, 0xc6, 0xd1, 0x8e, 0xd3, 0x09, 0xe5, 0x93, 0x14, 0x7f, 0xdf, 0xc3, 0x7d, 0x4f, 0x84,
 	0x52, 0xa6, 0xfa, 0x9a, 0x08, 0x20, 0xe5, 0x7d, 0x0c, 0xed, 0x58, 0xf6, 0xa3, 0xd8, 0xe3, 0x13,
 	0xc1, 0x4e, 0xf2, 0xe5, 0x82, 0x2a, 0x74, 0x09, 0x43, 0x58, 0x5c, 0x35, 0xc4, 0xd9, 0x6f, 0xeb,
-	0x1c, 0xac, 0xf8, 0xea, 0x2e, 0x56, 0x64, 0x75, 0xba, 0xb8, 0xd1, 0x5f, 0xf6, 0x1f, 0x57, 0xe7,
-	0xb9, 0x46, 0x3b, 0xcf, 0x0c, 0xb8, 0x62, 0x1a, 0xb0, 0x05, 0x75, 0x94, 0x2a, 0x71, 0xd7, 0x71,
-	0xe8, 0x37, 0xe6, 0xb3, 0x24, 0x69, 0xf6, 0x25, 0x8a, 0x58, 0xeb, 0x38, 0x6d, 0x84, 0xb1, 0x23,
-	0x51, 0xd6, 0x2e, 0x6c, 0xa0, 0x42, 0xb4, 0xb7, 0x31, 0x42, 0xcf, 0x4c, 0x55, 0x9d, 0x4d, 0x21,
-	0xf6, 0x3b, 0x49, 0x34, 0xe1, 0x4f, 0x8a, 0x11, 0xe7, 0x60, 0x25, 0x8c, 0x12, 0x7f, 0x70, 0x42,
-	0x2a, 0x6f, 0x3a, 0xfa, 0xcb, 0xba, 0x0c, 0x9b, 0x5c, 0xb4, 0xb9, 0xa9, 0x80, 0x3c, 0xd2, 0x78,
-	0xdd, 0x59, 0xef, 0x99, 0x12, 0xf1, 0x30, 0x96, 0x6a, 0x14, 0x14, 0xb1, 0xab, 0x12, 0x31, 0x9e,
-	0x6c, 0xad, 0x12, 0xea, 0x06, 0x0f, 0xa0, 0xa8, 0xbb, 0x08, 0xb6, 0x93, 0x2c, 0x7b, 0x45, 0xae,
-	0xd2, 0x1b, 0xbc, 0x8b, 0xd0, 0xa2, 0xbd, 0x1a, 0xf9, 0x72, 0x13, 0x01, 0x78, 0x88, 0x70, 0x50,
-	0x25, 0x22, 0xc6, 0xba, 0xec, 0x29, 0x49, 0xa8, 0xe1, 0x34, 0x09, 0xb0, 0xef, 0x3d, 0x45, 0x4f,
-	0x48, 0x1e, 0x57, 0x49, 0xa1, 0xa2, 0xec, 0xf6, 0xaa, 0xe1, 0xac, 0x21, 0xb4, 0x4b, 0xc0, 0x7d,
-	0xcf, 0xfe, 0x9f, 0xca, 0xdc, 0xb2, 0x8b, 0x95, 0xf1, 0xbe, 0x66, 0xc6, 0x48, 0x33, 0x8a, 0x2e,
-	0x32, 0xa3, 0x43, 0xe2, 0x24, 0x46, 0x49, 0x92, 0xc8, 0xa8, 0x0c, 0x06, 0x74, 0x40, 0x34, 0x1b,
-	0x4d, 0x04, 0x20, 0x6a, 0x71, 0x8b, 0xf5, 0x65, 0x5b, 0x6c, 0xcc, 0x6c, 0xf1, 0x0d, 0xd8, 0xc8,
-	0xc8, 0xea, 0xc3, 0xc9, 0x27, 0xaf, 0x93, 0x12, 0xa7, 0xe3, 0x69, 0xff, 0x26, 0x96, 0xd6, 0x19,
-	0x6f, 0x8e, 0x7c, 0x22, 0x62, 0xaf, 0xdc, 0x3b, 0x67, 0xfe, 0xa1, 0x3a, 0xe3, 0x1f, 0x66, 0xa5,
-	0xd8, 0x54, 0xa9, 0x04, 0x7f, 0x50, 0x42, 0x1c, 0x45, 0x58, 0xd8, 0x73, 0x65, 0x66, 0xcf, 0x97,
-	0x61, 0x33, 0x26, 0x4c, 0x43, 0x3d, 0xbc, 0xe4, 0x3a, 0xc3, 0x33, 0x05, 0xfd, 0xb0, 0x40, 0xfe,
-	0xc1, 0xc4, 0x13, 0x09, 0x1d, 0xf2, 0x79, 0xf5, 0x56, 0xe6, 0xd5, 0x4b, 0xd7, 0x78, 0xbc, 0x8e,
-	0x79, 0x14, 0xb8, 0x5a, 0xd3, 0x1c, 0xe4, 0x06, 0x6f, 0xff, 0x45, 0xa5, 0x64, 0xb1, 0xc5, 0xe6,
-	0xb0, 0xbf, 0x90, 0xf8, 0xec, 0x39, 0xfb, 0x4c, 0x9e, 0x3c, 0x14, 0xc1, 0x54, 0xa2, 0x4a, 0xaf,
-	0x5f, 0x9b, 0x5f, 0xb9, 0x54, 0x1e, 0xb5, 0x52, 0x79, 0x8c, 0xe0, 0xd5, 0x6e, 0x77, 0x37, 0x8e,
-	0x94, 0xfa, 0x8d, 0xa9, 0x08, 0xef, 0x8a, 0x70, 0x78, 0x14, 0xfb, 0x22, 0xf8, 0x05, 0x28, 0xf6,
-	0x87, 0xcf, 0x5a, 0xe9, 0xe7, 0xa8, 0xe5, 0x27, 0x8b, 0xd7, 0xfa, 0xc5, 0xaa, 0xfc, 0x27, 0x95,
-	0x67, 0xad, 0xfc, 0x4b, 0xa6, 0xff, 0x3f, 0xab, 0xc0, 0x96, 0x2e, 0x8e, 0x0f, 0x85, 0x52, 0x79,
-	0x38, 0xc4, 0x58, 0xfa, 0x09, 0x74, 0xa8, 0xfa, 0x75, 0x7b, 0x85, 0x9b, 0x96, 0x22, 0x33, 0x34,
-	0x37, 0xbf, 0x40, 0x68, 0xd3, 0x8c, 0x1d, 0xbe, 0x64, 0x29, 0x75, 0xd8, 0xd5, 0x52, 0x87, 0x8d,
-	0x69, 0x98, 0xaf, 0xdc, 0x21, 0xbf, 0x90, 0x34, 0x9d, 0xba, 0xaf, 0xf6, 0xc6, 0xf6, 0x0d, 0x4c,
-	0xe4, 0x68, 0x85, 0x03, 0x3f, 0x34, 0x82, 0xbd, 0x7c, 0x8c, 0xb9, 0x2b, 0x33, 0x47, 0x41, 0x59,
-	0x8b, 0x12, 0x08, 0x44, 0xa1, 0xd0, 0xfe, 0x8f, 0x0a, 0x74, 0x0a, 0x53, 0x71, 0x8a, 0x99, 0x05,
-	0xe8, 0x29, 0x83, 0x8c, 0xac, 0xf5, 0x01, 0x34, 0x70, 0x9f, 0x4a, 0x97, 0xc0, 0xcf, 0x73, 0x61,
-	0xc2, 0x13, 0x90, 0xb4, 0xb1, 0x53, 0x9d, 0x60, 0x40, 0xbe, 0x47, 0x44, 0xd0, 0x51, 0x8e, 0x10,
-	0xea, 0x14, 0x64, 0x81, 0x41, 0x84, 0xf0, 0x3a, 0xe8, 0x70, 0xe7, 0x1e, 0xcb, 0x58, 0xf9, 0x51,
-	0xa8, 0xfd, 0x73, 0x87, 0xa1, 0x0f, 0x19, 0x68, 0xff, 0x6b, 0xa5, 0x5c, 0x24, 0x3a, 0xe9, 0x66,
-	0x91, 0x68, 0x65, 0xcd, 0x47, 0x94, 0xc2, 0x3c, 0xa7, 0x45, 0xd8, 0xa4, 0xa9, 0xb2, 0x20, 0x5c,
-	0x7d, 0xfe, 0x20, 0x5c, 0x2b, 0xd7, 0x69, 0x1e, 0xf2, 0xeb, 0x66, 0xc8, 0xb7, 0xdf, 0xc6, 0x3d,
-	0xa0, 0xbd, 0x1d, 0x65, 0xea, 0x62, 0x3f, 0x50, 0xe2, 0x6b, 0xec, 0xeb, 0xb0, 0x9e, 0xa3, 0x11,
-	0xb3, 0x69, 0x16, 0xa3, 0x2f, 0xbc, 0x28, 0x8b, 0x99, 0xcb, 0xfb, 0xec, 0xb8, 0x7c, 0x91, 0x67,
-	0xba, 0x99, 0x1b, 0x05, 0x29, 0x96, 0x9d, 0xbf, 0x22, 0x3b, 0x86, 0x18, 0xed, 0x50, 0x17, 0x1e,
-	0x77, 0x62, 0x5f, 0x86, 0xde, 0x51, 0x0a, 0x2f, 0x77, 0xa2, 0x17, 0xa0, 0x39, 0x73, 0xe3, 0xb7,
-	0x3a, 0xe5, 0xbb, 0x3e, 0xf4, 0x10, 0x3d, 0x39, 0xf4, 0xc3, 0x34, 0xb1, 0xa6, 0x0f, 0x7a, 0x07,
-	0x0a, 0xd3, 0x77, 0x42, 0xfc, 0x69, 0xff, 0x65, 0xa5, 0x7c, 0xc1, 0xf2, 0x4a, 0xc7, 0x30, 0xef,
-	0xda, 0xe9, 0xcc, 0xfb, 0x2c, 0x34, 0x06, 0x7e, 0x28, 0x02, 0x7d, 0x38, 0xf9, 0x23, 0xe7, 0xb2,
-	0x5e, 0xc2, 0x65, 0x23, 0xe7, 0xf2, 0x2d, 0xcc, 0xd6, 0x3f, 0x0f, 0x03, 0x3f, 0x94, 0x7b, 0x32,
-	0xc1, 0x1a, 0x63, 0xa1, 0x50, 0xec, 0x41, 0x29, 0x2e, 0xee, 0xe7, 0x06, 0xb4, 0xb0, 0x8a, 0xe1,
-	0x3b, 0x2a, 0x36, 0xee, 0x62, 0xfe, 0x8c, 0xc8, 0xe6, 0xcd, 0x8c, 0xd3, 0x8c, 0x75, 0x35, 0x54,
-	0x62, 0x1d, 0x7f, 0x48, 0xd9, 0x7e, 0x5a, 0x2e, 0xe5, 0xd9, 0xfe, 0xbc, 0xd4, 0x2e, 0xea, 0x75,
-	0x29, 0xa1, 0xd2, 0x69, 0x21, 0x02, 0x28, 0xa1, 0x2a, 0xaf, 0x80, 0xce, 0xc1, 0x0a, 0xfd, 0xb8,
-	0x92, 0xbe, 0xe9, 0xf2, 0x57, 0x06, 0xbf, 0xaa, 0xa5, 0xa3, 0xbf, 0xec, 0xbf, 0x29, 0x61, 0xa6,
-	0x5c, 0x85, 0x4b, 0x99, 0x79, 0x19, 0x80, 0x06, 0xe3, 0x68, 0x1a, 0xa6, 0x0e, 0x9f, 0xd0, 0x1d,
-	0x04, 0xe4, 0xbc, 0xd6, 0xcb, 0x79, 0x6d, 0x2c, 0xe0, 0x75, 0xa5, 0xc0, 0x2b, 0x29, 0x48, 0xab,
-	0x86, 0xdf, 0x87, 0x17, 0xa7, 0x09, 0x5f, 0x83, 0x5b, 0xfb, 0x47, 0x95, 0xd2, 0x85, 0xbe, 0x82,
-	0x58, 0xce, 0xc1, 0x0a, 0x47, 0x3d, 0x6d, 0xbd, 0xfa, 0x8b, 0x0a, 0x1f, 0x8e, 0x92, 0xcc, 0x02,
-	0x8b, 0xa5, 0xcd, 0xb0, 0x8c, 0x89, 0xb3, 0x19, 0x13, 0xdd, 0x51, 0x34, 0x59, 0x7c, 0x9a, 0x97,
-	0xb2, 0x80, 0x0e, 0x67, 0x14, 0x4d, 0xcc, 0xda, 0xbd, 0x89, 0x00, 0x1a, 0x7c, 0x05, 0xda, 0x6a,
-	0xda, 0x73, 0x09, 0x21, 0x6b, 0x03, 0x68, 0xa9, 0x69, 0x8f, 0x16, 0xf4, 0xec, 0x7f, 0x29, 0x63,
-	0xe2, 0x6b, 0x98, 0x87, 0x4a, 0xc4, 0x50, 0x9a, 0x02, 0xef, 0x22, 0x60, 0x46, 0x1f, 0xf5, 0x59,
-	0xeb, 0x29, 0x6c, 0xa1, 0xb1, 0x7c, 0x0b, 0x2b, 0xb3, 0x5b, 0xf8, 0x13, 0x32, 0x70, 0x63, 0x0b,
-	0x3b, 0xd3, 0x93, 0x9f, 0xb7, 0x18, 0x2f, 0x40, 0x73, 0x18, 0x45, 0x9e, 0xca, 0x65, 0xb8, 0x4a,
-	0xdf, 0x5c, 0x99, 0xf3, 0x50, 0x38, 0x1d, 0xa7, 0xbc, 0x13, 0xe0, 0xfe, 0x74, 0x6c, 0xff, 0x57,
-	0x09, 0x6f, 0xbf, 0x5c, 0xd2, 0x35, 0x77, 0xb6, 0xb2, 0x64, 0x67, 0xab, 0x33, 0x3b, 0xdb, 0xa6,
-	0xfb, 0x27, 0xde, 0x18, 0x39, 0xc4, 0x53, 0x4b, 0xdc, 0xfe, 0xe7, 0xea, 0x0c, 0x8d, 0xc5, 0xf9,
-	0xeb, 0xfc, 0xcd, 0xcb, 0xd2, 0x3a, 0xf5, 0x02, 0x34, 0xb3, 0xbb, 0xae, 0x3a, 0xcd, 0x59, 0x95,
-	0xfa, 0xa2, 0xab, 0xc0, 0x51, 0x63, 0x46, 0xce, 0xd7, 0xa0, 0x99, 0x44, 0x13, 0x8e, 0x02, 0x2b,
-	0x14, 0x05, 0x2e, 0xcc, 0x45, 0x01, 0x5c, 0xe0, 0x28, 0x9a, 0x5c, 0x75, 0x56, 0x13, 0x7e, 0x35,
-	0x42, 0xf1, 0x13, 0x2b, 0x9c, 0x2c, 0xae, 0x6a, 0xfb, 0x94, 0xc1, 0x80, 0xc2, 0xb8, 0x75, 0x15,
-	0x9a, 0x74, 0x0b, 0x8e, 0x44, 0x9b, 0x25, 0x2d, 0x1e, 0x48, 0x54, 0x5f, 0x9c, 0x3b, 0xab, 0x13,
-	0xfe, 0x81, 0x05, 0x44, 0x7f, 0x1a, 0xbb, 0x86, 0x5a, 0x5b, 0x5c, 0x40, 0xf4, 0xa7, 0xb1, 0x93,
-	0xf9, 0x31, 0x2f, 0xed, 0xc1, 0x40, 0xc8, 0x57, 0xf5, 0x95, 0x94, 0x5e, 0x92, 0xab, 0x32, 0x4c,
-	0x1f, 0x18, 0x44, 0x7a, 0xfa, 0xf7, 0xca, 0xdc, 0x32, 0xa7, 0xd4, 0x54, 0xbe, 0x78, 0x6d, 0xf9,
-	0xe2, 0xf5, 0xd9, 0xc5, 0xad, 0xeb, 0xd0, 0xf2, 0x13, 0x39, 0xe6, 0x4c, 0xa6, 0x51, 0xa2, 0x13,
-	0xb3, 0x60, 0x71, 0x9a, 0x88, 0x4b, 0x59, 0x4e, 0xf1, 0x4c, 0xac, 0xcc, 0x46, 0x80, 0xdf, 0xa9,
-	0xc0, 0x1a, 0x6e, 0xe7, 0x40, 0xbf, 0x37, 0x95, 0x08, 0xed, 0x46, 0xc6, 0x9a, 0x51, 0x2c, 0x2d,
-	0x59, 0x5b, 0x73, 0x4d, 0xab, 0xd3, 0xbd, 0xa0, 0x1f, 0xb8, 0x13, 0x11, 0x8b, 0xb1, 0xf9, 0x2e,
-	0xd3, 0x41, 0xf0, 0x21, 0x42, 0xa9, 0xa6, 0xfb, 0xbb, 0x0a, 0x5c, 0xe4, 0xe0, 0x9c, 0xbd, 0x1c,
-	0x65, 0x35, 0x2b, 0x56, 0x49, 0xaf, 0x40, 0x9b, 0xe8, 0xf4, 0x07, 0xc3, 0xbc, 0x88, 0x6c, 0x21,
-	0x68, 0x77, 0x30, 0xe4, 0x23, 0x4a, 0xe3, 0xa6, 0x62, 0x11, 0x90, 0x8a, 0x8e, 0x06, 0xc9, 0xf2,
-	0x6a, 0x0b, 0xcc, 0x39, 0x15, 0x00, 0xcf, 0x4b, 0xed, 0x79, 0x89, 0x3b, 0xe1, 0xf7, 0xf9, 0xd4,
-	0x1a, 0x9e, 0x51, 0xcb, 0x5f, 0x37, 0xf3, 0xaa, 0x67, 0x4a, 0x30, 0xcb, 0xa9, 0xec, 0xbf, 0xae,
-	0xc0, 0x7a, 0x4e, 0xbb, 0x84, 0xab, 0xca, 0xac, 0x93, 0x33, 0x6f, 0x1f, 0xd3, 0xbc, 0x7d, 0x46,
-	0x83, 0xb5, 0xaf, 0xa9, 0xc1, 0x7a, 0x99, 0x06, 0x7f, 0x5c, 0xe0, 0x34, 0xbd, 0x42, 0x5b, 0x7c,
-	0xda, 0x6e, 0x02, 0xdd, 0x7e, 0xba, 0x59, 0xd6, 0x50, 0x7e, 0xd5, 0x99, 0x6f, 0xdc, 0x81, 0x38,
-	0xfb, 0xc6, 0xb4, 0x62, 0x40, 0xbd, 0x56, 0xc5, 0xb4, 0x82, 0x61, 0xac, 0x9e, 0x51, 0xa9, 0x7a,
-	0xca, 0x83, 0xce, 0xcd, 0x32, 0x13, 0x5f, 0xc4, 0x0c, 0xdd, 0x73, 0x1a, 0x22, 0xb2, 0xef, 0x52,
-	0xb5, 0x28, 0xd5, 0xcc, 0x52, 0xc6, 0x4d, 0xf9, 0xf3, 0x46, 0x82, 0x8f, 0xf8, 0x11, 0x0e, 0xad,
-	0x91, 0xaf, 0xe9, 0xcb, 0x69, 0x14, 0x6e, 0x86, 0x3a, 0x3a, 0xc9, 0xb4, 0x0f, 0xa1, 0xc3, 0x4f,
-	0x64, 0x68, 0xca, 0x38, 0xb1, 0xdc, 0x31, 0xbd, 0x09, 0x75, 0xd4, 0x9c, 0x2e, 0xbf, 0x5f, 0x2c,
-	0x69, 0x5b, 0xf2, 0x03, 0x87, 0x50, 0xec, 0xdf, 0xae, 0x22, 0x49, 0x04, 0xa4, 0x8f, 0xa3, 0x9f,
-	0x6a, 0x6b, 0x50, 0x89, 0x48, 0x64, 0xfe, 0x98, 0x39, 0xeb, 0xca, 0x71, 0xca, 0x6e, 0x14, 0x26,
-	0x32, 0x4c, 0xd8, 0x4e, 0xba, 0x88, 0x6f, 0x3e, 0x40, 0x13, 0x15, 0xf3, 0xa5, 0xd3, 0x93, 0x01,
-	0xce, 0x22, 0x9c, 0x9b, 0xd0, 0x11, 0x9e, 0x67, 0xe0, 0xd4, 0x9e, 0xb1, 0x46, 0x5b, 0x78, 0x5e,
-	0x36, 0x9b, 0x7c, 0xc5, 0x53, 0x9e, 0x9d, 0xa7, 0x7a, 0x63, 0xf1, 0x14, 0x31, 0xf6, 0x3d, 0xeb,
-	0x6d, 0xb0, 0x30, 0xa4, 0x0c, 0x83, 0xa8, 0x27, 0x82, 0x0c, 0x8d, 0x43, 0xe0, 0x46, 0x7f, 0x1a,
-	0xef, 0xd1, 0x00, 0x23, 0xdb, 0x2e, 0xb5, 0x38, 0x45, 0xe3, 0x89, 0x4c, 0xfc, 0xc4, 0x8f, 0xc2,
-	0xf4, 0xcd, 0x67, 0x0f, 0x36, 0xfb, 0x39, 0x34, 0xad, 0x97, 0xe6, 0x9b, 0x94, 0xa8, 0xfb, 0x26,
-	0x47, 0x74, 0x36, 0x8c, 0x59, 0x74, 0xc2, 0x87, 0xba, 0xe3, 0xe4, 0x81, 0xef, 0xed, 0x9c, 0xd0,
-	0x03, 0x96, 0x18, 0xd3, 0x0a, 0x17, 0x80, 0xe2, 0xb8, 0xf1, 0x8a, 0xb5, 0x8a, 0xdf, 0x0f, 0x7c,
-	0x6a, 0x9f, 0x51, 0x52, 0xc4, 0xfd, 0x91, 0x1b, 0x8a, 0x71, 0xd6, 0xff, 0xc9, 0x20, 0x9c, 0x9e,
-	0xf5, 0x70, 0xd6, 0x8c, 0x1e, 0xce, 0x7e, 0xd9, 0x42, 0x78, 0x1c, 0xbe, 0x07, 0x1b, 0x79, 0x1b,
-	0x8b, 0xa9, 0xd3, 0xe7, 0xa9, 0x5d, 0x3b, 0x59, 0x2f, 0x0b, 0x1d, 0x05, 0x6a, 0x53, 0xbb, 0xb5,
-	0xc3, 0x95, 0xf2, 0xb6, 0xe7, 0xdd, 0x11, 0xa1, 0xd2, 0x9b, 0xa1, 0x8e, 0x30, 0x63, 0x33, 0xf8,
-	0x8d, 0x9b, 0x39, 0x0f, 0xab, 0xa8, 0xec, 0x3c, 0x58, 0xae, 0x08, 0xcf, 0x7b, 0xe0, 0x53, 0x68,
-	0x9a, 0x27, 0xb6, 0x38, 0xe0, 0x9a, 0x4b, 0x54, 0x8b, 0x4b, 0x7c, 0x94, 0x2f, 0x51, 0x7b, 0xee,
-	0x4b, 0xa7, 0x94, 0x8d, 0xc2, 0x96, 0x6e, 0xc9, 0x00, 0xb9, 0xc0, 0xa3, 0xb0, 0x7c, 0x4b, 0x68,
-	0xe3, 0xc6, 0x96, 0x3c, 0x19, 0x20, 0xad, 0x7f, 0xa3, 0x34, 0x58, 0x93, 0x32, 0x5e, 0x10, 0xaf,
-	0x43, 0x13, 0x53, 0x7b, 0x43, 0xf6, 0x4b, 0x2f, 0x23, 0x57, 0xd5, 0xb4, 0x47, 0xa6, 0xfe, 0x01,
-	0xb4, 0x06, 0x22, 0x54, 0xcf, 0x7d, 0x8b, 0xd9, 0x44, 0x6c, 0x9a, 0x79, 0x03, 0xa0, 0x17, 0x88,
-	0x7e, 0xa1, 0x85, 0x64, 0xe9, 0xd4, 0x16, 0xa1, 0x93, 0x92, 0xa9, 0x7f, 0x10, 0x1d, 0x4d, 0xbe,
-	0x11, 0x14, 0xc8, 0x7b, 0xb0, 0x32, 0x20, 0xc0, 0xc2, 0xfe, 0x41, 0xc6, 0x77, 0x34, 0x9a, 0xfd,
-	0xbf, 0x15, 0xb0, 0xbe, 0x8c, 0xe2, 0xc0, 0xdb, 0x89, 0x94, 0x22, 0x0f, 0x91, 0x76, 0x8d, 0xf5,
-	0x22, 0x65, 0xb4, 0xd2, 0xac, 0xe0, 0xe7, 0xbe, 0x67, 0xad, 0x43, 0x75, 0x34, 0xd1, 0x3e, 0xb3,
-	0x3a, 0x9a, 0x14, 0xee, 0x76, 0x6a, 0xc5, 0xbb, 0x1d, 0x3c, 0x21, 0x53, 0xd4, 0xaa, 0x99, 0xfb,
-	0x02, 0x83, 0x28, 0xfd, 0x7d, 0x0d, 0x3a, 0xde, 0x34, 0x16, 0x74, 0x78, 0x09, 0x45, 0xbf, 0xb9,
-	0xa7, 0x40, 0x42, 0xc2, 0x84, 0x96, 0xa9, 0xf8, 0xde, 0xd3, 0xbc, 0xe0, 0x42, 0xc8, 0xbe, 0xf7,
-	0xd4, 0xba, 0x0c, 0x9b, 0x7a, 0x98, 0xf8, 0x25, 0x8f, 0xce, 0x59, 0xef, 0x3a, 0xc3, 0x71, 0x5f,
-	0xe4, 0xd7, 0xff, 0xaf, 0x82, 0x8e, 0x94, 0xda, 0xcb, 0xa3, 0xe1, 0x82, 0x34, 0x2b, 0xed, 0x30,
-	0xab, 0x1a, 0x1d, 0x66, 0x17, 0xd8, 0x2e, 0xcc, 0xd7, 0x68, 0x35, 0xed, 0xa5, 0xa5, 0xd0, 0x5c,
-	0x48, 0x6e, 0x4d, 0xd2, 0x70, 0x8c, 0x01, 0x92, 0x3e, 0xae, 0x5f, 0xcb, 0x33, 0xc6, 0xba, 0xd3,
-	0xd6, 0x30, 0x6d, 0x02, 0x85, 0xa0, 0xb7, 0x72, 0x9a, 0xac, 0x00, 0x19, 0x4b, 0xf4, 0xed, 0xf9,
-	0xea, 0xa5, 0xda, 0xe5, 0x96, 0xb3, 0xaa, 0x12, 0xbe, 0x9e, 0xbf, 0x0d, 0x6b, 0xd9, 0x56, 0xb9,
-	0x4f, 0xa3, 0x19, 0x44, 0x43, 0xd3, 0xb6, 0x67, 0x7a, 0x69, 0x4c, 0xb9, 0x38, 0xab, 0x41, 0xc4,
-	0x8d, 0x34, 0x63, 0x38, 0xc3, 0x0d, 0x6a, 0xea, 0xca, 0xc1, 0x89, 0x7a, 0xcc, 0x97, 0x92, 0x67,
-	0xa1, 0x31, 0x8e, 0x42, 0x79, 0xa2, 0xdf, 0x86, 0xf9, 0xc3, 0x7a, 0x1d, 0xd6, 0x93, 0x28, 0x11,
-	0x81, 0x1b, 0xcb, 0xfe, 0x48, 0xc4, 0x43, 0x96, 0x61, 0xd5, 0xe9, 0x10, 0xd4, 0xd1, 0x40, 0x8c,
-	0xbc, 0xc7, 0xbe, 0x7e, 0x5f, 0x4e, 0xf3, 0xef, 0x63, 0x9f, 0xdf, 0x74, 0xed, 0x17, 0xd2, 0x7e,
-	0x6d, 0x47, 0x2a, 0x5a, 0xef, 0x7e, 0x32, 0xb0, 0xff, 0x88, 0xae, 0x47, 0xd8, 0x31, 0x90, 0x7d,
-	0xf2, 0xad, 0x51, 0x79, 0x50, 0xc6, 0x02, 0x72, 0xea, 0x07, 0xc6, 0xad, 0xee, 0x2a, 0x7d, 0x73,
-	0xbb, 0x63, 0xda, 0xb5, 0x65, 0x54, 0x16, 0xba, 0x33, 0x0b, 0x95, 0x79, 0x19, 0x36, 0x3d, 0x89,
-	0x86, 0xc4, 0x57, 0xe7, 0x86, 0xcd, 0xae, 0x13, 0x9c, 0xae, 0x92, 0xa9, 0x6d, 0x5d, 0xc2, 0x05,
-	0xee, 0x23, 0xde, 0x8d, 0x82, 0x40, 0xf6, 0xd1, 0x54, 0x97, 0x31, 0x75, 0x1e, 0x56, 0xfb, 0x22,
-	0xbf, 0x69, 0x6e, 0x38, 0x2b, 0xf8, 0xb9, 0x4f, 0x4d, 0x2b, 0x34, 0x60, 0x4a, 0xa3, 0x85, 0x10,
-	0x16, 0xc7, 0x17, 0xa8, 0x44, 0x3c, 0xe2, 0x87, 0x32, 0x41, 0xca, 0x6f, 0x40, 0x6d, 0x22, 0x93,
-	0x85, 0x6d, 0x84, 0x87, 0x32, 0x71, 0x10, 0x01, 0x85, 0x10, 0x44, 0xc2, 0x73, 0xd1, 0x0b, 0xf0,
-	0x3f, 0x3f, 0xac, 0xe2, 0xf7, 0xed, 0xd0, 0xb3, 0xc3, 0xd4, 0x6b, 0xe4, 0x3d, 0xe1, 0xdc, 0x6e,
-	0xf5, 0x75, 0x1a, 0xc9, 0x97, 0xac, 0xf7, 0xb7, 0x74, 0x6d, 0x7b, 0x28, 0x93, 0x2f, 0xa6, 0x32,
-	0x3e, 0xd9, 0x56, 0xca, 0x57, 0x59, 0x8f, 0xcb, 0x2e, 0x9c, 0x79, 0x8c, 0x50, 0x57, 0x10, 0xd8,
-	0x34, 0xce, 0xa2, 0xd7, 0xe2, 0x69, 0x64, 0x99, 0x1b, 0x8f, 0x73, 0x3a, 0x33, 0x6f, 0xed, 0xd5,
-	0xc2, 0x5b, 0xfb, 0x12, 0xb7, 0x64, 0xda, 0x48, 0xbd, 0x60, 0x23, 0xf6, 0x71, 0x39, 0xb7, 0x18,
-	0xef, 0xf2, 0x85, 0x2a, 0x85, 0x85, 0x4a, 0x77, 0x51, 0x3d, 0xdd, 0x2e, 0xec, 0x2f, 0xd0, 0xf0,
-	0x0f, 0x65, 0xd2, 0x95, 0x09, 0x43, 0xb5, 0x52, 0xe6, 0x25, 0x73, 0xb1, 0x84, 0x26, 0x35, 0xe6,
-	0x51, 0x72, 0x2e, 0x72, 0x92, 0xff, 0x54, 0xa5, 0x63, 0x23, 0x93, 0x9d, 0x28, 0xf4, 0xf2, 0xa5,
-	0x50, 0xf0, 0xaf, 0x00, 0xb5, 0xb4, 0xcd, 0xd4, 0x71, 0x08, 0xe2, 0x3a, 0x6e, 0x07, 0x36, 0xfa,
-	0x51, 0xe8, 0x51, 0x7a, 0xf4, 0xdd, 0xe7, 0xac, 0x37, 0xd7, 0xf3, 0x19, 0x24, 0x64, 0x93, 0xc6,
-	0x95, 0xe7, 0xac, 0x78, 0x72, 0x1a, 0x57, 0xe6, 0x68, 0x5c, 0x35, 0x9b, 0x31, 0x9e, 0x8b, 0xc6,
-	0xd5, 0x54, 0xd9, 0x99, 0x1d, 0x34, 0x16, 0xdb, 0xc1, 0x4a, 0xd1, 0x0e, 0xe2, 0x52, 0xd9, 0xa1,
-	0x19, 0x3c, 0x4b, 0x76, 0x1f, 0x14, 0x95, 0xf6, 0x0c, 0x43, 0x30, 0x15, 0x76, 0x5d, 0xaf, 0xb9,
-	0xed, 0x1d, 0x6f, 0xf7, 0x47, 0xbe, 0x3c, 0x96, 0x63, 0xcc, 0xaa, 0xe5, 0x63, 0xeb, 0x1b, 0x00,
-	0x13, 0x99, 0x14, 0x97, 0x6c, 0x4e, 0x64, 0x42, 0x2b, 0xda, 0x7f, 0x5a, 0x29, 0x9d, 0x88, 0xcc,
-	0x2e, 0x9d, 0x68, 0xbd, 0x09, 0x9b, 0x22, 0xc7, 0x37, 0x9b, 0x79, 0x36, 0x0c, 0x38, 0xc5, 0xe0,
-	0x0f, 0xa0, 0x41, 0x29, 0xe6, 0x29, 0x32, 0x37, 0x9e, 0x60, 0x3f, 0x44, 0x57, 0x39, 0xc7, 0x5c,
-	0x97, 0x1d, 0xda, 0x72, 0xfe, 0x2e, 0x42, 0x4b, 0x78, 0xc7, 0xda, 0x39, 0xea, 0x22, 0x4d, 0x78,
-	0xc7, 0xec, 0x1b, 0x4f, 0xa8, 0x65, 0x9e, 0x2f, 0xab, 0x70, 0xbd, 0xdc, 0xff, 0xd2, 0x73, 0x29,
-	0x06, 0x22, 0xb3, 0x9b, 0x10, 0x08, 0xc4, 0x4d, 0x57, 0xef, 0xe8, 0xde, 0xb6, 0x6a, 0xd9, 0xbf,
-	0x6a, 0xe4, 0x14, 0xb9, 0xb5, 0x2d, 0x75, 0xe7, 0xb5, 0xfc, 0x41, 0xe5, 0x00, 0xb6, 0x78, 0x69,
-	0x72, 0x87, 0xa7, 0x5c, 0x7c, 0xfe, 0x7d, 0xe6, 0x21, 0x96, 0x04, 0xb7, 0x9f, 0x4e, 0x24, 0x9b,
-	0xed, 0xad, 0x9d, 0xbb, 0x32, 0x98, 0xa0, 0xda, 0x6d, 0xe8, 0xf4, 0xa4, 0x3b, 0x92, 0xc1, 0x44,
-	0x7a, 0x46, 0x82, 0xdb, 0xee, 0xc9, 0xbb, 0x04, 0x7b, 0xc0, 0xf1, 0x6e, 0x41, 0xbe, 0x6d, 0x07,
-	0x65, 0x74, 0x17, 0x67, 0xee, 0x73, 0xab, 0x55, 0x97, 0xaf, 0x56, 0x2b, 0xae, 0xe6, 0xa2, 0xe7,
-	0xc4, 0xc0, 0xb2, 0x1f, 0x1e, 0xfb, 0x89, 0x48, 0x2b, 0x2b, 0x94, 0xc9, 0x2d, 0xd8, 0xf0, 0x33,
-	0xe0, 0xe2, 0xe7, 0x75, 0x6e, 0x29, 0x4c, 0xf1, 0x9c, 0xf5, 0x7c, 0x0e, 0x3d, 0x38, 0xfe, 0x67,
-	0x1d, 0x43, 0x57, 0x8e, 0x90, 0x16, 0xc3, 0x17, 0xa1, 0xd5, 0x13, 0x4a, 0xba, 0x4a, 0x1c, 0x4b,
-	0xed, 0x9a, 0x9b, 0x3d, 0xfd, 0xef, 0x5e, 0x38, 0xd8, 0x0f, 0xfc, 0x3e, 0x37, 0xd7, 0x69, 0x13,
-	0x22, 0xc0, 0xfd, 0xe9, 0xd8, 0xba, 0x06, 0xe7, 0xa8, 0xb6, 0x33, 0x98, 0x0b, 0xa7, 0xe3, 0x5e,
-	0xd6, 0x35, 0x77, 0x16, 0x47, 0xf3, 0x05, 0xef, 0xd3, 0x18, 0x37, 0x9a, 0xd2, 0x7f, 0xb6, 0x4d,
-	0xb3, 0xf8, 0xd1, 0x62, 0xc8, 0x83, 0xb4, 0x07, 0x8f, 0x86, 0xb3, 0x3b, 0xdf, 0x46, 0xda, 0x83,
-	0x87, 0xe0, 0xb4, 0xc5, 0xf1, 0x2d, 0x38, 0xc3, 0x9c, 0x8d, 0x25, 0x92, 0xcd, 0xb3, 0xbf, 0xba,
-	0xb3, 0x41, 0x03, 0x07, 0x04, 0x27, 0x47, 0xf5, 0x3e, 0x6c, 0x31, 0x6e, 0x2c, 0x27, 0x81, 0x38,
-	0x71, 0xf5, 0x02, 0x59, 0xde, 0x57, 0x77, 0x5e, 0xa4, 0x71, 0x87, 0x86, 0x0f, 0x68, 0x54, 0x97,
-	0xf0, 0xad, 0xbc, 0xc7, 0x9c, 0x6f, 0x7b, 0xbf, 0x59, 0x90, 0x79, 0xbe, 0xbb, 0xac, 0x57, 0xbd,
-	0x99, 0xa4, 0x5d, 0xea, 0x5d, 0x78, 0x81, 0x2e, 0x00, 0x98, 0xc1, 0xcc, 0x8b, 0xb6, 0x88, 0xce,
-	0xb7, 0x16, 0xd0, 0x61, 0xb6, 0x1f, 0x0a, 0xbe, 0xc6, 0xdb, 0x14, 0x9e, 0xc7, 0x10, 0xfd, 0xbf,
-	0x1d, 0xd6, 0xb7, 0xe1, 0x05, 0xba, 0x79, 0x98, 0x21, 0x0a, 0xdc, 0x66, 0xe2, 0xc9, 0xa0, 0x88,
-	0xfe, 0x29, 0xac, 0x21, 0x0f, 0x59, 0xee, 0xda, 0xa6, 0xc5, 0x5f, 0x59, 0xb0, 0x78, 0x9a, 0xbf,
-	0x82, 0xf0, 0xbc, 0x7b, 0x9c, 0xc2, 0x92, 0xbe, 0x78, 0x31, 0xb4, 0x81, 0x35, 0x7d, 0x0f, 0x41,
-	0x90, 0xfb, 0xd3, 0xb1, 0xfd, 0xeb, 0x78, 0x98, 0x73, 0x0a, 0x7b, 0x52, 0xeb, 0x59, 0xff, 0x17,
-	0xec, 0x50, 0x66, 0x46, 0xc1, 0xb6, 0xd5, 0x1a, 0xca, 0x72, 0x4b, 0xa8, 0xce, 0x58, 0x82, 0x3d,
-	0x58, 0x40, 0x19, 0x8f, 0xe0, 0xdb, 0x70, 0x66, 0xde, 0xea, 0xf4, 0x3f, 0x49, 0xfa, 0xcb, 0x2d,
-	0x6e, 0x6e, 0x9d, 0xf7, 0xe1, 0x65, 0x73, 0x1d, 0x9e, 0xf4, 0x40, 0xe5, 0xef, 0xf1, 0x98, 0xb9,
-	0x98, 0x2b, 0xe8, 0x2f, 0xfb, 0xaf, 0x2a, 0xcb, 0x66, 0x2e, 0xf6, 0x14, 0x59, 0x30, 0xa8, 0x9e,
-	0x32, 0x18, 0xcc, 0xe8, 0xa2, 0x36, 0xa3, 0x0b, 0x83, 0xd1, 0x7a, 0x81, 0xd1, 0x1f, 0x53, 0xaf,
-	0xd1, 0xac, 0x8d, 0xdd, 0x8f, 0x12, 0xbf, 0x2f, 0xd9, 0xda, 0xd1, 0x11, 0x14, 0xc5, 0x54, 0x99,
-	0x3d, 0x98, 0xe6, 0x4d, 0x4e, 0xb5, 0x78, 0x93, 0xf3, 0x1e, 0x34, 0xa8, 0x24, 0xd3, 0xd1, 0x6d,
-	0x49, 0x76, 0xc1, 0x78, 0xf6, 0x1f, 0xf0, 0xa5, 0x88, 0x60, 0xc7, 0xff, 0xdd, 0xef, 0x7c, 0x27,
-	0x75, 0x46, 0x1f, 0x42, 0x0b, 0xfd, 0xd0, 0xf2, 0x9b, 0x28, 0x63, 0x9e, 0xd3, 0x54, 0x3a, 0x77,
-	0xb3, 0xae, 0x1b, 0x15, 0x5a, 0xd9, 0x25, 0x82, 0x31, 0xeb, 0x5e, 0x34, 0xcc, 0x4b, 0xb4, 0x03,
-	0x74, 0xbc, 0xdc, 0x71, 0x95, 0x75, 0xed, 0x17, 0x3b, 0x84, 0x8d, 0x4a, 0xe4, 0x12, 0xac, 0x65,
-	0xcd, 0xff, 0x79, 0x39, 0x02, 0x8f, 0xf4, 0xc4, 0x7d, 0xcf, 0xee, 0xc2, 0xc5, 0xc2, 0xce, 0xbe,
-	0x1c, 0x49, 0x19, 0xdc, 0x8b, 0x86, 0xdb, 0x1e, 0x5d, 0xa5, 0x5e, 0x9b, 0xab, 0x23, 0x8b, 0xd2,
-	0x4a, 0xd1, 0x8b, 0x65, 0xe4, 0x3e, 0x58, 0xba, 0x57, 0x2c, 0xbd, 0x6f, 0x41, 0x5a, 0x57, 0xe7,
-	0x85, 0x35, 0xff, 0xaf, 0x03, 0x34, 0x2b, 0x17, 0x53, 0xfa, 0x2f, 0xb9, 0xc2, 0x9b, 0xfb, 0x97,
-	0x5c, 0xe1, 0x2d, 0xf9, 0x97, 0x5c, 0xe1, 0x39, 0x84, 0x62, 0x7f, 0x3f, 0x17, 0xd7, 0x2c, 0x95,
-	0xd2, 0xc2, 0x0d, 0x27, 0x19, 0x85, 0x1b, 0x7e, 0xee, 0xf3, 0xdd, 0x2f, 0x96, 0xa2, 0x59, 0x33,
-	0x04, 0x7e, 0xf0, 0x36, 0x31, 0x06, 0x66, 0x5b, 0xd5, 0xdb, 0xa4, 0xea, 0xe8, 0x79, 0xb6, 0x89,
-	0x88, 0xb4, 0xcd, 0x5d, 0x34, 0xb0, 0x2f, 0x7d, 0x35, 0xda, 0x89, 0x9e, 0x9a, 0x3c, 0xbe, 0x0d,
-	0x8d, 0x27, 0xbe, 0x1a, 0xa9, 0x85, 0x5b, 0xc5, 0x39, 0x0e, 0xe3, 0xd8, 0x3f, 0xa2, 0xff, 0xb2,
-	0xd8, 0x39, 0x32, 0x85, 0xfe, 0x21, 0xac, 0xf5, 0x12, 0xb7, 0x17, 0x05, 0xbe, 0xc9, 0x50, 0x31,
-	0x41, 0xdd, 0x39, 0xda, 0x89, 0x02, 0x9f, 0x3d, 0x69, 0x2f, 0x49, 0x7f, 0x5b, 0xd7, 0x74, 0xa4,
-	0x35, 0xfe, 0x75, 0x6a, 0x6e, 0x9e, 0x50, 0x5c, 0x89, 0x50, 0x08, 0xc6, 0x5f, 0x3b, 0x9b, 0xdf,
-	0x5f, 0x7f, 0xf7, 0xbd, 0x8f, 0x0c, 0xb4, 0xde, 0x0a, 0xfd, 0xb9, 0xfa, 0xb3, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x42, 0x41, 0xc2, 0xeb, 0xa4, 0x40, 0x00, 0x00,
+	0x1c, 0xac, 0xf8, 0xea, 0x2e, 0x56, 0x64, 0xfa, 0x9a, 0x88, 0xbf, 0xec, 0x3f, 0xae, 0xce, 0x73,
+	0x8d, 0x76, 0x9e, 0x19, 0x70, 0xc5, 0x34, 0x60, 0x0b, 0xea, 0x28, 0x55, 0xe2, 0xae, 0xe3, 0xd0,
+	0x6f, 0xcc, 0x67, 0x49, 0xd2, 0xec, 0x4b, 0x14, 0xb1, 0xd6, 0x71, 0xda, 0x08, 0x63, 0x47, 0xa2,
+	0xac, 0x5d, 0xd8, 0x40, 0x85, 0x68, 0x6f, 0x63, 0x84, 0x9e, 0x99, 0xaa, 0x3a, 0x9b, 0x42, 0xec,
+	0x77, 0x92, 0x68, 0xc2, 0x9f, 0x14, 0x23, 0xce, 0xc1, 0x4a, 0x18, 0x25, 0xfe, 0xe0, 0x84, 0x54,
+	0xde, 0x74, 0xf4, 0x97, 0x75, 0x19, 0x36, 0xb9, 0x68, 0x73, 0x53, 0x01, 0x79, 0xa4, 0xf1, 0xba,
+	0xb3, 0xde, 0x33, 0x25, 0xe2, 0x61, 0x2c, 0xd5, 0x28, 0x28, 0x62, 0x57, 0x25, 0x62, 0x3c, 0xd9,
+	0x5a, 0x25, 0xd4, 0x0d, 0x1e, 0x40, 0x51, 0x77, 0x11, 0x6c, 0x27, 0x59, 0xf6, 0x8a, 0x5c, 0xa5,
+	0x37, 0x78, 0x17, 0xa1, 0x45, 0x7b, 0x35, 0xf2, 0xe5, 0x26, 0x02, 0xf0, 0x10, 0xe1, 0xa0, 0x4a,
+	0x44, 0x8c, 0x75, 0xd9, 0x53, 0x92, 0x50, 0xc3, 0x69, 0x12, 0x60, 0xdf, 0x7b, 0x8a, 0x9e, 0x90,
+	0x3c, 0xae, 0x92, 0x42, 0x45, 0xd9, 0xed, 0x55, 0xc3, 0x59, 0x43, 0x68, 0x97, 0x80, 0xfb, 0x9e,
+	0xfd, 0x3f, 0x95, 0xb9, 0x65, 0x17, 0x2b, 0xe3, 0x7d, 0xcd, 0x8c, 0x91, 0x66, 0x14, 0x5d, 0x64,
+	0x46, 0x87, 0xc4, 0x49, 0x8c, 0x92, 0x24, 0x91, 0x51, 0x19, 0x0c, 0xe8, 0x80, 0x68, 0x36, 0x9a,
+	0x08, 0x40, 0xd4, 0xe2, 0x16, 0xeb, 0xcb, 0xb6, 0xd8, 0x98, 0xd9, 0xe2, 0x1b, 0xb0, 0x91, 0x91,
+	0xd5, 0x87, 0x93, 0x4f, 0x5e, 0x27, 0x25, 0x4e, 0xc7, 0xd3, 0xfe, 0x4d, 0x2c, 0xad, 0x33, 0xde,
+	0x1c, 0xf9, 0x44, 0xc4, 0x5e, 0xb9, 0x77, 0xce, 0xfc, 0x43, 0x75, 0xc6, 0x3f, 0xcc, 0x4a, 0xb1,
+	0xa9, 0x52, 0x09, 0xfe, 0xa0, 0x84, 0x38, 0x8a, 0xb0, 0xb0, 0xe7, 0xca, 0xcc, 0x9e, 0x2f, 0xc3,
+	0x66, 0x4c, 0x98, 0x86, 0x7a, 0x78, 0xc9, 0x75, 0x86, 0x67, 0x0a, 0xfa, 0x61, 0x81, 0xfc, 0x83,
+	0x89, 0x27, 0x12, 0x3a, 0xe4, 0xf3, 0xea, 0xad, 0xcc, 0xab, 0x97, 0xae, 0xf1, 0x78, 0x1d, 0xf3,
+	0x28, 0x70, 0xb5, 0xa6, 0x39, 0xc8, 0x0d, 0xde, 0xfe, 0x8b, 0x4a, 0xc9, 0x62, 0x8b, 0xcd, 0x61,
+	0x7f, 0x21, 0xf1, 0xd9, 0x73, 0xf6, 0x99, 0x3c, 0x79, 0x28, 0x82, 0xa9, 0x44, 0x95, 0x5e, 0xbf,
+	0x36, 0xbf, 0x72, 0xa9, 0x3c, 0x6a, 0xa5, 0xf2, 0x18, 0xc1, 0xab, 0xdd, 0xee, 0x6e, 0x1c, 0x29,
+	0xf5, 0x1b, 0x53, 0x11, 0xde, 0x15, 0xe1, 0xf0, 0x28, 0xf6, 0x45, 0xf0, 0x0b, 0x50, 0xec, 0x0f,
+	0x9f, 0xb5, 0xd2, 0xcf, 0x51, 0xcb, 0x4f, 0x16, 0xaf, 0xf5, 0x8b, 0x55, 0xf9, 0x4f, 0x2a, 0xcf,
+	0x5a, 0xf9, 0x97, 0x4c, 0xff, 0x7f, 0x56, 0x81, 0x2d, 0x5d, 0x1c, 0x1f, 0x0a, 0xa5, 0xf2, 0x70,
+	0x88, 0xb1, 0xf4, 0x13, 0xe8, 0x50, 0xf5, 0xeb, 0xf6, 0x0a, 0x37, 0x2d, 0x45, 0x66, 0x68, 0x6e,
+	0x7e, 0x81, 0xd0, 0xa6, 0x19, 0x3b, 0x7c, 0xc9, 0x52, 0xea, 0xb0, 0xab, 0xa5, 0x0e, 0x1b, 0xd3,
+	0x30, 0x5f, 0xb9, 0x43, 0x7e, 0x21, 0x69, 0x3a, 0x75, 0x5f, 0xed, 0x8d, 0xed, 0x1b, 0x98, 0xc8,
+	0xd1, 0x0a, 0x07, 0x7e, 0x68, 0x04, 0x7b, 0xf9, 0x18, 0x73, 0x57, 0x66, 0x8e, 0x82, 0xb2, 0x16,
+	0x25, 0x10, 0x88, 0x42, 0xa1, 0xfd, 0x1f, 0x15, 0xe8, 0x14, 0xa6, 0xe2, 0x14, 0x33, 0x0b, 0xd0,
+	0x53, 0x06, 0x19, 0x59, 0xeb, 0x03, 0x68, 0xe0, 0x3e, 0x95, 0x2e, 0x81, 0x9f, 0xe7, 0xc2, 0x84,
+	0x27, 0x20, 0x69, 0x63, 0xa7, 0x3a, 0xc1, 0x80, 0x7c, 0x8f, 0x88, 0xa0, 0xa3, 0x1c, 0x21, 0xd4,
+	0x29, 0xc8, 0x02, 0x83, 0x08, 0xe1, 0x75, 0xd0, 0xe1, 0xce, 0x3d, 0x96, 0xb1, 0xf2, 0xa3, 0x50,
+	0xfb, 0xe7, 0x0e, 0x43, 0x1f, 0x32, 0xd0, 0xfe, 0xd7, 0x4a, 0xb9, 0x48, 0x74, 0xd2, 0xcd, 0x22,
+	0xd1, 0xca, 0x9a, 0x8f, 0x28, 0x85, 0x79, 0x4e, 0x8b, 0xb0, 0x49, 0x53, 0x65, 0x41, 0xb8, 0xfa,
+	0xfc, 0x41, 0xb8, 0x56, 0xae, 0xd3, 0x3c, 0xe4, 0xd7, 0xcd, 0x90, 0x6f, 0xbf, 0x8d, 0x7b, 0x40,
+	0x7b, 0x3b, 0xca, 0xd4, 0xc5, 0x7e, 0xa0, 0xc4, 0xd7, 0xd8, 0xd7, 0x61, 0x3d, 0x47, 0x23, 0x66,
+	0xd3, 0x2c, 0x46, 0x5f, 0x78, 0x51, 0x16, 0x33, 0x97, 0xf7, 0xd9, 0x71, 0xf9, 0x22, 0xcf, 0x74,
+	0x33, 0x37, 0x0a, 0x52, 0x2c, 0x3b, 0x7f, 0x45, 0x76, 0x0c, 0x31, 0xda, 0xa1, 0x2e, 0x3c, 0xee,
+	0xc4, 0xbe, 0x0c, 0xbd, 0xa3, 0x14, 0x5e, 0xee, 0x44, 0x2f, 0x40, 0x73, 0xe6, 0xc6, 0x6f, 0x75,
+	0xca, 0x77, 0x7d, 0xe8, 0x21, 0x7a, 0x72, 0xe8, 0x87, 0x69, 0x62, 0x4d, 0x1f, 0xf4, 0x0e, 0x14,
+	0xa6, 0x09, 0x20, 0xfe, 0xb4, 0xff, 0xb2, 0x52, 0xbe, 0x60, 0x79, 0xa5, 0x63, 0x98, 0x77, 0xed,
+	0x74, 0xe6, 0x7d, 0x16, 0x1a, 0x03, 0x3f, 0x14, 0x81, 0x3e, 0x9c, 0xfc, 0x91, 0x73, 0x59, 0x2f,
+	0xe1, 0xb2, 0x91, 0x73, 0xf9, 0x16, 0x66, 0xeb, 0x9f, 0x87, 0x81, 0x1f, 0xca, 0x3d, 0x99, 0x60,
+	0x8d, 0xb1, 0x50, 0x28, 0xf6, 0xa0, 0x14, 0x17, 0xf7, 0x73, 0x03, 0x5a, 0x58, 0xc5, 0xf0, 0x1d,
+	0x15, 0x1b, 0x77, 0x31, 0x7f, 0x46, 0x64, 0xf3, 0x66, 0xc6, 0x69, 0xc6, 0xba, 0x1a, 0x2a, 0xb1,
+	0x8e, 0x3f, 0xa4, 0x6c, 0x3f, 0x2d, 0x97, 0xf2, 0x6c, 0x7f, 0x5e, 0x6a, 0x17, 0xf5, 0xba, 0x94,
+	0x50, 0xe9, 0xb4, 0x10, 0x01, 0x94, 0x50, 0x95, 0x57, 0x40, 0xe7, 0x60, 0x85, 0x7e, 0x5c, 0x49,
+	0x93, 0x75, 0xfe, 0xca, 0xe0, 0x57, 0xb5, 0x74, 0xf4, 0x97, 0xfd, 0x37, 0x25, 0xcc, 0x94, 0xab,
+	0x70, 0x29, 0x33, 0x2f, 0x03, 0xd0, 0x60, 0x1c, 0x4d, 0xc3, 0xd4, 0xe1, 0x13, 0xba, 0x83, 0x80,
+	0x9c, 0xd7, 0x7a, 0x39, 0xaf, 0x8d, 0x05, 0xbc, 0xae, 0x14, 0x78, 0x25, 0x05, 0x69, 0xd5, 0xf0,
+	0xfb, 0xf0, 0xe2, 0x34, 0xe1, 0x6b, 0x70, 0x6b, 0xff, 0xa8, 0x52, 0xba, 0xd0, 0x57, 0x10, 0xcb,
+	0x39, 0x58, 0xe1, 0xa8, 0xa7, 0xad, 0x57, 0x7f, 0x51, 0xe1, 0xc3, 0x51, 0x92, 0x59, 0x60, 0xb1,
+	0xb4, 0x19, 0x96, 0x31, 0x71, 0x36, 0x63, 0xa2, 0x3b, 0x8a, 0x26, 0x8b, 0x4f, 0xf3, 0x52, 0x16,
+	0xd0, 0xe1, 0x8c, 0xa2, 0x89, 0x59, 0xbb, 0x37, 0x11, 0x40, 0x83, 0xaf, 0x40, 0x5b, 0x4d, 0x7b,
+	0x2e, 0x21, 0x64, 0x6d, 0x00, 0x2d, 0x35, 0xed, 0xd1, 0x82, 0x9e, 0xfd, 0x2f, 0x65, 0x4c, 0x7c,
+	0x0d, 0xf3, 0x50, 0x89, 0x18, 0x4a, 0x53, 0xe0, 0x5d, 0x04, 0xcc, 0xe8, 0xa3, 0x3e, 0x6b, 0x3d,
+	0x85, 0x2d, 0x34, 0x96, 0x6f, 0x61, 0x65, 0x76, 0x0b, 0x7f, 0x42, 0x06, 0x6e, 0x6c, 0x61, 0x67,
+	0x7a, 0xf2, 0xf3, 0x16, 0xe3, 0x05, 0x68, 0x0e, 0xa3, 0xc8, 0x53, 0xb9, 0x0c, 0x57, 0xe9, 0x9b,
+	0x2b, 0x73, 0x1e, 0x0a, 0xa7, 0xe3, 0x94, 0x77, 0x02, 0xdc, 0x9f, 0x8e, 0xed, 0xff, 0x2a, 0xe1,
+	0xed, 0x97, 0x4b, 0xba, 0xe6, 0xce, 0x56, 0x96, 0xec, 0x6c, 0x75, 0x66, 0x67, 0xdb, 0x74, 0xff,
+	0xc4, 0x1b, 0x23, 0x87, 0x78, 0x6a, 0x89, 0xdb, 0xff, 0x5c, 0x9d, 0xa1, 0xb1, 0x38, 0x7f, 0x9d,
+	0xbf, 0x79, 0x59, 0x5a, 0xa7, 0x5e, 0x80, 0x66, 0x76, 0xd7, 0x55, 0xa7, 0x39, 0xab, 0x52, 0x5f,
+	0x74, 0x15, 0x38, 0x6a, 0xcc, 0xc8, 0xf9, 0x1a, 0x34, 0x93, 0x68, 0xc2, 0x51, 0x60, 0x85, 0xa2,
+	0xc0, 0x85, 0xb9, 0x28, 0x80, 0x0b, 0x1c, 0x45, 0x93, 0xab, 0xce, 0x6a, 0xc2, 0xaf, 0x46, 0x28,
+	0x7e, 0x62, 0x85, 0x93, 0xc5, 0x55, 0x6d, 0x9f, 0x32, 0x18, 0x50, 0x18, 0xb7, 0xae, 0x42, 0x93,
+	0x6e, 0xc1, 0x91, 0x68, 0xb3, 0xa4, 0xc5, 0x03, 0x89, 0xea, 0x8b, 0x73, 0x67, 0x75, 0xc2, 0x3f,
+	0xb0, 0x80, 0xe8, 0x4f, 0x63, 0xd7, 0x50, 0x6b, 0x8b, 0x0b, 0x88, 0xfe, 0x34, 0x76, 0x32, 0x3f,
+	0xe6, 0xa5, 0x3d, 0x18, 0x08, 0xf9, 0xaa, 0xbe, 0x92, 0xd2, 0x4b, 0x72, 0x55, 0x86, 0xe9, 0x03,
+	0x83, 0x48, 0x4f, 0xff, 0x5e, 0x99, 0x5b, 0xe6, 0x94, 0x9a, 0xca, 0x17, 0xaf, 0x2d, 0x5f, 0xbc,
+	0x3e, 0xbb, 0xb8, 0x75, 0x1d, 0x5a, 0x7e, 0x22, 0xc7, 0x9c, 0xc9, 0x34, 0x4a, 0x74, 0x62, 0x16,
+	0x2c, 0x4e, 0x13, 0x71, 0x29, 0xcb, 0x29, 0x9e, 0x89, 0x95, 0xd9, 0x08, 0xf0, 0x3b, 0x15, 0x58,
+	0xc3, 0xed, 0x1c, 0xe8, 0xf7, 0xa6, 0x12, 0xa1, 0xdd, 0xc8, 0x58, 0x33, 0x8a, 0xa5, 0x25, 0x6b,
+	0x6b, 0xae, 0x69, 0x75, 0xba, 0x17, 0xf4, 0x03, 0x77, 0x22, 0x62, 0x31, 0x36, 0xdf, 0x65, 0x3a,
+	0x08, 0x3e, 0x44, 0x28, 0xd5, 0x74, 0x7f, 0x57, 0x81, 0x8b, 0x1c, 0x9c, 0xb3, 0x97, 0xa3, 0xac,
+	0x66, 0xc5, 0x2a, 0xe9, 0x15, 0x68, 0x13, 0x9d, 0xfe, 0x60, 0x98, 0x17, 0x91, 0x2d, 0x04, 0xed,
+	0x0e, 0x86, 0x7c, 0x44, 0x69, 0xdc, 0x54, 0x2c, 0x02, 0x52, 0xd1, 0xd1, 0x20, 0x59, 0x5e, 0x6d,
+	0x81, 0x39, 0xa7, 0x02, 0xe0, 0x79, 0xa9, 0x3d, 0x2f, 0x71, 0x27, 0xfc, 0x3e, 0x9f, 0x5a, 0xc3,
+	0x33, 0x6a, 0xf9, 0xeb, 0x66, 0x5e, 0xf5, 0x4c, 0x09, 0x66, 0x39, 0x95, 0xfd, 0xd7, 0x15, 0x58,
+	0xcf, 0x69, 0x97, 0x70, 0x55, 0x99, 0x75, 0x72, 0xe6, 0xed, 0x63, 0x9a, 0xb7, 0xcf, 0x68, 0xb0,
+	0xf6, 0x35, 0x35, 0x58, 0x2f, 0xd3, 0xe0, 0x8f, 0x0b, 0x9c, 0xa6, 0x57, 0x68, 0x8b, 0x4f, 0xdb,
+	0x4d, 0xa0, 0xdb, 0x4f, 0x37, 0xcb, 0x1a, 0xca, 0xaf, 0x3a, 0xf3, 0x8d, 0x3b, 0x10, 0x67, 0xdf,
+	0x98, 0x56, 0x0c, 0xa8, 0xd7, 0xaa, 0x98, 0x56, 0x30, 0x8c, 0xd5, 0x33, 0x2a, 0x55, 0x4f, 0x79,
+	0xd0, 0xb9, 0x59, 0x66, 0xe2, 0x8b, 0x98, 0xa1, 0x7b, 0x4e, 0x43, 0x44, 0xf6, 0x5d, 0xaa, 0x16,
+	0xa5, 0x9a, 0x59, 0xca, 0xb8, 0x29, 0x7f, 0xde, 0x48, 0xf0, 0x11, 0x3f, 0xc2, 0xa1, 0x35, 0xf2,
+	0x35, 0x7d, 0x39, 0x8d, 0xc2, 0xcd, 0x50, 0x47, 0x27, 0x99, 0xf6, 0x21, 0x74, 0xf8, 0x89, 0x0c,
+	0x4d, 0x19, 0x27, 0x96, 0x3b, 0xa6, 0x37, 0xa1, 0x8e, 0x9a, 0xd3, 0xe5, 0xf7, 0x8b, 0x25, 0x6d,
+	0x4b, 0x7e, 0xe0, 0x10, 0x8a, 0xfd, 0xdb, 0x55, 0x24, 0x89, 0x80, 0xf4, 0x71, 0xf4, 0x53, 0x6d,
+	0x0d, 0x2a, 0x11, 0x89, 0xcc, 0x1f, 0x33, 0x67, 0x5d, 0x39, 0x4e, 0xd9, 0x8d, 0xc2, 0x44, 0x86,
+	0x09, 0xdb, 0x49, 0x17, 0xf1, 0xcd, 0x07, 0x68, 0xa2, 0x62, 0xbe, 0x74, 0x7a, 0x32, 0xc0, 0x59,
+	0x84, 0x73, 0x13, 0x3a, 0xc2, 0xf3, 0x0c, 0x9c, 0xda, 0x33, 0xd6, 0x68, 0x0b, 0xcf, 0xcb, 0x66,
+	0x93, 0xaf, 0x78, 0xca, 0xb3, 0xf3, 0x54, 0x6f, 0x2c, 0x9e, 0x22, 0xc6, 0xbe, 0x67, 0xbd, 0x0d,
+	0x16, 0x86, 0x94, 0x61, 0x10, 0xf5, 0x44, 0x90, 0xa1, 0x71, 0x08, 0xdc, 0xe8, 0x4f, 0xe3, 0x3d,
+	0x1a, 0x60, 0x64, 0xdb, 0xa5, 0x16, 0xa7, 0x68, 0x3c, 0x91, 0x89, 0x9f, 0xf8, 0x51, 0x98, 0xbe,
+	0xf9, 0xec, 0xc1, 0x66, 0x3f, 0x87, 0xa6, 0xf5, 0xd2, 0x7c, 0x93, 0x12, 0x75, 0xdf, 0xe4, 0x88,
+	0xce, 0x86, 0x31, 0x8b, 0x4e, 0xf8, 0x50, 0x77, 0x9c, 0x3c, 0xf0, 0xbd, 0x9d, 0x13, 0x7a, 0xc0,
+	0x12, 0x63, 0x5a, 0xe1, 0x02, 0x50, 0x1c, 0x37, 0x5e, 0xb1, 0x56, 0xf1, 0xfb, 0x81, 0x4f, 0xed,
+	0x33, 0x4a, 0x8a, 0xb8, 0x3f, 0x72, 0x43, 0x31, 0xce, 0xfa, 0x3f, 0x19, 0x84, 0xd3, 0xb3, 0x1e,
+	0xce, 0x9a, 0xd1, 0xc3, 0xd9, 0x2f, 0x5b, 0x08, 0x8f, 0xc3, 0xf7, 0x60, 0x23, 0x6f, 0x63, 0x31,
+	0x75, 0xfa, 0x3c, 0xb5, 0x6b, 0x27, 0xeb, 0x65, 0xa1, 0xa3, 0x40, 0x6d, 0x6a, 0xb7, 0x76, 0xb8,
+	0x52, 0xde, 0xf6, 0xbc, 0x3b, 0x22, 0x54, 0x7a, 0x33, 0xd4, 0x11, 0x66, 0x6c, 0x06, 0xbf, 0x71,
+	0x33, 0xe7, 0x61, 0x15, 0x95, 0x9d, 0x07, 0xcb, 0x15, 0xe1, 0x79, 0x0f, 0x7c, 0x0a, 0x4d, 0xf3,
+	0xc4, 0x16, 0x07, 0x5c, 0x73, 0x89, 0x6a, 0x71, 0x89, 0x8f, 0xf2, 0x25, 0x6a, 0xcf, 0x7d, 0xe9,
+	0x94, 0xb2, 0x51, 0xd8, 0xd2, 0x2d, 0x19, 0x20, 0x17, 0x78, 0x14, 0x96, 0x6f, 0x09, 0x6d, 0xdc,
+	0xd8, 0x92, 0x27, 0x03, 0xa4, 0xf5, 0x6f, 0x94, 0x06, 0x6b, 0x52, 0xc6, 0x0b, 0xe2, 0x75, 0x68,
+	0x62, 0x6a, 0x6f, 0xc8, 0x7e, 0xe9, 0x65, 0xe4, 0xaa, 0x9a, 0xf6, 0xc8, 0xd4, 0x3f, 0x80, 0xd6,
+	0x40, 0x84, 0xea, 0xb9, 0x6f, 0x31, 0x9b, 0x88, 0x4d, 0x33, 0x6f, 0x00, 0xf4, 0x02, 0xd1, 0x2f,
+	0xb4, 0x90, 0x2c, 0x9d, 0xda, 0x22, 0x74, 0x52, 0x32, 0xf5, 0x0f, 0xa2, 0xa3, 0xc9, 0x37, 0x82,
+	0x02, 0x79, 0x0f, 0x56, 0x06, 0x04, 0x58, 0xd8, 0x3f, 0xc8, 0xf8, 0x8e, 0x46, 0xb3, 0xff, 0xb7,
+	0x02, 0xd6, 0x97, 0x51, 0x1c, 0x78, 0x3b, 0x91, 0x52, 0xe4, 0x21, 0xd2, 0xae, 0xb1, 0x5e, 0xa4,
+	0x8c, 0x56, 0x9a, 0x15, 0xfc, 0xdc, 0xf7, 0xac, 0x75, 0xa8, 0x8e, 0x26, 0xda, 0x67, 0x56, 0x47,
+	0x93, 0xc2, 0xdd, 0x4e, 0xad, 0x78, 0xb7, 0x83, 0x27, 0x64, 0x8a, 0x5a, 0x35, 0x73, 0x5f, 0x60,
+	0x10, 0xa5, 0xbf, 0xaf, 0x41, 0xc7, 0x9b, 0xc6, 0x82, 0x0e, 0x2f, 0xa1, 0xe8, 0x37, 0xf7, 0x14,
+	0x48, 0x48, 0x98, 0xd0, 0x32, 0x15, 0xdf, 0x7b, 0x9a, 0x17, 0x5c, 0x08, 0xd9, 0xf7, 0x9e, 0x5a,
+	0x97, 0x61, 0x53, 0x0f, 0x13, 0xbf, 0xe4, 0xd1, 0x39, 0xeb, 0x5d, 0x67, 0x38, 0xee, 0x8b, 0xfc,
+	0xfa, 0xff, 0x55, 0xd0, 0x91, 0x52, 0x7b, 0x79, 0x34, 0x5c, 0x90, 0x66, 0xa5, 0x1d, 0x66, 0x55,
+	0xa3, 0xc3, 0xec, 0x02, 0xdb, 0x85, 0xf9, 0x1a, 0xad, 0xa6, 0xbd, 0xb4, 0x14, 0x9a, 0x0b, 0xc9,
+	0xad, 0x49, 0x1a, 0x8e, 0x31, 0x40, 0xd2, 0xc7, 0xf5, 0x6b, 0x79, 0xc6, 0x58, 0x77, 0xda, 0x1a,
+	0xa6, 0x4d, 0xa0, 0x10, 0xf4, 0x56, 0x4e, 0x93, 0x15, 0x20, 0x63, 0x89, 0xbe, 0x3d, 0x5f, 0xbd,
+	0x54, 0xbb, 0xdc, 0x72, 0x56, 0x55, 0xc2, 0xd7, 0xf3, 0xb7, 0x61, 0x2d, 0xdb, 0x2a, 0xf7, 0x69,
+	0x34, 0x83, 0x68, 0x68, 0xda, 0xf6, 0x4c, 0x2f, 0x8d, 0x29, 0x17, 0x67, 0x35, 0x88, 0xb8, 0x91,
+	0x66, 0x0c, 0x67, 0xb8, 0x41, 0x4d, 0x5d, 0x39, 0x38, 0x51, 0x8f, 0xf9, 0x52, 0xf2, 0x2c, 0x34,
+	0xc6, 0x51, 0x28, 0x4f, 0xf4, 0xdb, 0x30, 0x7f, 0x58, 0xaf, 0xc3, 0x7a, 0x12, 0x25, 0x22, 0x70,
+	0x63, 0xd9, 0x1f, 0x89, 0x78, 0xc8, 0x32, 0xac, 0x3a, 0x1d, 0x82, 0x3a, 0x1a, 0x88, 0x91, 0xf7,
+	0xd8, 0xd7, 0xef, 0xcb, 0x69, 0xfe, 0x7d, 0xec, 0xf3, 0x9b, 0xae, 0xfd, 0x42, 0xda, 0xaf, 0xed,
+	0x48, 0x45, 0xeb, 0xdd, 0x4f, 0x06, 0xf6, 0x1f, 0xd1, 0xf5, 0x08, 0x3b, 0x06, 0xb2, 0x4f, 0xbe,
+	0x35, 0x2a, 0x0f, 0xca, 0x58, 0x40, 0x4e, 0xfd, 0xc0, 0xb8, 0xd5, 0x5d, 0xa5, 0x6f, 0x6e, 0x77,
+	0x4c, 0xbb, 0xb6, 0x8c, 0xca, 0x42, 0x77, 0x66, 0xa1, 0x32, 0x2f, 0xc3, 0xa6, 0x27, 0xd1, 0x90,
+	0xf8, 0xea, 0xdc, 0xb0, 0xd9, 0x75, 0x82, 0xd3, 0x55, 0x32, 0xb5, 0xad, 0x4b, 0xb8, 0xc0, 0x7d,
+	0xc4, 0xbb, 0x51, 0x10, 0xc8, 0x3e, 0x9a, 0xea, 0x32, 0xa6, 0xce, 0xc3, 0x6a, 0x5f, 0xe4, 0x37,
+	0xcd, 0x0d, 0x67, 0x05, 0x3f, 0xf7, 0xa9, 0x69, 0x85, 0x06, 0x4c, 0x69, 0xb4, 0x10, 0xc2, 0xe2,
+	0xf8, 0x02, 0x95, 0x88, 0x47, 0xfc, 0x50, 0x26, 0x48, 0xf9, 0x0d, 0xa8, 0x4d, 0x64, 0xb2, 0xb0,
+	0x8d, 0xf0, 0x50, 0x26, 0x0e, 0x22, 0xa0, 0x10, 0x82, 0x48, 0x78, 0x2e, 0x7a, 0x01, 0xfe, 0xe7,
+	0x87, 0x55, 0xfc, 0xbe, 0x1d, 0x7a, 0x76, 0x98, 0x7a, 0x8d, 0xbc, 0x27, 0x9c, 0xdb, 0xad, 0xbe,
+	0x4e, 0x23, 0xf9, 0x92, 0xf5, 0xfe, 0x96, 0xae, 0x6d, 0x0f, 0x65, 0xf2, 0xc5, 0x54, 0xc6, 0x27,
+	0xdb, 0x4a, 0xf9, 0x2a, 0xeb, 0x71, 0xd9, 0x85, 0x33, 0x8f, 0x11, 0xea, 0x0a, 0x02, 0x9b, 0xc6,
+	0x59, 0xf4, 0x5a, 0x3c, 0x8d, 0x2c, 0x73, 0xe3, 0x71, 0x4e, 0x67, 0xe6, 0xad, 0xbd, 0x5a, 0x78,
+	0x6b, 0x5f, 0xe2, 0x96, 0x4c, 0x1b, 0xa9, 0x17, 0x6c, 0xc4, 0x3e, 0x2e, 0xe7, 0x16, 0xe3, 0x5d,
+	0xbe, 0x50, 0xa5, 0xb0, 0x50, 0xe9, 0x2e, 0xaa, 0xa7, 0xdb, 0x85, 0xfd, 0x05, 0x1a, 0xfe, 0xa1,
+	0x4c, 0xba, 0x32, 0x61, 0xa8, 0x56, 0xca, 0xbc, 0x64, 0x2e, 0x96, 0xd0, 0xa4, 0xc6, 0x3c, 0x4a,
+	0xce, 0x45, 0x4e, 0xf2, 0x9f, 0xaa, 0x74, 0x6c, 0x64, 0xb2, 0x13, 0x85, 0x5e, 0xbe, 0x14, 0x0a,
+	0xfe, 0x15, 0xa0, 0x96, 0xb6, 0x99, 0x3a, 0x0e, 0x41, 0x5c, 0xc7, 0xed, 0xc0, 0x46, 0x3f, 0x0a,
+	0x3d, 0x4a, 0x8f, 0xbe, 0xfb, 0x9c, 0xf5, 0xe6, 0x7a, 0x3e, 0x83, 0x84, 0x6c, 0xd2, 0xb8, 0xf2,
+	0x9c, 0x15, 0x4f, 0x4e, 0xe3, 0xca, 0x1c, 0x8d, 0xab, 0x66, 0x33, 0xc6, 0x73, 0xd1, 0xb8, 0x9a,
+	0x2a, 0x3b, 0xb3, 0x83, 0xc6, 0x62, 0x3b, 0x58, 0x29, 0xda, 0x41, 0x5c, 0x2a, 0x3b, 0x34, 0x83,
+	0x67, 0xc9, 0xee, 0x83, 0xa2, 0xd2, 0x9e, 0x61, 0x08, 0xa6, 0xc2, 0xae, 0xeb, 0x35, 0xb7, 0xbd,
+	0xe3, 0xed, 0xfe, 0xc8, 0x97, 0xc7, 0x72, 0x8c, 0x59, 0xb5, 0x7c, 0x6c, 0x7d, 0x03, 0x60, 0x22,
+	0x93, 0xe2, 0x92, 0xcd, 0x89, 0x4c, 0x68, 0x45, 0xfb, 0x4f, 0x2b, 0xa5, 0x13, 0x91, 0xd9, 0xa5,
+	0x13, 0xad, 0x37, 0x61, 0x53, 0xe4, 0xf8, 0x66, 0x33, 0xcf, 0x86, 0x01, 0xa7, 0x18, 0xfc, 0x01,
+	0x34, 0x28, 0xc5, 0x3c, 0x45, 0xe6, 0xc6, 0x13, 0xec, 0x87, 0xe8, 0x2a, 0xe7, 0x98, 0xeb, 0xb2,
+	0x43, 0x5b, 0xce, 0xdf, 0x45, 0x68, 0x09, 0xef, 0x58, 0x3b, 0x47, 0x5d, 0xa4, 0x09, 0xef, 0x98,
+	0x7d, 0xe3, 0x09, 0xb5, 0xcc, 0xf3, 0x65, 0x15, 0xae, 0x97, 0xfb, 0x5f, 0x7a, 0x2e, 0xc5, 0x40,
+	0x64, 0x76, 0x13, 0x02, 0x81, 0xb8, 0xe9, 0xea, 0x1d, 0xdd, 0xdb, 0x56, 0x2d, 0xfb, 0x57, 0x8d,
+	0x9c, 0x22, 0xb7, 0xb6, 0xa5, 0xee, 0xbc, 0x96, 0x3f, 0xa8, 0x1c, 0xc0, 0x16, 0x2f, 0x4d, 0xee,
+	0xf0, 0x94, 0x8b, 0xcf, 0xbf, 0xcf, 0x3c, 0xc4, 0x92, 0xe0, 0xf6, 0xd3, 0x89, 0x64, 0xb3, 0xbd,
+	0xb5, 0x73, 0x57, 0x06, 0x13, 0x54, 0xbb, 0x0d, 0x9d, 0x9e, 0x74, 0x47, 0x32, 0x98, 0x48, 0xcf,
+	0x48, 0x70, 0xdb, 0x3d, 0x79, 0x97, 0x60, 0x0f, 0x38, 0xde, 0x2d, 0xc8, 0xb7, 0xed, 0xa0, 0x8c,
+	0xee, 0xe2, 0xcc, 0x7d, 0x6e, 0xb5, 0xea, 0xf2, 0xd5, 0x6a, 0xc5, 0xd5, 0x5c, 0xf4, 0x9c, 0x18,
+	0x58, 0xf6, 0xc3, 0x63, 0x3f, 0x11, 0x69, 0x65, 0x85, 0x32, 0xb9, 0x05, 0x1b, 0x7e, 0x06, 0x5c,
+	0xfc, 0xbc, 0xce, 0x2d, 0x85, 0x29, 0x9e, 0xb3, 0x9e, 0xcf, 0xa1, 0x07, 0xc7, 0xff, 0xac, 0x63,
+	0xe8, 0xca, 0x11, 0xd2, 0x62, 0xf8, 0x22, 0xb4, 0x7a, 0x42, 0x49, 0x57, 0x89, 0x63, 0xa9, 0x5d,
+	0x73, 0xb3, 0xa7, 0xff, 0xdd, 0x0b, 0x07, 0xfb, 0x81, 0xdf, 0xe7, 0xe6, 0x3a, 0x6d, 0x42, 0x04,
+	0xb8, 0x3f, 0x1d, 0x5b, 0xd7, 0xe0, 0x1c, 0xd5, 0x76, 0x06, 0x73, 0xe1, 0x74, 0xdc, 0xcb, 0xba,
+	0xe6, 0xce, 0xe2, 0x68, 0xbe, 0xe0, 0x7d, 0x1a, 0xe3, 0x46, 0x53, 0xfa, 0xcf, 0xb6, 0x69, 0x16,
+	0x3f, 0x5a, 0x0c, 0x79, 0x90, 0xf6, 0xe0, 0xd1, 0x70, 0x76, 0xe7, 0xdb, 0x48, 0x7b, 0xf0, 0x10,
+	0x9c, 0xb6, 0x38, 0xbe, 0x05, 0x67, 0x98, 0xb3, 0xb1, 0x44, 0xb2, 0x79, 0xf6, 0x57, 0x77, 0x36,
+	0x68, 0xe0, 0x80, 0xe0, 0xe4, 0xa8, 0xde, 0x87, 0x2d, 0xc6, 0x8d, 0xe5, 0x24, 0x10, 0x27, 0xae,
+	0x5e, 0x20, 0xcb, 0xfb, 0xea, 0xce, 0x8b, 0x34, 0xee, 0xd0, 0xf0, 0x01, 0x8d, 0xea, 0x12, 0xbe,
+	0x95, 0xf7, 0x98, 0xf3, 0x6d, 0xef, 0x37, 0x0b, 0x32, 0xcf, 0x77, 0x97, 0xf5, 0xaa, 0x37, 0x93,
+	0xb4, 0x4b, 0xbd, 0x0b, 0x2f, 0xd0, 0x05, 0x00, 0x33, 0x98, 0x79, 0xd1, 0x16, 0xd1, 0xf9, 0xd6,
+	0x02, 0x3a, 0xcc, 0xf6, 0x43, 0xc1, 0xd7, 0x78, 0x9b, 0xc2, 0xf3, 0x18, 0xa2, 0xff, 0xb7, 0xc3,
+	0xfa, 0x36, 0xbc, 0x40, 0x37, 0x0f, 0x33, 0x44, 0x81, 0xdb, 0x4c, 0x3c, 0x19, 0x14, 0xd1, 0x3f,
+	0x85, 0x35, 0xe4, 0x21, 0xcb, 0x5d, 0xdb, 0xb4, 0xf8, 0x2b, 0x0b, 0x16, 0x4f, 0xf3, 0x57, 0x10,
+	0x9e, 0x77, 0x8f, 0x53, 0x58, 0xd2, 0x17, 0x2f, 0x86, 0x36, 0xb0, 0xa6, 0xef, 0x21, 0x08, 0x72,
+	0x7f, 0x3a, 0xb6, 0x7f, 0x1d, 0x0f, 0x73, 0x4e, 0x61, 0x4f, 0x6a, 0x3d, 0xeb, 0xff, 0x82, 0x1d,
+	0xca, 0xcc, 0x28, 0xd8, 0xb6, 0x5a, 0x43, 0x59, 0x6e, 0x09, 0xd5, 0x19, 0x4b, 0xb0, 0x07, 0x0b,
+	0x28, 0xe3, 0x11, 0x7c, 0x1b, 0xce, 0xcc, 0x5b, 0x9d, 0xfe, 0x27, 0x49, 0x7f, 0xb9, 0xc5, 0xcd,
+	0xad, 0xf3, 0x3e, 0xbc, 0x6c, 0xae, 0xc3, 0x93, 0x1e, 0xa8, 0xfc, 0x3d, 0x1e, 0x33, 0x17, 0x73,
+	0x05, 0xfd, 0x65, 0xff, 0x55, 0x65, 0xd9, 0xcc, 0xc5, 0x9e, 0x22, 0x0b, 0x06, 0xd5, 0x53, 0x06,
+	0x83, 0x19, 0x5d, 0xd4, 0x66, 0x74, 0x61, 0x30, 0x5a, 0x2f, 0x30, 0xfa, 0x63, 0xea, 0x35, 0x9a,
+	0xb5, 0xb1, 0xfb, 0x51, 0xe2, 0xf7, 0x25, 0x5b, 0x3b, 0x3a, 0x82, 0xa2, 0x98, 0x2a, 0xb3, 0x07,
+	0xd3, 0xbc, 0xc9, 0xa9, 0x16, 0x6f, 0x72, 0xde, 0x83, 0x06, 0x95, 0x64, 0x3a, 0xba, 0x2d, 0xc9,
+	0x2e, 0x18, 0xcf, 0xfe, 0x03, 0xbe, 0x14, 0x11, 0xec, 0xf8, 0xbf, 0xfb, 0x9d, 0xef, 0xa4, 0xce,
+	0xe8, 0x43, 0x68, 0xa1, 0x1f, 0x5a, 0x7e, 0x13, 0x65, 0xcc, 0x73, 0x9a, 0x4a, 0xe7, 0x6e, 0xd6,
+	0x75, 0xa3, 0x42, 0x2b, 0xbb, 0x44, 0x30, 0x66, 0xdd, 0x8b, 0x86, 0x79, 0x89, 0x76, 0x80, 0x8e,
+	0x97, 0x3b, 0xae, 0xb2, 0xae, 0xfd, 0x62, 0x87, 0xb0, 0x51, 0x89, 0x5c, 0x82, 0xb5, 0xac, 0xf9,
+	0x3f, 0x2f, 0x47, 0xe0, 0x91, 0x9e, 0xb8, 0xef, 0xd9, 0x5d, 0xb8, 0x58, 0xd8, 0xd9, 0x97, 0x23,
+	0x29, 0x83, 0x7b, 0xd1, 0x70, 0xdb, 0xa3, 0xab, 0xd4, 0x6b, 0x73, 0x75, 0x64, 0x51, 0x5a, 0x29,
+	0x7a, 0xb1, 0x8c, 0xdc, 0x07, 0x4b, 0xf7, 0x8a, 0xa5, 0xf7, 0x2d, 0x48, 0xeb, 0xea, 0xbc, 0xb0,
+	0xe6, 0xff, 0x75, 0x80, 0x66, 0xe5, 0x62, 0x4a, 0xff, 0x25, 0x57, 0x78, 0x73, 0xff, 0x92, 0x2b,
+	0xbc, 0x25, 0xff, 0x92, 0x2b, 0x3c, 0x87, 0x50, 0xec, 0xef, 0xe7, 0xe2, 0x9a, 0xa5, 0x52, 0x5a,
+	0xb8, 0xe1, 0x24, 0xa3, 0x70, 0xc3, 0xcf, 0x7d, 0xbe, 0xfb, 0xc5, 0x52, 0x34, 0x6b, 0x86, 0xc0,
+	0x0f, 0xde, 0x26, 0xc6, 0xc0, 0x6c, 0xab, 0x7a, 0x9b, 0x54, 0x1d, 0x3d, 0xcf, 0x36, 0x11, 0x91,
+	0xb6, 0xb9, 0x8b, 0x06, 0xf6, 0xa5, 0xaf, 0x46, 0x3b, 0xd1, 0x53, 0x93, 0xc7, 0xb7, 0xa1, 0xf1,
+	0xc4, 0x57, 0x23, 0xb5, 0x70, 0xab, 0x38, 0xc7, 0x61, 0x1c, 0xfb, 0x47, 0xf4, 0x5f, 0x16, 0x3b,
+	0x47, 0xa6, 0xd0, 0x3f, 0x84, 0xb5, 0x5e, 0xe2, 0xf6, 0xa2, 0xc0, 0x37, 0x19, 0x2a, 0x26, 0xa8,
+	0x3b, 0x47, 0x3b, 0x51, 0xe0, 0xb3, 0x27, 0xed, 0x25, 0xe9, 0x6f, 0xeb, 0x9a, 0x8e, 0xb4, 0xc6,
+	0xbf, 0x4e, 0xcd, 0xcd, 0x13, 0x8a, 0x2b, 0x11, 0x0a, 0xc1, 0xf8, 0x6b, 0x67, 0xf3, 0xfb, 0xeb,
+	0xef, 0xbe, 0xf7, 0x91, 0x81, 0xd6, 0x5b, 0xa1, 0x3f, 0x57, 0x7f, 0x16, 0x00, 0x00, 0xff, 0xff,
+	0x0b, 0x72, 0xac, 0x28, 0xa4, 0x40, 0x00, 0x00,
 }