From 2ddfb3ee7f7e72961c72ddc6248210da836aee78 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Mon, 29 Sep 2025 13:52:50 -0400 Subject: [PATCH] update api (#1230) * update api * generated protobuf * updates * generated protobuf --------- Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- protobufs/cloud_replay.proto | 9 ++- replay/cloud_replay.pb.go | 123 +++++++++++++++++++++-------------- replay/cloud_replay.twirp.go | 64 +++++++++--------- 3 files changed, 114 insertions(+), 82 deletions(-) diff --git a/protobufs/cloud_replay.proto b/protobufs/cloud_replay.proto index d7f4a94..bc9a3a6 100644 --- a/protobufs/cloud_replay.proto +++ b/protobufs/cloud_replay.proto @@ -7,6 +7,7 @@ option csharp_namespace = "LiveKit.Proto"; option ruby_package = "LiveKit::Proto"; import "google/protobuf/empty.proto"; +import "livekit_models.proto"; // Experimental (not currently available) service Replay { @@ -20,10 +21,12 @@ service Replay { message ListReplaysRequest { string room_name = 1; // optional + livekit.TokenPagination page_token = 2; } message ListReplaysResponse { repeated ReplayInfo replays = 1; + livekit.TokenPagination next_page_token = 2; } message ReplayInfo { @@ -39,8 +42,8 @@ message DeleteReplayRequest { message PlaybackRequest { string replay_id = 1; - string room_name = 2; // room to play into - int64 start_time = 3; // initial cursor + string playback_room = 2; // name of room to play into + int64 seek_offset = 3; // initial timestamp (ms) } message PlaybackResponse { @@ -49,7 +52,7 @@ message PlaybackResponse { message SeekRequest { string playback_id = 1; - int64 start_time = 2; // initial cursor + int64 seek_offset = 2; // timestamp (ms) } message ClosePlaybackRequest { diff --git a/replay/cloud_replay.pb.go b/replay/cloud_replay.pb.go index 9071704..2f16909 100644 --- a/replay/cloud_replay.pb.go +++ b/replay/cloud_replay.pb.go @@ -7,6 +7,7 @@ package replay import ( + livekit "github.com/livekit/protocol/livekit" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" @@ -23,8 +24,9 @@ const ( ) type ListReplaysRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // optional + state protoimpl.MessageState `protogen:"open.v1"` + RoomName string `protobuf:"bytes,1,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // optional + PageToken *livekit.TokenPagination `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -66,9 +68,17 @@ func (x *ListReplaysRequest) GetRoomName() string { return "" } +func (x *ListReplaysRequest) GetPageToken() *livekit.TokenPagination { + if x != nil { + return x.PageToken + } + return nil +} + type ListReplaysResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Replays []*ReplayInfo `protobuf:"bytes,1,rep,name=replays,proto3" json:"replays,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Replays []*ReplayInfo `protobuf:"bytes,1,rep,name=replays,proto3" json:"replays,omitempty"` + NextPageToken *livekit.TokenPagination `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -110,6 +120,13 @@ func (x *ListReplaysResponse) GetReplays() []*ReplayInfo { return nil } +func (x *ListReplaysResponse) GetNextPageToken() *livekit.TokenPagination { + if x != nil { + return x.NextPageToken + } + return nil +} + type ReplayInfo struct { state protoimpl.MessageState `protogen:"open.v1"` ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` @@ -225,8 +242,8 @@ func (x *DeleteReplayRequest) GetReplayId() string { type PlaybackRequest struct { state protoimpl.MessageState `protogen:"open.v1"` ReplayId string `protobuf:"bytes,1,opt,name=replay_id,json=replayId,proto3" json:"replay_id,omitempty"` - RoomName string `protobuf:"bytes,2,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` // room to play into - StartTime int64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // initial cursor + PlaybackRoom string `protobuf:"bytes,2,opt,name=playback_room,json=playbackRoom,proto3" json:"playback_room,omitempty"` // name of room to play into + SeekOffset int64 `protobuf:"varint,3,opt,name=seek_offset,json=seekOffset,proto3" json:"seek_offset,omitempty"` // initial timestamp (ms) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -268,16 +285,16 @@ func (x *PlaybackRequest) GetReplayId() string { return "" } -func (x *PlaybackRequest) GetRoomName() string { +func (x *PlaybackRequest) GetPlaybackRoom() string { if x != nil { - return x.RoomName + return x.PlaybackRoom } return "" } -func (x *PlaybackRequest) GetStartTime() int64 { +func (x *PlaybackRequest) GetSeekOffset() int64 { if x != nil { - return x.StartTime + return x.SeekOffset } return 0 } @@ -329,7 +346,7 @@ func (x *PlaybackResponse) GetPlaybackId() string { type SeekRequest struct { state protoimpl.MessageState `protogen:"open.v1"` PlaybackId string `protobuf:"bytes,1,opt,name=playback_id,json=playbackId,proto3" json:"playback_id,omitempty"` - StartTime int64 `protobuf:"varint,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` // initial cursor + SeekOffset int64 `protobuf:"varint,2,opt,name=seek_offset,json=seekOffset,proto3" json:"seek_offset,omitempty"` // timestamp (ms) unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -371,9 +388,9 @@ func (x *SeekRequest) GetPlaybackId() string { return "" } -func (x *SeekRequest) GetStartTime() int64 { +func (x *SeekRequest) GetSeekOffset() int64 { if x != nil { - return x.StartTime + return x.SeekOffset } return 0 } @@ -426,11 +443,14 @@ var File_cloud_replay_proto protoreflect.FileDescriptor const file_cloud_replay_proto_rawDesc = "" + "\n" + - "\x12cloud_replay.proto\x12\x06replay\x1a\x1bgoogle/protobuf/empty.proto\"1\n" + + "\x12cloud_replay.proto\x12\x06replay\x1a\x1bgoogle/protobuf/empty.proto\x1a\x14livekit_models.proto\"j\n" + "\x12ListReplaysRequest\x12\x1b\n" + - "\troom_name\x18\x01 \x01(\tR\broomName\"C\n" + + "\troom_name\x18\x01 \x01(\tR\broomName\x127\n" + + "\n" + + "page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\tpageToken\"\x85\x01\n" + "\x13ListReplaysResponse\x12,\n" + - "\areplays\x18\x01 \x03(\v2\x12.replay.ReplayInfoR\areplays\"\x81\x01\n" + + "\areplays\x18\x01 \x03(\v2\x12.replay.ReplayInfoR\areplays\x12@\n" + + "\x0fnext_page_token\x18\x02 \x01(\v2\x18.livekit.TokenPaginationR\rnextPageToken\"\x81\x01\n" + "\n" + "ReplayInfo\x12\x1b\n" + "\treplay_id\x18\x01 \x01(\tR\breplayId\x12\x1b\n" + @@ -439,20 +459,20 @@ const file_cloud_replay_proto_rawDesc = "" + "start_time\x18\x03 \x01(\x03R\tstartTime\x12\x1a\n" + "\bduration\x18\x04 \x01(\x03R\bduration\"2\n" + "\x13DeleteReplayRequest\x12\x1b\n" + - "\treplay_id\x18\x01 \x01(\tR\breplayId\"j\n" + + "\treplay_id\x18\x01 \x01(\tR\breplayId\"t\n" + "\x0fPlaybackRequest\x12\x1b\n" + - "\treplay_id\x18\x01 \x01(\tR\breplayId\x12\x1b\n" + - "\troom_name\x18\x02 \x01(\tR\broomName\x12\x1d\n" + - "\n" + - "start_time\x18\x03 \x01(\x03R\tstartTime\"3\n" + + "\treplay_id\x18\x01 \x01(\tR\breplayId\x12#\n" + + "\rplayback_room\x18\x02 \x01(\tR\fplaybackRoom\x12\x1f\n" + + "\vseek_offset\x18\x03 \x01(\x03R\n" + + "seekOffset\"3\n" + "\x10PlaybackResponse\x12\x1f\n" + "\vplayback_id\x18\x01 \x01(\tR\n" + - "playbackId\"M\n" + + "playbackId\"O\n" + "\vSeekRequest\x12\x1f\n" + "\vplayback_id\x18\x01 \x01(\tR\n" + - "playbackId\x12\x1d\n" + - "\n" + - "start_time\x18\x02 \x01(\x03R\tstartTime\"7\n" + + "playbackId\x12\x1f\n" + + "\vseek_offset\x18\x02 \x01(\x03R\n" + + "seekOffset\"7\n" + "\x14ClosePlaybackRequest\x12\x1f\n" + "\vplayback_id\x18\x01 \x01(\tR\n" + "playbackId2\xc8\x02\n" + @@ -477,33 +497,36 @@ func file_cloud_replay_proto_rawDescGZIP() []byte { var file_cloud_replay_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_cloud_replay_proto_goTypes = []any{ - (*ListReplaysRequest)(nil), // 0: replay.ListReplaysRequest - (*ListReplaysResponse)(nil), // 1: replay.ListReplaysResponse - (*ReplayInfo)(nil), // 2: replay.ReplayInfo - (*DeleteReplayRequest)(nil), // 3: replay.DeleteReplayRequest - (*PlaybackRequest)(nil), // 4: replay.PlaybackRequest - (*PlaybackResponse)(nil), // 5: replay.PlaybackResponse - (*SeekRequest)(nil), // 6: replay.SeekRequest - (*ClosePlaybackRequest)(nil), // 7: replay.ClosePlaybackRequest - (*emptypb.Empty)(nil), // 8: google.protobuf.Empty + (*ListReplaysRequest)(nil), // 0: replay.ListReplaysRequest + (*ListReplaysResponse)(nil), // 1: replay.ListReplaysResponse + (*ReplayInfo)(nil), // 2: replay.ReplayInfo + (*DeleteReplayRequest)(nil), // 3: replay.DeleteReplayRequest + (*PlaybackRequest)(nil), // 4: replay.PlaybackRequest + (*PlaybackResponse)(nil), // 5: replay.PlaybackResponse + (*SeekRequest)(nil), // 6: replay.SeekRequest + (*ClosePlaybackRequest)(nil), // 7: replay.ClosePlaybackRequest + (*livekit.TokenPagination)(nil), // 8: livekit.TokenPagination + (*emptypb.Empty)(nil), // 9: google.protobuf.Empty } var file_cloud_replay_proto_depIdxs = []int32{ - 2, // 0: replay.ListReplaysResponse.replays:type_name -> replay.ReplayInfo - 0, // 1: replay.Replay.ListReplays:input_type -> replay.ListReplaysRequest - 3, // 2: replay.Replay.DeleteReplay:input_type -> replay.DeleteReplayRequest - 4, // 3: replay.Replay.Playback:input_type -> replay.PlaybackRequest - 6, // 4: replay.Replay.Seek:input_type -> replay.SeekRequest - 7, // 5: replay.Replay.Close:input_type -> replay.ClosePlaybackRequest - 1, // 6: replay.Replay.ListReplays:output_type -> replay.ListReplaysResponse - 8, // 7: replay.Replay.DeleteReplay:output_type -> google.protobuf.Empty - 5, // 8: replay.Replay.Playback:output_type -> replay.PlaybackResponse - 8, // 9: replay.Replay.Seek:output_type -> google.protobuf.Empty - 8, // 10: replay.Replay.Close:output_type -> google.protobuf.Empty - 6, // [6:11] is the sub-list for method output_type - 1, // [1:6] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 8, // 0: replay.ListReplaysRequest.page_token:type_name -> livekit.TokenPagination + 2, // 1: replay.ListReplaysResponse.replays:type_name -> replay.ReplayInfo + 8, // 2: replay.ListReplaysResponse.next_page_token:type_name -> livekit.TokenPagination + 0, // 3: replay.Replay.ListReplays:input_type -> replay.ListReplaysRequest + 3, // 4: replay.Replay.DeleteReplay:input_type -> replay.DeleteReplayRequest + 4, // 5: replay.Replay.Playback:input_type -> replay.PlaybackRequest + 6, // 6: replay.Replay.Seek:input_type -> replay.SeekRequest + 7, // 7: replay.Replay.Close:input_type -> replay.ClosePlaybackRequest + 1, // 8: replay.Replay.ListReplays:output_type -> replay.ListReplaysResponse + 9, // 9: replay.Replay.DeleteReplay:output_type -> google.protobuf.Empty + 5, // 10: replay.Replay.Playback:output_type -> replay.PlaybackResponse + 9, // 11: replay.Replay.Seek:output_type -> google.protobuf.Empty + 9, // 12: replay.Replay.Close:output_type -> google.protobuf.Empty + 8, // [8:13] is the sub-list for method output_type + 3, // [3:8] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_cloud_replay_proto_init() } diff --git a/replay/cloud_replay.twirp.go b/replay/cloud_replay.twirp.go index 68c8428..e563a19 100644 --- a/replay/cloud_replay.twirp.go +++ b/replay/cloud_replay.twirp.go @@ -2206,33 +2206,39 @@ func callClientError(ctx context.Context, h *twirp.ClientHooks, err twirp.Error) } var twirpFileDescriptor0 = []byte{ - // 448 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x53, 0x4d, 0x6f, 0xd3, 0x40, - 0x10, 0x95, 0x9d, 0x12, 0x92, 0x09, 0x5f, 0xda, 0x20, 0xb0, 0x1c, 0x10, 0xd1, 0x9e, 0x72, 0x40, - 0x8e, 0x48, 0x0e, 0x48, 0x95, 0xb8, 0x10, 0x8a, 0x54, 0x51, 0x50, 0x65, 0x38, 0x71, 0x89, 0x9c, - 0x78, 0x1a, 0x96, 0xae, 0xbd, 0xc6, 0xbb, 0xae, 0xd4, 0x23, 0x7f, 0x87, 0x5f, 0xc2, 0x6f, 0xe1, - 0x57, 0x20, 0xef, 0x7a, 0x1d, 0xc7, 0x4d, 0x29, 0x52, 0x8f, 0xf3, 0xe6, 0xcd, 0xce, 0x9b, 0xe7, - 0x67, 0x20, 0x6b, 0x2e, 0x8a, 0x78, 0x99, 0x63, 0xc6, 0xa3, 0xcb, 0x20, 0xcb, 0x85, 0x12, 0xa4, - 0x6b, 0x2a, 0x7f, 0xb4, 0x11, 0x62, 0xc3, 0x71, 0xaa, 0xd1, 0x55, 0x71, 0x36, 0xc5, 0x24, 0x53, - 0x15, 0x89, 0xbe, 0x02, 0x72, 0xc2, 0xa4, 0x0a, 0x35, 0x55, 0x86, 0xf8, 0xa3, 0x40, 0xa9, 0xc8, - 0x08, 0xfa, 0xb9, 0x10, 0xc9, 0x32, 0x8d, 0x12, 0xf4, 0x9c, 0xb1, 0x33, 0xe9, 0x87, 0xbd, 0x12, - 0xf8, 0x14, 0x25, 0x48, 0x17, 0x30, 0xdc, 0x19, 0x91, 0x99, 0x48, 0x25, 0x92, 0x97, 0x70, 0xd7, - 0x2c, 0x94, 0x9e, 0x33, 0xee, 0x4c, 0x06, 0x33, 0x12, 0x54, 0x72, 0x0c, 0xf3, 0x38, 0x3d, 0x13, - 0xa1, 0xa5, 0xd0, 0x9f, 0x0e, 0xc0, 0x16, 0xd7, 0x0b, 0x75, 0xb5, 0x64, 0x71, 0xbd, 0xd0, 0xb4, - 0xe3, 0x5d, 0x35, 0xee, 0xae, 0x1a, 0xf2, 0x1c, 0x40, 0xaa, 0x28, 0x57, 0x4b, 0xc5, 0x12, 0xf4, - 0x3a, 0x63, 0x67, 0xd2, 0x09, 0xfb, 0x1a, 0xf9, 0xc2, 0x12, 0x24, 0x3e, 0xf4, 0xe2, 0x22, 0x8f, - 0x14, 0x13, 0xa9, 0x77, 0xa0, 0x9b, 0x75, 0x4d, 0x67, 0x30, 0x7c, 0x87, 0x1c, 0x15, 0x1a, 0x21, - 0xcd, 0xe3, 0xaf, 0xd3, 0x42, 0xbf, 0xc3, 0xc3, 0x53, 0x1e, 0x5d, 0xae, 0xa2, 0xf5, 0xf9, 0xff, - 0xf0, 0x6f, 0xa3, 0x9d, 0xce, 0xe1, 0xd1, 0x76, 0x57, 0xe5, 0xf2, 0x0b, 0x18, 0x64, 0x15, 0xb6, - 0x5d, 0x07, 0x16, 0x3a, 0x8e, 0xe9, 0x47, 0x18, 0x7c, 0x46, 0xac, 0xc5, 0xdd, 0xc4, 0x6f, 0x69, - 0x70, 0xdb, 0x1a, 0x5e, 0xc3, 0xe3, 0x05, 0x17, 0x12, 0xdb, 0x47, 0xdf, 0xf4, 0xee, 0xec, 0xb7, - 0x0b, 0x5d, 0xe3, 0x2b, 0x79, 0x0f, 0x83, 0x46, 0x60, 0x88, 0x6f, 0x73, 0x71, 0x35, 0x78, 0xfe, - 0x68, 0x6f, 0xaf, 0xba, 0x7d, 0x01, 0xf7, 0x9a, 0xdf, 0x8b, 0xd4, 0xe4, 0x3d, 0x5f, 0xd1, 0x7f, - 0x12, 0x98, 0xd8, 0x07, 0x36, 0xf6, 0xc1, 0x51, 0x19, 0x7b, 0xf2, 0x06, 0x7a, 0xf6, 0x16, 0xf2, - 0xd4, 0x3e, 0xd0, 0xba, 0xce, 0xf7, 0xae, 0x36, 0x2a, 0x0d, 0x73, 0x38, 0x28, 0xed, 0x25, 0x43, - 0xcb, 0x68, 0x98, 0xfd, 0x8f, 0x9d, 0x77, 0xb4, 0x89, 0xe4, 0x99, 0x9d, 0xda, 0xe7, 0xe9, 0x75, - 0xe3, 0x6f, 0x8f, 0xbe, 0xd2, 0x0d, 0x53, 0xdf, 0x8a, 0x55, 0xb0, 0x16, 0xc9, 0x94, 0xb3, 0x0b, - 0x3c, 0x67, 0xca, 0xfc, 0xce, 0x6b, 0xc1, 0xa7, 0xe6, 0xc9, 0x5f, 0xee, 0xfd, 0x13, 0x76, 0x81, - 0x1f, 0x98, 0x0a, 0x4e, 0xcb, 0xce, 0x1f, 0xf7, 0x41, 0x55, 0x1f, 0x1e, 0x6a, 0x60, 0xd5, 0xd5, - 0x13, 0xf3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x35, 0xaa, 0x84, 0x15, 0x2c, 0x04, 0x00, 0x00, + // 537 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0x95, 0xdd, 0x12, 0x92, 0x71, 0x43, 0xd1, 0xa6, 0x02, 0xcb, 0x01, 0x35, 0x32, 0x97, 0x1c, + 0x90, 0x23, 0x25, 0x87, 0x4a, 0x95, 0x90, 0x10, 0xa5, 0x48, 0x15, 0x15, 0x8d, 0x4c, 0x4f, 0x5c, + 0x2c, 0x27, 0x9e, 0x98, 0x25, 0xb6, 0xd7, 0x78, 0xd7, 0x15, 0x3d, 0x72, 0xe0, 0x67, 0xf8, 0x12, + 0xbe, 0x85, 0xaf, 0x40, 0xde, 0x5d, 0xbb, 0x69, 0x92, 0x52, 0x38, 0xee, 0x9b, 0xb7, 0x33, 0xef, + 0xbd, 0xf5, 0x18, 0xc8, 0x3c, 0x61, 0x65, 0x14, 0x14, 0x98, 0x27, 0xe1, 0xb5, 0x97, 0x17, 0x4c, + 0x30, 0xd2, 0x52, 0x27, 0xa7, 0x1f, 0x33, 0x16, 0x27, 0x38, 0x92, 0xe8, 0xac, 0x5c, 0x8c, 0x30, + 0xcd, 0x85, 0x26, 0x39, 0x07, 0x09, 0xbd, 0xc2, 0x25, 0x15, 0x41, 0xca, 0x22, 0x4c, 0xb8, 0x42, + 0xdd, 0x2f, 0x40, 0xce, 0x29, 0x17, 0xbe, 0x6c, 0xc0, 0x7d, 0xfc, 0x5a, 0x22, 0x17, 0xa4, 0x0f, + 0x9d, 0x82, 0xb1, 0x34, 0xc8, 0xc2, 0x14, 0x6d, 0x63, 0x60, 0x0c, 0x3b, 0x7e, 0xbb, 0x02, 0x3e, + 0x84, 0x29, 0x92, 0x23, 0x80, 0x3c, 0x8c, 0x31, 0x10, 0x6c, 0x89, 0x99, 0x6d, 0x0e, 0x8c, 0xa1, + 0x35, 0xb6, 0x3d, 0xdd, 0xdd, 0xbb, 0xac, 0xd0, 0x69, 0x18, 0xd3, 0x2c, 0x14, 0x94, 0x65, 0x7e, + 0xa7, 0xe2, 0x4a, 0xd0, 0xfd, 0x61, 0x40, 0xef, 0xd6, 0x30, 0x9e, 0xb3, 0x8c, 0x23, 0x79, 0x09, + 0x0f, 0x95, 0x01, 0x6e, 0x1b, 0x83, 0x9d, 0xa1, 0x35, 0x26, 0x9e, 0xb6, 0xa7, 0x98, 0x67, 0xd9, + 0x82, 0xf9, 0x35, 0x85, 0xbc, 0x86, 0xfd, 0x0c, 0xbf, 0x89, 0xe0, 0x3f, 0x34, 0x74, 0xab, 0x0b, + 0xd3, 0x46, 0xc7, 0x77, 0x03, 0xe0, 0xa6, 0xb3, 0x34, 0x2b, 0x4f, 0x01, 0x8d, 0x1a, 0xb3, 0xaa, + 0x1c, 0xdd, 0x4e, 0xc2, 0x5c, 0x4b, 0xe2, 0x39, 0x00, 0x17, 0x61, 0x21, 0x02, 0x41, 0x53, 0xb4, + 0x77, 0x06, 0xc6, 0x70, 0xc7, 0xef, 0x48, 0xe4, 0x92, 0xa6, 0x48, 0x1c, 0x68, 0x47, 0x65, 0x21, + 0x25, 0xd8, 0xbb, 0xb2, 0xd8, 0x9c, 0xdd, 0x31, 0xf4, 0xde, 0x62, 0x82, 0x02, 0x95, 0x90, 0xd5, + 0xe0, 0xef, 0xd2, 0xe2, 0x0a, 0xd8, 0x9f, 0x26, 0xe1, 0xf5, 0x2c, 0x9c, 0x2f, 0xff, 0x85, 0x4f, + 0x5e, 0x40, 0x37, 0xd7, 0xfc, 0xa0, 0xd2, 0xac, 0xf5, 0xef, 0xd5, 0xa0, 0xcf, 0x58, 0x4a, 0x0e, + 0xc1, 0xe2, 0x88, 0xcb, 0x80, 0x2d, 0x16, 0x1c, 0x85, 0x36, 0x01, 0x15, 0x74, 0x21, 0x11, 0x77, + 0x02, 0x8f, 0x6f, 0xa6, 0xea, 0x17, 0x3b, 0x04, 0xab, 0xe9, 0xdc, 0x0c, 0x86, 0x1a, 0x3a, 0x8b, + 0xdc, 0x0b, 0xb0, 0x3e, 0x22, 0x36, 0x32, 0xef, 0xe3, 0xaf, 0xab, 0x30, 0x37, 0x54, 0x1c, 0xc1, + 0xc1, 0x49, 0xc2, 0x38, 0xae, 0x07, 0x70, 0x5f, 0xe7, 0xf1, 0x2f, 0x13, 0x5a, 0x2a, 0x63, 0xf2, + 0x0e, 0xac, 0x95, 0xcf, 0x8f, 0x38, 0xf5, 0x57, 0xb6, 0xb9, 0x00, 0x4e, 0x7f, 0x6b, 0x4d, 0xbb, + 0x3f, 0x81, 0xbd, 0xd5, 0xb7, 0x23, 0x0d, 0x79, 0xcb, 0x8b, 0x3a, 0x4f, 0x3c, 0xb5, 0x94, 0x5e, + 0xbd, 0x94, 0xde, 0x69, 0xb5, 0x94, 0xe4, 0x15, 0xb4, 0x6b, 0x2f, 0xe4, 0x69, 0xdd, 0x60, 0xcd, + 0x9d, 0x63, 0x6f, 0x16, 0xb4, 0x86, 0x09, 0xec, 0x56, 0x01, 0x93, 0x5e, 0xcd, 0x58, 0x89, 0xfb, + 0x2f, 0x33, 0x1f, 0xc8, 0x10, 0xc9, 0xb3, 0xfa, 0xd6, 0xb6, 0x4c, 0xef, 0xba, 0xfe, 0xe6, 0xf4, + 0x93, 0x1b, 0x53, 0xf1, 0xb9, 0x9c, 0x79, 0x73, 0x96, 0x8e, 0xf4, 0xb2, 0xa9, 0x9f, 0xcd, 0x9c, + 0x25, 0x23, 0xd5, 0xf2, 0xa7, 0xd9, 0x3d, 0xa7, 0x57, 0xf8, 0x9e, 0x0a, 0x6f, 0x5a, 0x55, 0x7e, + 0x9b, 0x8f, 0xf4, 0xf9, 0xf8, 0x58, 0x02, 0xb3, 0x96, 0xbc, 0x31, 0xf9, 0x13, 0x00, 0x00, 0xff, + 0xff, 0x55, 0xd3, 0x9d, 0xa4, 0xca, 0x04, 0x00, 0x00, }