diff --git a/.gitignore b/.gitignore index 4f1ab8e..8ae94c6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /Goleaf Goleaf.tar source/main +playbook/node_modules/* diff --git a/kafka/.vscode/launch.json b/kafka/.vscode/launch.json new file mode 100644 index 0000000..e5dcb5f --- /dev/null +++ b/kafka/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch file", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${file}" + } + ] +} \ No newline at end of file diff --git a/kafka/__debug_bin3625240056.exe b/kafka/__debug_bin3625240056.exe new file mode 100644 index 0000000..88041bd Binary files /dev/null and b/kafka/__debug_bin3625240056.exe differ diff --git a/kafka/conf/conf.yml b/kafka/conf/conf.yml new file mode 100644 index 0000000..34af105 --- /dev/null +++ b/kafka/conf/conf.yml @@ -0,0 +1,14 @@ +db: + host: "localhost" + user: root + password: "hef0YMId4DayV0XuGCLmjNjEAVg=" + port: 3306 +games: + - name: "Merge_Pet_Local" + topic: "Merge_Pet_Local" + partition: 0 + db_name: "Merge_Pet_Local" + - name: "Merge_Pet_Test" + topic: "Merge_Pet_Test" + partition: 0 + db_name: "Merge_Pet_Test" \ No newline at end of file diff --git a/kafka/config/config.go b/kafka/config/config.go new file mode 100644 index 0000000..65122f7 --- /dev/null +++ b/kafka/config/config.go @@ -0,0 +1,98 @@ +package config + +import ( + "fmt" + "log" + "os" + "path/filepath" + + "gopkg.in/yaml.v2" +) + +type Config struct { + DB struct { + Host string `yaml:"host"` + User string `yaml:"user"` + Password string `yaml:"password"` + Port int `yaml:"port"` + } `yaml:"db"` + Games []struct { + Name string `yaml:"name"` + DBName string `yaml:"db_name"` + Topic string `yaml:"topic"` + Partition int `yaml:"partition"` + } `yaml:"games"` +} + +type Game struct { + Name string + DBName string + Topic string + Partition int +} + +type DBConf struct { + Host string + User string + Password string + Port int + DbNamee string +} + +var Conf *Config + +func init() { + var err error + Conf, err = loadConfig("./conf/conf.yml") + if err != nil { + log.Fatalf("Error loading config: %v", err) + } +} + +func loadConfig(filename string) (*Config, error) { + absPath, err := filepath.Abs(filename) + if err != nil { + return nil, err + } + fmt.Println(absPath) + data, err := os.ReadFile(filename) + if err != nil { + return nil, err + } + + var config Config + err = yaml.Unmarshal(data, &config) + if err != nil { + return nil, err + } + + return &config, nil +} + +func GetDbConfig(Key string) *DBConf { + DBConf := &DBConf{} + for _, game := range Conf.Games { + if game.Name == Key { + DBConf.Host = Conf.DB.Host + DBConf.User = Conf.DB.User + DBConf.Password = Conf.DB.Password + DBConf.Port = Conf.DB.Port + DBConf.DbNamee = game.DBName + break + } + } + return DBConf +} + +func GetGames() []*Game { + games := make([]*Game, 0) + for _, game := range Conf.Games { + games = append(games, &Game{ + Name: game.Name, + DBName: game.DBName, + Topic: game.Topic, + Partition: game.Partition, + }) + } + return games +} diff --git a/kafka/db/db.go b/kafka/db/db.go new file mode 100644 index 0000000..534a9cc --- /dev/null +++ b/kafka/db/db.go @@ -0,0 +1,94 @@ +package db + +import ( + "encoding/json" + "kafka-comsumer/config" + "kafka-comsumer/util" + "strconv" + + _ "github.com/go-sql-driver/mysql" + "github.com/jmoiron/sqlx" + "github.com/segmentio/kafka-go" +) + +var Container = map[string]*sqlx.DB{} + +func GetContainer(Key string) *sqlx.DB { + v, ok := Container[Key] + if !ok { + DbConf := config.GetDbConfig(Key) + NewDbPass, _ := util.Decrypt(DbConf.Password, util.SECRET_KEY) + db, err := sqlx.Connect("mysql", DbConf.User+":"+NewDbPass+"@tcp("+DbConf.Host+":"+strconv.Itoa(DbConf.Port)+")/"+DbConf.DbNamee) + if err != nil { + return nil + } + Container[Key] = db + return db + } + return v +} + +func ProcessMsg(SqlDb *sqlx.DB, m kafka.Message) error { + if SqlDb == nil { + return nil + } + // fmt.Printf("Message at offset %d: %s = %s\n", m.Offset, string(m.Key), string(m.Value)) + tx := SqlDb.MustBegin() + var err error + switch string(m.Key) { + case "Login_log": + err = login(SqlDb, m) + case "Login_Out": + err = login(SqlDb, m) + default: + err = event(SqlDb, m) + } + if err != nil { + tx.Rollback() + return err + } + offset(SqlDb, m) + tx.Commit() + // fmt.Println("msg process success") + return nil +} + +func login(SqlDb *sqlx.DB, m kafka.Message) error { + var V map[string]interface{} + json.Unmarshal(m.Value, &V) + sql := "INSERT INTO log_login (`Uid`, `Event`, `Timestamp`) VALUES (?, ?, ?)" + + _, err := SqlDb.Exec(sql, V["Uid"], m.Key, V["TimeStamp"]) + return err +} + +func event(SqlDb *sqlx.DB, m kafka.Message) error { + var V map[string]interface{} + json.Unmarshal(m.Value, &V) + Param, err := json.Marshal(V["Param"]) + if err != nil { + return err + } + sql := "INSERT INTO log_event (`Uid`, `Event`, `Param`, `Timestamp`) VALUES (?, ?, ?, ?)" + _, err = SqlDb.Exec(sql, V["Uid"], m.Key, string(Param), V["TimeStamp"]) + return err +} + +func offset(SqlDb *sqlx.DB, m kafka.Message) error { + sql := " INSERT INTO `log_var` (`Key` , `Value`, `Timestamp`) Values (?,?,?) ON DUPLICATE KEY UPDATE `key` = ? , `Value` = ? ,`Timestamp`=?" + Value := strconv.FormatInt(m.Offset+1, 10) + Timestamp := util.GetNowTime() + _, err := SqlDb.Exec(sql, "offset", Value, Timestamp, "offset", Value, Timestamp) + return err +} + +func GetOffset(SqlDb *sqlx.DB) int64 { + sql := "select `Value` from `log_var` where `Key` = 'offset'" + var offset string + err := SqlDb.Get(&offset, sql) + if offset == "" || err != nil { + return kafka.FirstOffset + } + v, _ := strconv.ParseInt(offset, 10, 64) + return v +} diff --git a/kafka/go.mod b/kafka/go.mod new file mode 100644 index 0000000..541ad42 --- /dev/null +++ b/kafka/go.mod @@ -0,0 +1,17 @@ +module kafka-comsumer + +go 1.23.1 + +require github.com/segmentio/kafka-go v0.4.47 + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/jmoiron/sqlx v1.4.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/stretchr/testify v1.9.0 // indirect + golang.org/x/net v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/kafka/go.sum b/kafka/go.sum new file mode 100644 index 0000000..795c036 --- /dev/null +++ b/kafka/go.sum @@ -0,0 +1,83 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0= +github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/kafka/kafka-comsumer.tar b/kafka/kafka-comsumer.tar new file mode 100644 index 0000000..ca57c65 Binary files /dev/null and b/kafka/kafka-comsumer.tar differ diff --git a/kafka/main.go b/kafka/main.go new file mode 100644 index 0000000..b51f315 --- /dev/null +++ b/kafka/main.go @@ -0,0 +1,78 @@ +package main + +import ( + "context" + "kafka-comsumer/config" + "kafka-comsumer/db" + "log" + "os" + "os/signal" + "sync" + "syscall" + + "github.com/segmentio/kafka-go" +) + +var ( + WorkChan = make(chan *kafka.Message, 100) + Wait sync.WaitGroup +) + +// GOOS=linux GOARCH=amd64 go build -o /data/pet_home_devops/kafka/release/kafka_comsumer main.go + +func main() { + // 打开日志文件 + logFile, err := os.OpenFile("./log/kafka-comsumer.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + log.Fatalf("Failed to open log file: %v", err) + } + defer logFile.Close() + + // 将日志输出重定向到文件 + log.SetOutput(logFile) + log.SetFlags(log.LstdFlags | log.Lshortfile) + Games := config.GetGames() + for _, game := range Games { + go comsumer(game) + } + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) + sig := <-c + log.Printf("kafka comsumer closing down (signal: %v)\n", sig.String()) + Wait.Wait() +} + +func comsumer(Game *config.Game) { + sqlDb := db.GetContainer(Game.Name) + if sqlDb == nil { + log.Printf("comsumer db %s not exist \n", Game.Name) + return + } + r := kafka.NewReader(kafka.ReaderConfig{ + Brokers: []string{"kafka-server:9092"}, + Topic: Game.Topic, + Partition: Game.Partition, + MinBytes: 10e3, // 10KB + MaxBytes: 10e6, // 10MB + }) + defer r.Close() + // 设置读取超时时间 + offset := db.GetOffset(sqlDb) + r.SetOffset(offset) + ctx := context.Background() + log.Println("comsumer start ", Game.Name) + for { + // 读取消息 + m, err := r.ReadMessage(ctx) + if err != nil { + log.Println("comsumer close ", Game.Name) + return + } + Wait.Add(1) + err = db.ProcessMsg(sqlDb, m) + if err != nil { + log.Printf("comsumer %s error :%v", Game.Name, err) + } + Wait.Done() + } +} diff --git a/kafka/release/conf/conf.yml b/kafka/release/conf/conf.yml new file mode 100644 index 0000000..eb1ac63 --- /dev/null +++ b/kafka/release/conf/conf.yml @@ -0,0 +1,14 @@ +db: + host: "rm-f8zd2030feam53n43.mysql.rds.aliyuncs.com" + user: root + password: "V00jJQcC5GQOSEoEXmTfFmBCTk1-g2lBT2n-YA9UUg==" + port: 3306 +games: + - name: "Merge_Pet_Local" + topic: "Merge_Pet_Local" + partition: 0 + db_name: "Merge_Pet_Local" + - name: "Merge_Pet_Test" + topic: "Merge_Pet_Test" + partition: 0 + db_name: "Merge_Pet_Test" \ No newline at end of file diff --git a/kafka/release/kafka_comsumer b/kafka/release/kafka_comsumer new file mode 100644 index 0000000..f2bae31 Binary files /dev/null and b/kafka/release/kafka_comsumer differ diff --git a/kafka/release/log/kafka-comsumer.log b/kafka/release/log/kafka-comsumer.log new file mode 100644 index 0000000..c80a274 --- /dev/null +++ b/kafka/release/log/kafka-comsumer.log @@ -0,0 +1,2 @@ +2024/12/18 07:00:46 main.go:48: comsumer db Merge_Pet_Online not exist +2024/12/18 07:00:46 main.go:63: comsumer start Merge_Pet_Local diff --git a/kafka/release/logs b/kafka/release/logs new file mode 100644 index 0000000..57c186e --- /dev/null +++ b/kafka/release/logs @@ -0,0 +1,2 @@ +/data/pet_home_devops/kafka/release/conf/conf.yml +/data/pet_home_devops/kafka/release/conf/conf.yml diff --git a/kafka/release/start.sh b/kafka/release/start.sh new file mode 100644 index 0000000..5481fb1 --- /dev/null +++ b/kafka/release/start.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# Restart the kafka comsumer service + +# 获取命令行参数 +if [ $# -ne 1 ]; then + echo "Usage: $0 [start|stop|status|restart]" + exit 1 +fi + +if [ $1 == "start" ]; then + echo "Starting kafka comsumer..." + > log/kafka-comsumer.log # 清空 logs 文件 + nohup ./kafka_comsumer >> logs 2>&1 & + echo "kafka comsumer started." +elif [ $1 == "stop" ]; then + echo "Stopping kafka comsumer..." + PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}') + if [ -z $PID ]; then + echo "kafka comsumer is not running." + exit 1 + fi + ps -ef | grep kafka_comsumer | grep -v grep | awk '{print $2}' | xargs kill + echo "kafka comsumer stopped." +elif [ $1 == "status" ]; then + echo "kafka comsumer status:" + PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}') + if [ -z $PID ]; then + echo "kafka comsumer is not running." + else + echo "kafka comsumer is running." + fi +elif [ $1 == "restart" ]; then + echo "Restarting kafka comsumer..." + PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}') + if [ -n $PID ]; then + echo "kafka comsumer stoping." + kill $PID + fi + while [ -n "$PID" ]; do + sleep 1 + PID=$(ps -ef | grep kafka_comsumer | grep -v "grep" | awk '{print $2}') + done + echo "kafka comsumer stoped." + > log/kafka-comsumer.log # 清空 logs 文件 + nohup kafka_comsumer >> logs 2>&1 & + echo "kafka comsumer restarted." +else + echo "Usage: $0 [start|stop|status|restart]" + exit 1 +fi diff --git a/kafka/sql/create.sql b/kafka/sql/create.sql new file mode 100644 index 0000000..4160296 --- /dev/null +++ b/kafka/sql/create.sql @@ -0,0 +1,37 @@ +/*==============================================================*/ +/* Database name: sg_gamedb */ +/* DBMS name: MySQL 5.5.17 */ +/* Created on: 2014-10-16 10:00:00 */ +/*==============================================================*/ + +create database if not exists Merge_Pet_Local CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +use Merge_Pet_Local; + + +CREATE TABLE IF NOT EXISTS `log_var` ( + `Key` varchar(128) DEFAULT '' COMMENT '键', + `Value` varchar(128) DEFAULT '' COMMENT '值', + `Timestamp` int DEFAULT 0 COMMENT '时间', + PRIMARY KEY (`key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录日志'; + +CREATE TABLE IF NOT EXISTS `log_login` ( + `id` int unsigned AUTO_INCREMENT COMMENT '自增id', + `Uid` int unsigned NOT NULL COMMENT '玩家id', + `Event` varchar(128) DEFAULT '' COMMENT '事件', + `Timestamp` int DEFAULT 0 COMMENT '时间', + PRIMARY KEY (`id`), + KEY `Event` (`Event`), + KEY `Uid` (`Uid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录日志'; + +CREATE TABLE IF NOT EXISTS `log_event` ( + `id` int unsigned AUTO_INCREMENT COMMENT '自增id', + `Uid` int unsigned NOT NULL COMMENT '玩家id', + `Event` varchar(128) DEFAULT '' COMMENT '事件', + `Param` text COMMENT '参数', + `Timestamp` int DEFAULT 0 COMMENT '时间', + PRIMARY KEY (`id`), + KEY `Event` (`Event`), + KEY `Uid` (`Uid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作事件'; \ No newline at end of file diff --git a/kafka/unit_test.go b/kafka/unit_test.go new file mode 100644 index 0000000..52e07f9 --- /dev/null +++ b/kafka/unit_test.go @@ -0,0 +1,23 @@ +package main + +import ( + "fmt" + "kafka-comsumer/util" + "testing" +) + +func TestEncrypt(t *testing.T) { + str, err := util.Encrypt("Z4rf7eZZe500dxa", util.SECRET_KEY) + if err != nil { + t.Errorf("Error: %v", err) + } + fmt.Print(str) +} + +func TestDecrypt(t *testing.T) { + str, err := util.Decrypt("V00jJQcC5GQOSEoEXmTfFmBCTk1-g2lBT2n-YA9UUg==", util.SECRET_KEY) + if err != nil { + t.Errorf("Error: %v", err) + } + fmt.Print(str) +} diff --git a/kafka/util/util.go b/kafka/util/util.go new file mode 100644 index 0000000..9274e9f --- /dev/null +++ b/kafka/util/util.go @@ -0,0 +1,64 @@ +package util + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" + "fmt" + "io" + "time" +) + +const ( + SECRET_KEY = ")VQbB(vpy=U(wcp)" +) + +// 加密字符串 +func Encrypt(plainText, key string) (string, error) { + block, err := aes.NewCipher([]byte(key)) + if err != nil { + return "", err + } + + cipherText := make([]byte, aes.BlockSize+len(plainText)) + iv := cipherText[:aes.BlockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + return "", err + } + + stream := cipher.NewCFBEncrypter(block, iv) + stream.XORKeyStream(cipherText[aes.BlockSize:], []byte(plainText)) + + return base64.URLEncoding.EncodeToString(cipherText), nil +} + +// 解密字符串 +func Decrypt(cipherText, key string) (string, error) { + cipherTextBytes, err := base64.URLEncoding.DecodeString(cipherText) + if err != nil { + return "", err + } + + block, err := aes.NewCipher([]byte(key)) + if err != nil { + return "", err + } + + if len(cipherTextBytes) < aes.BlockSize { + return "", fmt.Errorf("cipherText too short") + } + + iv := cipherTextBytes[:aes.BlockSize] + cipherTextBytes = cipherTextBytes[aes.BlockSize:] + + stream := cipher.NewCFBDecrypter(block, iv) + stream.XORKeyStream(cipherTextBytes, cipherTextBytes) + + return string(cipherTextBytes), nil +} + +func GetNowTime() int64 { + T := time.Now() + return T.Unix() +} diff --git a/nginx/gitea.conf b/nginx/gitea.conf new file mode 100644 index 0000000..1ed6f66 --- /dev/null +++ b/nginx/gitea.conf @@ -0,0 +1,40 @@ +server { + listen 80; + server_name gitea.bywaystudios.com; + + # 将 HTTP 请求重定向到 HTTPS + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl; + server_name gitea.bywaystudios.com; + + ssl_certificate /etc/nginx/ssl/gitea.bywaystudios.com.pem; + ssl_certificate_key /etc/nginx/ssl/gitea.bywaystudios.com.key; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location / { + proxy_pass http://localhost:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /kafka { + proxy_pass http://localhost:500/ui; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 可选:配置日志文件 + access_log /var/log/nginx/gitea_access.log; + error_log /var/log/nginx/gitea_error.log; +} + diff --git a/nginx/tcp.conf b/nginx/tcp.conf new file mode 100644 index 0000000..6b38da2 --- /dev/null +++ b/nginx/tcp.conf @@ -0,0 +1,31 @@ +server { + listen 80; + server_name pethome.bywaystudios.com; + + # 将 HTTP 请求重定向到 HTTPS + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl; + server_name pethome.bywaystudios.com; + + ssl_certificate /etc/nginx/ssl/pethome.bywaystudios.com.pem; + ssl_certificate_key /etc/nginx/ssl/pethome.bywaystudios.com.key; + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location / { + proxy_pass http://localhost:8080; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 可选:配置日志文件 + access_log /var/log/nginx/pethome_access.log; + error_log /var/log/nginx/pethome_error.log; +} diff --git a/pack.sh b/pack.sh index a8dfb91..46b317b 100644 --- a/pack.sh +++ b/pack.sh @@ -1,2 +1,2 @@ -cd /data/pet_home/src/server -GOOS=linux GOARCH=amd64 go build -o /data/devops/source/main main.go +cd /data/pet_home_server/src/server +GOOS=linux GOARCH=amd64 go build -o /data/pet_home_devops/source/main main.go diff --git a/playbook/goleaf-com.yml b/playbook/goleaf-com.yml index dbdeabd..9b87999 100644 --- a/playbook/goleaf-com.yml +++ b/playbook/goleaf-com.yml @@ -1,6 +1,6 @@ --- - name: Deploy GoLeaf release - hosts: compose + hosts: zone1 remote_user: root tasks: @@ -12,19 +12,19 @@ # - name: tar # command: tar -xvf /usr/local/Goleaf.tar -C /usr/local/ - name: sh pack.sh - shell: sh /data/devops/pack.sh + shell: sh /data/pet_home_devops/pack.sh delegate_to: localhost - name: copy goleaf copy: - src: /data/devops/source/main + src: /data/pet_home_devops/source/main dest: /usr/local/Goleaf - - name: copy config - copy: - src: /data/docs/tool/out/ - dest: /usr/local/Goleaf/gamedata/config/ - mode: '0777' + # - name: copy config + # copy: + # src: /data/pet_homedocs/tool/out/ + # dest: /usr/local/Goleaf/gamedata/config/ + # mode: '0777' # - name: restart goleaf diff --git a/playbook/goleaf-conf.yml b/playbook/goleaf-conf.yml new file mode 100644 index 0000000..9606e87 --- /dev/null +++ b/playbook/goleaf-conf.yml @@ -0,0 +1,27 @@ +--- +- name: Deploy GoLeaf release + hosts: test + remote_user: root + + tasks: + + + - name: copy config + copy: + src: /data/pet_homedocs/tool/out/ + dest: /usr/local/Goleaf/gamedata/config/ + mode: '0777' + - name: reload config + command: echo "1" > /usr/local/Goleaf/gamedata/config/reload + register: reload_result + + - name: copy config2 + copy: + src: /data/pet_homedocs/tool/out/ + dest: /usr/local/game/gamedata/config/ + mode: '0777' + - name: reload config + command: echo "1" > /usr/local/game/gamedata/config/reload + register: reload_result + + diff --git a/playbook/goleaf-google.yml b/playbook/goleaf-google.yml new file mode 100644 index 0000000..4d02def --- /dev/null +++ b/playbook/goleaf-google.yml @@ -0,0 +1,53 @@ +--- +- name: Deploy GoLeaf release + hosts: google + remote_user: root + vars: + goleaf_src: /data/pet_home_devops/source/main + goleaf_dest: /usr/local/game + config_src: /data/pet_homedocs/tool/out/ + config_dest: /usr/local/game/gamedata/config/ + pack_script: /data/pet_home_devops/pack.sh + tar_file: /usr/local/Goleaf.tar + tar_dest: /usr/local/game + + tasks: + # - name: copy goleaf + # command: tar -cvf /usr/local/Goleaf.tar -C /data/pet_home_devops/Goleaf . + # delegate_to: localhost + # - name: copy tar + # copy: + # src: /usr/local/Goleaf.tar + # dest: /usr/local/game + # - name : untar + # command: tar -xvf /usr/local/game/Goleaf.tar -C /usr/local/game + - name: sh pack.sh + shell: sh /data/pet_home_devops/pack.sh + delegate_to: localhost + - name: stop goleaf + command: sh "{{ goleaf_dest }}"/Restart.sh stop + register: restart_result + + - name: copy goleaf + copy: + src: "{{ goleaf_src }}" + dest: "{{goleaf_dest}}" + + - name: copy goleaf + command: tar -cvf /usr/local/conf.tar -C /data/pet_homedocs/tool/out . + delegate_to: localhost + - name: copy tar + copy: + src: /usr/local/conf.tar + dest: /usr/local/game + - name : untar + command: tar -xvf /usr/local/game/conf.tar -C /usr/local/game/gamedata/config/ + + + - name: restart goleaf + command: sh "{{ goleaf_dest }}"/Restart.sh start + register: restart_result + + - name: show restart result + debug: + var: restart_result.stdout_lines diff --git a/playbook/goleaf-sdk.yml b/playbook/goleaf-sdk.yml new file mode 100644 index 0000000..cee33d0 --- /dev/null +++ b/playbook/goleaf-sdk.yml @@ -0,0 +1,53 @@ +--- +- name: Deploy GoLeaf release + hosts: test + remote_user: root + vars: + goleaf_src: /data/pet_home_devops/source/main + goleaf_dest: /usr/local/game + config_src: /data/pet_homedocs/tool/out/ + config_dest: /usr/local/game/gamedata/config/ + pack_script: /data/pet_home_devops/pack.sh + tar_file: /usr/local/Goleaf.tar + tar_dest: /usr/local/game + + tasks: + # - name: copy goleaf + # command: tar -cvf /usr/local/Goleaf.tar -C /data/pet_home_devops/Goleaf . + # delegate_to: localhost + # - name: copy tar + # copy: + # src: /usr/local/Goleaf.tar + # dest: /usr/local/game + # - name : untar + # command: tar -xvf /usr/local/game/Goleaf.tar -C /usr/local/game + - name: sh pack.sh + shell: sh /data/pet_home_devops/pack.sh + delegate_to: localhost + - name: restart goleaf + command: sh "{{ goleaf_dest }}"/Restart.sh stop + register: restart_result + + - name: copy goleaf + copy: + src: "{{ goleaf_src }}" + dest: "{{goleaf_dest}}" + + - name: copy goleaf + command: tar -cvf /usr/local/conf.tar -C /data/pet_homedocs/tool/out . + delegate_to: localhost + - name: copy tar + copy: + src: /usr/local/conf.tar + dest: /usr/local/game + - name : untar + command: tar -xvf /usr/local/game/conf.tar -C /usr/local/game/gamedata/config/ + + + - name: restart goleaf + command: sh "{{ goleaf_dest }}"/Restart.sh start + register: restart_result + + - name: show restart result + debug: + var: restart_result.stdout_lines diff --git a/playbook/goleaf.yml b/playbook/goleaf.yml index 60eb8a4..550d327 100644 --- a/playbook/goleaf.yml +++ b/playbook/goleaf.yml @@ -4,26 +4,38 @@ remote_user: root tasks: - - name: sh pack.sh - shell: sh /data/devops/pack.sh - delegate_to: localhost + # - name: restart goleaf + # command: sh /usr/local/Goleaf/Restart.sh stop + # register: restart_result + + # - name: sh pack.sh + # shell: sh /data/pet_home_devops/pack.sh + # delegate_to: localhost + + # - name: copy goleaf + # copy: + # src: /data/pet_home_devops/Goleaf/tool/tool + # dest: /usr/local/Goleaf/tool + # - name: copy goleaf + # copy: + # src: /data/pet_home_devops/source/main + # dest: /usr/local/Goleaf - name: copy goleaf + command: tar -cvf /usr/local/conf.tar -C /data/pet_homedocs/tool/out . + delegate_to: localhost + - name: copy tar copy: - src: /data/devops/source/main + src: /usr/local/conf.tar dest: /usr/local/Goleaf - - - name: copy config - copy: - src: /data/docs/tool/out/ - dest: /usr/local/Goleaf/gamedata/config/ - mode: '0777' + - name : untar + command: tar -xvf /usr/local/Goleaf/conf.tar -C /usr/local/Goleaf/gamedata/config/ - - name: restart goleaf - command: sh /usr/local/Goleaf/Restart.sh restart - register: restart_result + # - name: restart goleaf + # command: sh /usr/local/Goleaf/Restart.sh start + # register: restart_result - - name: show restart result - debug: - var: restart_result.stdout_lines + # - name: show restart result + # debug: + # var: restart_result.stdout_lines diff --git a/playbook/hosts b/playbook/hosts index 9481a75..16d895a 100644 --- a/playbook/hosts +++ b/playbook/hosts @@ -1,8 +1,17 @@ [test] -test ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22 +a1 ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22 [compose] -center ansible_ssh_host=172.20.0.2 ansible_ssh_user="root" ansible_ssh_port=22 -zone1 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22 -zone2 ansible_ssh_host=172.20.0.4 ansible_ssh_user="root" ansible_ssh_port=22 +c1 ansible_ssh_host=172.20.0.2 ansible_ssh_user="root" ansible_ssh_port=22 +z1 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22 +z2 ansible_ssh_host=172.20.0.4 ansible_ssh_user="root" ansible_ssh_port=22 +[zone1] +a2 ansible_ssh_host=172.20.0.3 ansible_ssh_user="root" ansible_ssh_port=22 + +[google] +g1 ansible_ssh_host=47.254.83.25 ansible_ssh_user="root" ansible_ssh_port=22 + +[release] +a1 ansible_ssh_host=1.15.182.107 ansible_ssh_user="root" ansible_ssh_port=22 +g1 ansible_ssh_host=47.254.83.25 ansible_ssh_user="root" ansible_ssh_port=22 diff --git a/playbook/package-lock.json b/playbook/package-lock.json new file mode 100644 index 0000000..778da54 --- /dev/null +++ b/playbook/package-lock.json @@ -0,0 +1,1344 @@ +{ + "name": "playbook", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "protobufjs-cli": "^1.1.3" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", + "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "peer": true + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "peer": true + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "peer": true + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "peer": true + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "peer": true + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "peer": true + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "peer": true + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "peer": true + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "peer": true + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==" + }, + "node_modules/@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "peer": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", + "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "peer": true + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs-cli": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.3.tgz", + "integrity": "sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==", + "dependencies": { + "chalk": "^4.0.0", + "escodegen": "^1.13.0", + "espree": "^9.0.0", + "estraverse": "^5.1.0", + "glob": "^8.0.0", + "jsdoc": "^4.0.0", + "minimist": "^1.2.0", + "semver": "^7.1.2", + "tmp": "^0.2.1", + "uglify-js": "^3.7.7" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "protobufjs": "^7.0.0" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "peer": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==" + } + }, + "dependencies": { + "@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + }, + "@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "requires": { + "@babel/types": "^7.26.3" + } + }, + "@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + } + }, + "@jsdoc/salty": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", + "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", + "requires": { + "lodash": "^4.17.21" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "peer": true + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "peer": true + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "peer": true + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "peer": true + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "peer": true, + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "peer": true + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "peer": true + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "peer": true + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "peer": true + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "peer": true + }, + "@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==" + }, + "@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "requires": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==" + }, + "@types/node": { + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "peer": true, + "requires": { + "undici-types": "~6.20.0" + } + }, + "acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "requires": { + "lodash": "^4.17.15" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==" + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "requires": { + "xmlcreate": "^2.0.4" + } + }, + "jsdoc": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", + "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", + "requires": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + } + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "requires": { + "uc.micro": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", + "peer": true + }, + "markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "requires": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + } + }, + "markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "requires": {} + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" + }, + "mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "protobufjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", + "peer": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + }, + "protobufjs-cli": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/protobufjs-cli/-/protobufjs-cli-1.1.3.tgz", + "integrity": "sha512-MqD10lqF+FMsOayFiNOdOGNlXc4iKDCf0ZQPkPR+gizYh9gqUeGTWulABUCdI+N67w5RfJ6xhgX4J8pa8qmMXQ==", + "requires": { + "chalk": "^4.0.0", + "escodegen": "^1.13.0", + "espree": "^9.0.0", + "estraverse": "^5.1.0", + "glob": "^8.0.0", + "jsdoc": "^4.0.0", + "minimist": "^1.2.0", + "semver": "^7.1.2", + "tmp": "^0.2.1", + "uglify-js": "^3.7.7" + } + }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==" + }, + "requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "requires": { + "lodash": "^4.17.21" + } + }, + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" + }, + "uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==" + }, + "underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==" + }, + "undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "peer": true + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==" + } + } +} diff --git a/playbook/package.json b/playbook/package.json new file mode 100644 index 0000000..1a3fdf9 --- /dev/null +++ b/playbook/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "protobufjs-cli": "^1.1.3" + } +} diff --git a/script/20241216.xlsx b/script/20241216.xlsx new file mode 100644 index 0000000..4d1e438 Binary files /dev/null and b/script/20241216.xlsx differ diff --git a/script/mysql.py b/script/mysql.py index 4e97a43..c87c411 100644 --- a/script/mysql.py +++ b/script/mysql.py @@ -22,15 +22,16 @@ server = SSHTunnelForwarder( server.start() db_host = server.local_bind_host db_port = server.local_bind_port -RID = 100016 -MYRID = 100002 +print(db_host, db_port) +RID = 200090 +MYRID = 100004 conn = pymysql.connect( host=db_host, port=db_port, user="root", password="Z4rf7eZZe500dxa", - database="Merge_Pet" + database="Merge_Pet_sdk" ) cursor = conn.cursor() cursor.execute(("select * from t_player_mod where dwUin = {rid}").format(rid = RID)) diff --git a/script/tools.ipynb b/script/tools.ipynb index e69de29..ec4787c 100644 --- a/script/tools.ipynb +++ b/script/tools.ipynb @@ -0,0 +1,2392 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "34\n", + "33\n", + "[44, 45, 62, 64, 87, 108, 128, 145, 165, 183, 225, 226, 244, 246, 262, 264, 266, 267, 284, 285, 287, 289, 302, 304, 306, 521, 542, 562, 901, 923, 1001, 1024, 1044, 1044]\n", + "[44, 45, 62, 64, 108, 128, 145, 165, 183, 225, 226, 244, 246, 262, 264, 266, 267, 284, 285, 287, 289, 302, 304, 306, 521, 542, 562, 901, 923, 1001, 1024, 1044, 1044]\n" + ] + }, + { + "ename": "", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m在当前单元格或上一个单元格中执行代码时 Kernel 崩溃。\n", + "\u001b[1;31m请查看单元格中的代码,以确定故障的可能原因。\n", + "\u001b[1;31m单击此处了解详细信息。\n", + "\u001b[1;31m有关更多详细信息,请查看 Jupyter log。" + ] + } + ], + "source": [ + "str = \"\"\"0@0@1@-1:287 0@1@0@21:108 0@2@0@22:1001 0@6@0@-1:45 0@7@1@-1:226 0@8@2@-1:246 1@0@1@-1:262 1@1@0@10:562 1@2@0@-1:64 1@8@1@-1:244 2@0@1@-1:284 2@1@0@8:145 2@2@0@-1:1024 2@8@0@14:183 3@0@2@-1:302 3@1@1@-1:225 3@2@0@-1:44 3@4@0@-1:521 3@6@0@-1:62 3@7@0@11:165 3@8@1@-1:264 4@0@1@-1:289 4@1@0@18:901 4@2@0@-1:1044 4@8@1@-1:306 5@0@1@-1:304 5@1@0@-1:923 5@2@0@-1:1044 5@7@0@23:87 5@8@1@-1:285 6@0@1@-1:266 6@1@0@-1:542 6@7@0@19:128 6@8@1@-1:267\"\"\"\n", + "\n", + "str2 = \"\"\"267 289 302 287 306 246 285 266 304 262 226 264 542 145 62 225 562 244 165 284 183 901 923 128 1001 108 64 44 45 1044 521 1024 1044\"\"\"\n", + "\n", + "a1 = str.split(\" \")\n", + "a2 = str2.split(\" \")\n", + "print(len(a1))\n", + "print(len(a2))\n", + "l1 = []\n", + "l2 = []\n", + "for i in a1:\n", + " l1.append(int(i.split(\":\")[1]))\n", + "for i in a2:\n", + " l2.append(int(i))\n", + "l1.sort()\n", + "l2.sort()\n", + "print(l1)\n", + "print(l2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ")VQbB(vpy=U(wcp)\n" + ] + } + ], + "source": [ + "import random\n", + "import string\n", + "\n", + "def generate_random_string(length):\n", + " # 定义要使用的字符集\n", + " characters = string.ascii_letters + string.digits + string.punctuation\n", + " # 生成随机字符串\n", + " random_string = ''.join(random.choice(characters) for i in range(length))\n", + " return random_string\n", + "\n", + "# 示例:生成一个长度为 12 的随机字符串\n", + "random_string = generate_random_string(16)\n", + "print(random_string)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "日期时间: 2024-12-18 17:11:43\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "\n", + "# 示例时间戳\n", + "timestamp = 1734513103\n", + "\n", + "# 将时间戳转换为日期时间\n", + "dt_object = datetime.fromtimestamp(timestamp)\n", + "\n", + "# 打印日期时间\n", + "print(\"日期时间:\", dt_object)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n", + "Playroom = 0;\n", + "Piggybank = 1;\n", + "Charge = 2;\n", + "Endless = 3;\n", + "Levupreward = 4;\n", + "Handlechess = 5;\n", + "Handbookreward = 6;\n", + "Orderreward = 7;\n", + "Decoratecost = 8;\n", + "Decorateadd = 9;\n", + "Buychessbaggrid = 10;\n", + "Chessex = 11;\n", + "Cardcollectreward = 12;\n", + "Exstarreward = 13;\n", + "Allcollectreward = 14;\n", + "Guidereward = 15;\n", + "Dailytaskreward = 16;\n", + "Dailyweekreward = 17;\n", + "Buyenergy = 18;\n", + "Sevenloginreward = 19;\n", + "Monthloginreward = 20;\n", + "Fastproducereward = 21;\n", + "Limitsencereward = 22;\n", + "Mailreward = 23;\n", + "Freeshop = 24;\n", + "Chessshop = 25;\n", + "Refreshchessshop = 26;\n", + "Endlessreward = 27;\n", + "Piggybankreward = 28;\n", + "Champshipreward = 29;\n", + "Limiteventreward = 30;\n", + "Champshiprankreward = 31;\n", + "Invite = 32;\n", + "Selectlimitevent = 33;\n", + "Miningtake = 34;\n", + "Miningreward = 35;\n", + "Guesscolor = 36;\n", + "Guesscolorreward = 37;\n", + "Racereward = 38;\n", + "Playroomgame = 39;\n", + "Playroomdraw = 40;\n", + "Playroomchip = 41;\n", + "Playroomflip = 42;\n", + "Friendtreasurefilp = 43;\n", + "Friendtreasureend = 44;\n" + ] + } + ], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/source/docker-ce-26.1.4-1.el7.x86_64.rpm b/source/docker-ce-26.1.4-1.el7.x86_64.rpm new file mode 100644 index 0000000..f6107a3 Binary files /dev/null and b/source/docker-ce-26.1.4-1.el7.x86_64.rpm differ diff --git a/source/mysql80-community-release-el7-11.noarch.rpm b/source/mysql80-community-release-el7-11.noarch.rpm new file mode 100644 index 0000000..842ec37 Binary files /dev/null and b/source/mysql80-community-release-el7-11.noarch.rpm differ diff --git a/ssl/pethome.bywaystudios.com.key b/ssl/pethome.bywaystudios.com.key new file mode 100644 index 0000000..c5bd727 --- /dev/null +++ b/ssl/pethome.bywaystudios.com.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAo6z7cPVcCIu+rT6ywB5dhhpZfCiKQu155+XPR1kmMFwiFVQe +XnzcT5kmdHLJVEZOgV+LM76SeiGi7haF3wH9N9uYUMmp91b4H2IAiybaKGl/Xc7M +WWpn5YJcttCdd3ZfzYqRQoysucmi4qTzSwf3vJqijo+JFmDvolVWO0KtDsRmU6DL +nocygaKROyyCh5HbWZnikb0bUTLYu58zhYvc1eFwrfwjRSPsGDcTbFHWCl1UNnfZ +mWO0ydMnbfzUSQTGJmOVwqFkhMVRGFFjrTRUAeDNQpkr9YN8tGc+111Igq+uAfMc +yrIIlfEy2ltSnu8hxjNb4sk5v9Fv7APkrjGVsQIDAQABAoIBAALK+8Fm/NDyg+iH +fNv1YknDBYrhhpzZjSGtYYOWQr+pgTViKZOzYSKeLbKBl1J8uDzR6T/fsFBgMykJ +flnnU6+Fa9k/dhe2RrNplzIvEaLsTFP79UjptwGK320ixl6yL04d337f6qSci07l +wXcJMquBUf78j22WOt1gxAEGRFcccNj4yTxLOAFUqwegBy9MuH02VCW4z9QEwiWU +MmQHbFIpHreJaIh+CaBWx9CUEzL4iCYqRnmSNgfw5AE0snvXid1tlQT4IBRvcPE4 +I2bRKUcxvckXHpVKbNPv2A43DoWjF+vlGjU6utMfZ5DRJWyn03s4HOAtrUGY48Sj +0kNDbOECgYEAzSZYgqJuNXEzuZ9dYeXwvCdmU+krOUGaRu1gAymkRdSu+KFDxaTs +xnbhbC0uUzSL0idqeUt3DpeV5rGJf8InbCVwTjmV8hKGS9zTMvBWAH4TavZswAJz +/MNKXZ96UR9xRZFU4988pMF/yqliCLUgN8FI0KvAdIiMgJt4XWa0UUkCgYEAzD7s +n9F7vo7ZHYt/L81lviw4+BBk1934LIvZsXadxmUE8S46ZgbqRZHbrErQ4GJGpCsc +tGAsJpubDapGHv8iL5e6eUphHsM1wR18ciCSNjkxcvSiQJcCpzXLgDY8Tg7KxIOF +c+HKH5O+awCIJcRBBZIXgTC6Gxy6IFee/GXNCSkCgYA0h4YQZSENJCBXflv97k/X +Dcug3sqHjanAUZXNGYOLserflQNyf0l1hAkyltsOyRyoQhl8V3tzzBLBEGKhyQgp +I+j+zrX7Vwz2LeQSXgHXfHDiaZjtDXO/nA3VrTk3vnJVmuH+uzGfCkD7lqWYjzBh +tmc7r07HSBOZ9rU6TUsMqQKBgQCEoPPNEB4X7vDj85rCstE3vcW8qACkALrQSnwx +dgIcO6sK5mb7q8/jH0UTy315x7dxkaFRLAZfh7oXFJP2Oty7JP7tFjSc4kx8u6X9 +AlOPrHIE4QCfirApXpBoEE/2rDpVg8ZcKqmy+aC0ISNHyvoiIOzscnTXeD8RE3Tl +F0IeiQKBgAMSt0sbXy7jgBSUgK8GU5Ox2YcstNMJfeXu5F7WjbtuAlwMNJgBLVYd +gM2lEE8xBUx/5wPkbvzJq4tRPzNO5T7AjOnYH1Ul2iz+kEDOZfPVL0OL/VUYFBYg +4SZnnt1jC9aHLHVqVIIJK//9cEfOJZ6mz3DtyX2wDm/tdoFOr4cG +-----END RSA PRIVATE KEY----- diff --git a/ssl/pethome.bywaystudios.com.pem b/ssl/pethome.bywaystudios.com.pem new file mode 100644 index 0000000..c703e1f --- /dev/null +++ b/ssl/pethome.bywaystudios.com.pem @@ -0,0 +1,62 @@ +-----BEGIN CERTIFICATE----- +MIIGCDCCBPCgAwIBAgIQA0IfJS+AMdxZgd8L1fUl/TANBgkqhkiG9w0BAQsFADBu +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg +RFYgVExTIENBIC0gRzIwHhcNMjQxMjA5MDAwMDAwWhcNMjUwMzA5MjM1OTU5WjAj +MSEwHwYDVQQDExhwZXRob21lLmJ5d2F5c3R1ZGlvcy5jb20wggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCjrPtw9VwIi76tPrLAHl2GGll8KIpC7Xnn5c9H +WSYwXCIVVB5efNxPmSZ0cslURk6BX4szvpJ6IaLuFoXfAf0325hQyan3VvgfYgCL +JtooaX9dzsxZamflgly20J13dl/NipFCjKy5yaLipPNLB/e8mqKOj4kWYO+iVVY7 +Qq0OxGZToMuehzKBopE7LIKHkdtZmeKRvRtRMti7nzOFi9zV4XCt/CNFI+wYNxNs +UdYKXVQ2d9mZY7TJ0ydt/NRJBMYmY5XCoWSExVEYUWOtNFQB4M1CmSv1g3y0Zz7X +XUiCr64B8xzKsgiV8TLaW1Ke7yHGM1viyTm/0W/sA+SuMZWxAgMBAAGjggLrMIIC +5zAfBgNVHSMEGDAWgBR435GQX+7erPbFdevVTFVT7yRKtjAdBgNVHQ4EFgQUKDRG +tBU/MaYUiXNhjO+s2+fcgs0wIwYDVR0RBBwwGoIYcGV0aG9tZS5ieXdheXN0dWRp +b3MuY29tMD4GA1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6 +Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw +FAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUH +MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDov +L2NhY2VydHMuZGlnaWNlcnQuY29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFND +QS1HMi5jcnQwDAYDVR0TAQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFo +AHYATnWjJ1yaEMM4W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGTqSjTewAABAMA +RzBFAiBZVs4LrOREOEnv8tQKb5UNFkPVfV2nNqCy24bKLAVr/gIhAMg2KsKQ9a6q +8Wc64AKJx3DjFqLFpCytkTVKtrBp0tUzAHUAcyAiDwgWivnzxKaLCrJqmkoA7vV3 +hYoITQUA1KVCRFkAAAGTqSjTHwAABAMARjBEAiAiy4Xqcy0oqGMDDBRManyt6VmT +jCZRVA+mHBzoQT0NAgIgOCW5513LuInmKGlKi5jxRkIM0xh6te0uIQvt4ze9EekA +dwDm0jFjQHeMwRBBBtdxuc7B0kD2loSG+7qHMh39HjeOUAAAAZOpKNMvAAAEAwBI +MEYCIQDFKi06ApokpmIizAxE+175uD3bIYO9P3+otQg1ZjSiUQIhAJ0SThOlYjU6 +1nvXCCVCrj96Jsb1KuKUdtPAelusunAHMA0GCSqGSIb3DQEBCwUAA4IBAQCoWphr +4DagcE2yZJkgbhtJ05HLnFBqaQQ5+7X6SR/MRAPY65nCKzgntzXvBcpexiF04I2u +ivtR0sH28Riuu+VDL4ltjZQsW20hd0QNeKia4caUaOaX0hEG1EO0sGLfHQI0G+oq +jtEuSQnnzy2El3gs0kORAFqhGkL2q56rscPpandzdF1H5v2CeM54Q9EmCFzwGW7e +NbLm7MSbn0enWs9q/Zjs6+t9n4VYFZw2c8BXDXtrim35ZcJpJZ7D91ve5SaMH5yg +5at5un2nAdDe3D3V1aATz5ebq3M0JHoqkmPE1a3CkzMdfA8CQArmClBn8gquxm/+ +dq4rSsSh89wAz+lO +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH +MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE +eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv +NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch +QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn +NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP +ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI +lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf +BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw +HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C +AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp +Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu +Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG +/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT +MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ +L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi +98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe +xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN +GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2 +n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg== +-----END CERTIFICATE----- diff --git a/tool/Merge_Pet.sql b/tool/Merge_Pet.sql new file mode 100644 index 0000000..8486e71 --- /dev/null +++ b/tool/Merge_Pet.sql @@ -0,0 +1,226 @@ +/*==============================================================*/ +/* Database name: sg_gamedb */ +/* DBMS name: MySQL 5.5.17 */ +/* Created on: 2014-10-16 10:00:00 */ +/*==============================================================*/ + +create database if not exists %database% CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +use %database%; + +-- ---------------------------- +-- Table structure for db_version 版本号,每次更新数据库要改这个地方 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `db_version` ( + `version_2018_02_06_13` int unsigned NOT NULL COMMENT 'version' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库版本号'; + +/*==============================================================*/ +/* Table: t_account 账号表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_account +( + `user_name` varchar(50) NOT NULL, + `user_password` varchar(128) NOT NULL, + `login_time` int unsigned DEFAULT '0' COMMENT '上次登录时间', + `logout_time` int unsigned DEFAULT '0' COMMENT '上次下线时间', + `ip_address` char(24) DEFAULT '' COMMENT '上次登录的ip地址', + `gm_level` int DEFAULT '0' COMMENT 'gm等级', + `platform` varchar(50) DEFAULT '' COMMENT '平台', + `is_online` int unsigned DEFAULT '0' COMMENT '角色是否在线', + `channel` varchar(50) DEFAULT '' COMMENT '渠道号', + `device_id` varchar(256) DEFAULT '' COMMENT '是否为刷榜账号', + `auto_id` bigint NOT NULL auto_increment COMMENT '自增id', + PRIMARY KEY (`auto_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='账号密码对照表'; + +/*==============================================================*/ +/* Table: t_gameserver GameServer表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_gameserver +( + `id` int unsigned COMMENT '服务器id', + `start_time` int unsigned COMMENT '开服时间', + `close_time` int unsigned COMMENT '关服时间', + `is_close` int unsigned COMMENT '是否关服', + primary key(`id`) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='服务器设置'; + + +/*==============================================================*/ +/* Table: t_gameserver_info GameServer信息表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_gameserver_info +( + `id` int unsigned COMMENT '服务器id', + `growthfund_buynum` int unsigned NOT NULL DEFAULT '0' COMMENT '全服购买成长基金数量', + `open_servertime` int unsigned NOT NULL DEFAULT '0' COMMENT '开服时间', + `open_activeflag` int unsigned NOT NULL DEFAULT '0' COMMENT '开服活动完成发放奖励标示', + `DailyRenewTime` int unsigned NOT NULL DEFAULT '0' COMMENT '日常刷新时间', + primary key(`id`) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='全服全局数据'; + + + + + +-- ---------------------------- +-- Table structure for t_player_baseinfo +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `t_player_baseinfo` ( + `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin', + `energy` int unsigned NOT NULL DEFAULT '0' COMMENT '能量', + `star` int unsigned NOT NULL DEFAULT '0' COMMENT '星星', + `recover_time` int unsigned NOT NULL DEFAULT '0' COMMENT '能量开始恢复时间', + `diamond` int unsigned NOT NULL DEFAULT '1' COMMENT '钻石', + `level` int unsigned NOT NULL DEFAULT '0' COMMENT '玩家等级', + `exp` int unsigned zerofill NOT NULL DEFAULT '0' COMMENT '玩家经验', + `start_order_id` varchar(50) DEFAULT NULL COMMENT '配置订单进度', + `music_code` int unsigned NOT NULL DEFAULT '0' COMMENT '音效状态码改为GUID免费改名状态', + `guild` int unsigned NOT NULL DEFAULT '0' COMMENT '引导进度 ', + `pack_unlock_count` int unsigned NOT NULL DEFAULT '0' COMMENT '背包解锁数量', + `last_play_time` int NOT NULL DEFAULT '0' COMMENT '广告能量购买时间', + `EnergyBuyCount` int NOT NULL DEFAULT '0' COMMENT '能量购买次数', + `user_name` varchar(50) NOT NULL COMMENT '玩家账号', + `login_time` int unsigned NOT NULL DEFAULT '0' COMMENT '上次登录时间', + `logout_time` int unsigned NOT NULL DEFAULT '0' COMMENT '上次下线时间', + `todayolinetime` int unsigned NOT NULL DEFAULT '0' COMMENT '当天的累计在线时间', + `rolecreatetime` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间', + `EmitOrderCnt` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间', + `DailyRenewTime` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间', + `NoAd` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间', + `ChampshipsGroupID` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间', + `LastChampGroupID` int unsigned NOT NULL DEFAULT '0' COMMENT '注册帐号时间', + `FaceBookId` varchar(128) DEFAULT '' COMMENT '玩家账号', + PRIMARY KEY (`dwUin`), + KEY `user_name` (`user_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储玩家基本信息'; + +-- ---------------------------- +-- Table: t_player_auto_pup 客户端数据持久化表 +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `t_player_auto_pup` ( + `dwUin` int unsigned NOT NULL COMMENT 'uid', + `ReqKeys` varchar(2048) DEFAULT '' COMMENT 'key', + `ReqVals` varchar(2048) DEFAULT '' COMMENT 'value', + PRIMARY KEY (`dwUin`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储玩家基本信息'; + + + +/*==============================================================*/ +/* Table: t_player_data 玩家模块表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_player_mod +( + `dwUin` int unsigned COMMENT '玩家uid', + `mData` blob DEFAULT NULL COMMENT '数据', + `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', + primary key(`dwUin`) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='玩家模块表'; + + + + +/*==============================================================*/ +/* Table: t_player_data 玩家订单表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_player_charge +( + `id`int unsigned AUTO_INCREMENT COMMENT '订单id', + `Uid` int unsigned NOT NULL COMMENT '玩家id', + `OrderId` varchar(128) DEFAULT '' COMMENT '订单号', + `ProductId` int unsigned NOT NULL DEFAULT '0' COMMENT '商品id', + `ProductName` varchar(128) DEFAULT '' COMMENT '商品名称', + `ProductDesc` varchar(128) DEFAULT '' COMMENT '商品描述', + `Price` float NOT NULL DEFAULT '0' COMMENT '价格', + `Currency` varchar(128) DEFAULT '' COMMENT '货币', + `CreateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '创建时间', + `PayTime` int unsigned NOT NULL DEFAULT '0' COMMENT '支付时间', + `PayStatus` int unsigned NOT NULL DEFAULT '0' COMMENT '支付状态 0 未支付 1 已支付 2 支付失败 3 已发货', + `PayType` int unsigned NOT NULL DEFAULT '0' COMMENT '支付类型', + `PayPlatform` varchar(128) DEFAULT '' COMMENT '支付平台', + `PayChannel` varchar(128) DEFAULT '' COMMENT '支付渠道', + `PayChannelOrderId` varchar(128) DEFAULT '' COMMENT '支付渠道订单号', + `PayChannelUserId` varchar(128) DEFAULT '' COMMENT '支付渠道用户id', + `PayChannelExtra` varchar(128) DEFAULT '' COMMENT '支付渠道额外信息', + primary key(`id`) +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='玩家订单表'; + + + +-- ---------------------------- +-- Table structure for system_mail_info +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `system_mail_info` ( + `mail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '邮件ID', + `title` varchar(128) DEFAULT "" COMMENT '邮件标题', + `content` varchar(2048) DEFAULT "" COMMENT '邮件内容', + `items` varchar(2048) DEFAULT "{}" COMMENT '邮件附件', + `start_time` int unsigned NOT NULL DEFAULT '0' COMMENT '开始时间', + `register_time` int unsigned NOT NULL DEFAULT '0' COMMENT '注册时间', + `end_time` int unsigned NOT NULL DEFAULT '0' COMMENT '结束时间', + `mail_type` int unsigned NOT NULL DEFAULT '0' COMMENT '邮件类型', + `to_uids` varchar(2048) DEFAULT "" COMMENT '发送者ID', + PRIMARY KEY (`mail_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='系统邮件'; + + +-- ---------------------------- +-- Table structure for t_player_daily_task_data +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `t_server_global_data` ( + `Id` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin', + `StartMileStoneSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '里程碑时间', + `StartChampshipsSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛时间', + `InsertChampshipsSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '每半小时插入玩家排行锦标赛时间', + `WaitToRank` text COMMENT '排名数据', + `Limit4CardExclude` text COMMENT '排名数据', + `Limit5CardExclude` text COMMENT '排名数据', + `CurChampshipsId` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛全局Id', + `LastChampshipsId` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛全局Id', + `Limit4Card` int unsigned NOT NULL DEFAULT '0' COMMENT '限时4星金卡ID', + `Limit5Card` int unsigned NOT NULL DEFAULT '0' COMMENT '限时5星金卡ID', + `LimitCardSwapTime` int unsigned NOT NULL DEFAULT '0' COMMENT '限时5星金卡ID', + `OpenSvrTime` int unsigned NOT NULL DEFAULT '0' COMMENT '锦标赛全局Id', + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储玩家基本信息'; + + +/*==============================================================*/ +/* Table: t_player_data 系统模块表 */ +/*==============================================================*/ +CREATE TABLE IF NOT EXISTS t_server_mod +( + `id` int NOT NULL AUTO_INCREMENT primary key, + `key` varchar(128) DEFAULT '' COMMENT '模块key', + `mData` mediumblob DEFAULT NULL COMMENT '数据', + `updateTime` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间' +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci COMMENT='系统模块表'; + + +CREATE TABLE IF NOT EXISTS `t_log_login` ( + `id` int NOT NULL AUTO_INCREMENT primary key, + `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin', + `type` int unsigned NOT NULL DEFAULT '0' COMMENT '日志类型', + `event` varchar(512) DEFAULT '' COMMENT '事件名', + `timestamp` int DEFAULT 0 COMMENT '时间错', + KEY (`dwUin`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家日志'; + +CREATE TABLE IF NOT EXISTS `t_log_evnet` ( + `id` int NOT NULL AUTO_INCREMENT primary key, + `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin', + `type` int unsigned NOT NULL DEFAULT '0' COMMENT '日志类型', + `event` varchar(512) DEFAULT '' COMMENT '事件名', + `param` varchar(512) DEFAULT '' COMMENT '参数', + `timestamp` int DEFAULT 0 COMMENT '时间错', + KEY (`dwUin`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家日志'; + +CREATE TABLE IF NOT EXISTS `t_log_item` ( + `dwUin` int unsigned NOT NULL COMMENT '对应玩家account表中的dwUin', + `type` int unsigned NOT NULL DEFAULT '0' COMMENT '日志类型', + `event` varchar(512) DEFAULT '' COMMENT '事件名', + `timestamp` int DEFAULT 0 COMMENT '时间错', + KEY (`dwUin`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='玩家日志'; \ No newline at end of file diff --git a/tool/app.ini b/tool/app.ini new file mode 100644 index 0000000..a7fa368 --- /dev/null +++ b/tool/app.ini @@ -0,0 +1,31 @@ +[app] +app_name = pet_home +app_id = 1001 +app_path = /data/pet_home_devops/Goleaf +conf_path = /etc/pet_home +[server] +tcp_addr = 3600 +ws_addr = 3700 +listen_addr = 3800 +max_conn = 1000 +remote = pethome.bywaystudios.com + +[mysql] +mysql_user = root +mysql_password = root +mysql_host = 172.20.0.5 +mysql_port = 3306 + +[redis] +redis_host = 172.20.0.6 +redis_port = 6379 + +[cluster] +center_id = 0 +center_host = pethome.bywaystudios.com +center_port = 3800 + +[log] +log_level = debug +te_log_path = /var/log/pet_home/te + diff --git a/tool/go.mod b/tool/go.mod new file mode 100644 index 0000000..6304db1 --- /dev/null +++ b/tool/go.mod @@ -0,0 +1,7 @@ +module tool + +go 1.23.1 + +require gopkg.in/ini.v1 v1.67.0 + +require github.com/stretchr/testify v1.10.0 // indirect diff --git a/tool/go.sum b/tool/go.sum new file mode 100644 index 0000000..be248fb --- /dev/null +++ b/tool/go.sum @@ -0,0 +1,10 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tool/main.go b/tool/main.go new file mode 100644 index 0000000..a725525 --- /dev/null +++ b/tool/main.go @@ -0,0 +1,393 @@ +package main + +import ( + "encoding/json" + "fmt" + "log" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "syscall" + "time" + + "gopkg.in/ini.v1" +) + +// GOOS=linux GOARCH=amd64 go build -o /data/pet_home_devops/Goleaf/tool/tool main.go +var help = ` +Usage: app.ini [options] + +start start the server +stop stop the server +restart restart the server +status get the server status + +` +var cfg *ini.File +var FuncMap map[string]func() error +var dirPath string +var app_path string + +func main() { + FuncMap = make(map[string]func() error) + // 检查是否提供了命令行参数 + if len(os.Args) < 2 { + log.Fatal(help) + } + var err error + + // 获取当前文件的绝对路径 + execPath, err := os.Executable() + if err != nil { + log.Fatal(err) + } + absPath, err := filepath.Abs(execPath) + if err != nil { + log.Fatal(err) + } + // 获取当前文件的绝对路径的文件夹路径 + dirPath = filepath.Dir(absPath) + + // 加载 app.ini 文件 + cfg, err = ini.Load(dirPath + "/app.ini") + if err != nil { + log.Fatal(err) + } + app_path = cfg.Section("app").Key("app_path").String() + register("start", start) + register("stop", stop) + register("install", install) + register("status", status) + register("restart", restart) + funcName := os.Args[1] + if f, ok := FuncMap[funcName]; ok { + e := f() + if e != nil { + log.Fatal(e) + } + } else { + log.Fatal(help) + } +} + +func register(name string, f func() error) { + FuncMap[name] = f +} + +func install() error { + fmt.Println("install") + if len(os.Args) < 4 { + log.Fatal("请输入要安装的服务类型和区号 install [center|node] 区号") + } + serverType := os.Args[2] + zone := os.Args[3] + if serverType != "center" && serverType != "node" { + log.Fatal("请输入正确的服务类型 center|node") + } + AppName := cfg.Section("app").Key("app_name").String() + // 生成服务名 + serviceName := fmt.Sprintf("%s_%s_%s", AppName, serverType, zone) + // 判断文件夹是否存在 + folderPath := fmt.Sprintf("%s/zone/%s", app_path, serviceName) + if _, err := os.Stat(folderPath); os.IsNotExist(err) { + err := os.MkdirAll(folderPath, os.ModePerm) + if err != nil { + log.Fatal(err) + } + fmt.Printf("文件夹 %s 创建成功\n", folderPath) + } else { + fmt.Printf("文件夹 %s 已存在\n", folderPath) + } + + // 生成配置文件 + configPath := fmt.Sprintf("%s/server.json", folderPath) + file, err := os.Create(configPath) + if err != nil { + log.Fatal(err) + } + defer file.Close() + zoneId, _ := strconv.Atoi(zone) + cf, confs := createConfigFile(zoneId, serverType) + file.WriteString(confs) + + // 读取 SQL 文件内容并替换 %database% 字符串 + sqlFilePath := fmt.Sprintf("%s/tool/Merge_Pet.sql", app_path) + sqlContent, err := os.ReadFile(sqlFilePath) + if err != nil { + log.Fatal(err) + } + dbName := cf["DbName"].(string) + modifiedSQL := strings.ReplaceAll(string(sqlContent), "%database%", dbName) + + // 将修改后的内容写入临时文件 + tempSQLFile, err := os.CreateTemp("", "modified_*.sql") + if err != nil { + log.Fatal(err) + } + // defer os.Remove(tempSQLFile.Name()) + _, err = tempSQLFile.WriteString(modifiedSQL) + if err != nil { + log.Fatal(err) + } + tempSQLFile.Close() + + // 创建数据库 + dbUser := cfg.Section("mysql").Key("mysql_user").String() + dbPassword := cfg.Section("mysql").Key("mysql_password").String() + dbHost := cfg.Section("mysql").Key("mysql_host").String() + dbPort := cfg.Section("mysql").Key("mysql_port").String() + fmt.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName)) + createDBCmd := exec.Command("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, "-e", fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s", dbName)) + createDBCmd.Stdout = os.Stdout + createDBCmd.Stderr = os.Stderr + + err = createDBCmd.Run() + if err != nil { + log.Fatal(err) + } + fmt.Println("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name())) + // 执行修改后的 SQL 文件 + cmd := exec.Command("mysql", "-u"+dbUser, "-p"+dbPassword, "-h"+dbHost, "-P"+dbPort, dbName, "-e", fmt.Sprintf("source %s", tempSQLFile.Name())) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + err = cmd.Run() + if err != nil { + log.Fatal(err) + } + cmd = exec.Command("mkdir", cf["LogPath"].(string)) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + if err != nil { + log.Fatal(err) + } + fmt.Printf("SQL 文件 %s 执行成功\n", sqlFilePath) + fmt.Printf("配置文件 %s 创建成功\n", configPath) + return nil +} + +func createConfigFile(Id int, Type string) (map[string]interface{}, string) { + conf := make(map[string]interface{}) + conf["LogLevel"] = cfg.Section("log").Key("log_level").String() + + TcpStartAddr, _ := cfg.Section("server").Key("tcp_addr").Int() + conf["TcpAddr"] = fmt.Sprintf(":%d", TcpStartAddr+Id) + + WsStartAddr, _ := cfg.Section("server").Key("ws_addr").Int() + conf["WsAddr"] = fmt.Sprintf(":%d", WsStartAddr+Id) + + ListenAddr, _ := cfg.Section("server").Key("listen_addr").Int() + + conf["MySqlAddr"] = cfg.Section("mysql").Key("mysql_host").String() + conf["MySqlUsr"] = cfg.Section("mysql").Key("mysql_user").String() + conf["MySqlPwd"] = cfg.Section("mysql").Key("mysql_password").String() + conf["MySqlPort"] = cfg.Section("mysql").Key("mysql_port").String() + MaxConnNum, _ := cfg.Section("server").Key("max_conn").Int() + conf["MaxConnNum"] = MaxConnNum + app_name := cfg.Section("app").Key("app_name").String() + conf["LogPath"] = fmt.Sprintf("%s/zone/%s_%s_%d/log/", app_path, app_name, Type, Id) + conf["DbName"] = fmt.Sprintf("%s_%d", app_name, Id) + + conf["TELOGDIR"] = cfg.Section("log").Key("te_log_path").String() + + conf["GameName"] = app_name + AppId, _ := cfg.Section("app").Key("app_id").Int() + conf["GameId"] = AppId + + conf["ServerType"] = Type + conf["ServerID"] = Id + + conf["ServerOpenTime"] = "2028-01-01 00:00:00" + conf["ServerName"] = fmt.Sprintf("%s_%d", app_name, Id) + conf["ServerStatus"] = 1 + CenterId, _ := cfg.Section("app").Key("center_id").Int() + conf["ServerCenter"] = CenterId + + conf["RedisAddr"] = cfg.Section("redis").Key("redis_host").String() + conf["RedisPort"] = cfg.Section("redis").Key("redis_port").String() + conf["GameConfPath"] = app_path + "/config/" + conf["RemoteAddr"] = fmt.Sprintf("%s:%d", cfg.Section("server").Key("remote").String(), ListenAddr+Id) // 服务器地址 + conf["ListenAddr"] = fmt.Sprintf(":%d", ListenAddr+Id) + conf["CenterAddr"] = fmt.Sprintf("%s:%s", cfg.Section("cluster").Key("center_host").String(), cfg.Section("cluster").Key("center_port").String()) // 服务器地址 + b, _ := json.MarshalIndent(conf, "", " ") + return conf, string(b) +} + +func start() error { + fmt.Println("start") + err := status() + if err == nil { + return err + } + NodeType := os.Args[2] + Zone := os.Args[3] + // 示例命令 + app_name := cfg.Section("app").Key("app_name").String() + + cmdName := app_path + "/main" + cmdArgs := []string{fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone)} + + // 创建命令 + cmd := exec.Command(cmdName, cmdArgs...) + cmd.SysProcAttr = &syscall.SysProcAttr{} + // 创建管道 + stdin, err := cmd.StdinPipe() + if err != nil { + log.Fatal(err) + } + cmd.Env = os.Environ() + // 打开输出文件 + outfile, err := os.OpenFile(fmt.Sprintf("%s/zone/%s_%s_%s/output.log", app_path, app_name, NodeType, Zone), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) + if err != nil { + log.Fatal(err) + } + defer outfile.Close() + + // 重定向标准输出和标准错误到文件 + cmd.Stdout = outfile + cmd.Stderr = outfile + err = cmd.Start() + if err != nil { + log.Fatal(err) + } + + // 打印进程号 + fmt.Printf("进程 %d 已启动\n", cmd.Process.Pid) + + // 发送命令到子进程 + go func() { + time.Sleep(2 * time.Second) // 等待子进程启动 + _, err := stdin.Write([]byte("your_command\n")) + if err != nil { + log.Fatal(err) + } + stdin.Close() + }() + + // 释放与子进程相关的资源 + err = cmd.Process.Release() + if err != nil { + log.Fatal(err) + } + return nil +} + +func stop() error { + fmt.Println("stop") + err := status() + if err != nil { + return err + } + NodeType := os.Args[2] + Zone := os.Args[3] + // 示例命令 + app_name := cfg.Section("app").Key("app_name").String() + processName := fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone) + // 示例进程名称 + + // 获取进程号 + pid, err := getPidByArgs(processName) + if err != nil { + log.Fatal(err) + } + + // 查找进程 + process, err := os.FindProcess(pid) + if err != nil { + log.Fatal(err) + } + + // 关闭进程 + err = process.Kill() + if err != nil { + log.Fatal(err) + } + + // // 等待子进程退出 + // _, err = process.Wait() + // if err != nil { + // log.Fatal(err) + // } + + fmt.Printf("进程 %d 已关闭\n", pid) + return nil +} + +// func getPidByName(name string) (int, error) { +// cmd := exec.Command("pgrep", name) +// output, err := cmd.Output() +// if err != nil { +// return 0, err +// } + +// // 解析输出,获取第一个匹配的进程号 +// outputStr := strings.TrimSpace(string(output)) +// pidStr := strings.Split(outputStr, "\n")[0] +// pid, err := strconv.Atoi(pidStr) +// if err != nil { +// return 0, err +// } + +// return pid, nil +// } + +func getPidByArgs(args string) (int, error) { + cmd := exec.Command("pgrep", "-f", args) + output, err := cmd.Output() + if err != nil { + return 0, err + } + + // 解析输出,获取第一个匹配的进程号 + outputStr := strings.TrimSpace(string(output)) + pidStr := strings.Split(outputStr, "\n")[0] + pid, err := strconv.Atoi(pidStr) + if err != nil { + return 0, err + } + + return pid, nil +} + +func status() error { + NodeType := os.Args[2] + Zone := os.Args[3] + // 示例命令 + app_name := cfg.Section("app").Key("app_name").String() + processName := fmt.Sprintf("%s/zone/%s_%s_%s/server.json", app_path, app_name, NodeType, Zone) + // 示例进程名称 + + // 获取进程号 + pid, err := getPidByArgs(processName) + if err != nil { + return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone) + } + + // 查找进程 + _, err = os.FindProcess(pid) + if err != nil { + return fmt.Errorf("进程 %s_%s 未启动", NodeType, Zone) + } + + fmt.Printf("节点 %s_%s 启动中, 进程号 %d\n", NodeType, Zone, pid) + return nil +} + +func restart() error { + fmt.Println("restart") + err := stop() + if err != nil { + return err + } + for status() == nil { + time.Sleep(1 * time.Second) + } + err = start() + if err != nil { + return err + } + return nil +} diff --git a/tool/tool b/tool/tool new file mode 100644 index 0000000..ad1a5ad Binary files /dev/null and b/tool/tool differ diff --git a/tool/tool.py b/tool/tool.py new file mode 100644 index 0000000..22e9b20 --- /dev/null +++ b/tool/tool.py @@ -0,0 +1,102 @@ +import os +import sys +import subprocess +import configparser + +help_message = """ +Usage: app.ini [options] + +start start the server +stop stop the server +restart restart the server +status get the server status +""" + +cfg = None +FuncMap = {} +dir_path = "" +app_path = "" + +def main(): + global cfg, dir_path, app_path + + if len(sys.argv) < 2: + print(help_message) + sys.exit(1) + + # 获取当前文件的绝对路径 + exec_path = os.path.abspath(sys.argv[0]) + dir_path = os.path.dirname(exec_path) + # print(f"当前文件的绝对路径的文件夹路径: {dir_path}") + + # 加载 app.ini 文件 + cfg = configparser.ConfigParser() + cfg.read(os.path.join(dir_path, "app.ini")) + app_path = cfg.get("app", "app_path") + + register("start", start) + register("stop", stop) + + func_name = sys.argv[1] + if func_name in FuncMap: + FuncMap[func_name]() + else: + print(help_message) + sys.exit(1) + +def register(name, func): + FuncMap[name] = func + +def start(): + print("start") + NodeType = sys.argv[2] + Zone = sys.argv[3] + app_name = cfg.get("app", "app_name") + + cmd_name = app_path + "/main" + cmd_args = [f"{app_path}/zone/{app_name}_{NodeType}_{Zone}/server.json"] + + # 创建命令 + cmd = [cmd_name] + cmd_args + print(cmd) + + # 启动命令 + process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, start_new_session=True) + print(f"p {process.pid} s") + + # 获取命令输出 + stdout, stderr = process.communicate() + print("e:", stdout.decode('utf-8', errors='ignore')) + print("e2:", stderr.decode('utf-8', errors='ignore')) + +def stop(): + print("stop") + NodeType = sys.argv[2] + Zone = sys.argv[3] + app_name = cfg.get("app", "app_name") + process_args = f"{app_path}/zone/{app_name}_{NodeType}_{Zone}/server.json" + + # 获取进程号 + pid = get_pid_by_args(process_args) + if pid is None: + print("未找到进程") + sys.exit(1) + + # 关闭进程 + try: + os.kill(pid, 9) + print(f"进程 {pid} 已关闭") + except OSError as e: + print(f"关闭进程失败: {e}") + sys.exit(1) + +def get_pid_by_args(args): + try: + output = subprocess.check_output(["pgrep", "-f", args]) + pid_str = output.decode().strip().split("\n")[0] + return int(pid_str) + except subprocess.CalledProcessError: + return None + +if __name__ == "__main__": + main() \ No newline at end of file