webclient: Started working on TriggerAction load&store

This commit is contained in:
MaMe82 2018-10-11 00:36:39 +02:00
parent 32147709b3
commit fb7b4ab37f
11 changed files with 476 additions and 566 deletions

View File

@ -1,133 +0,0 @@
package genl_p4wnp1
import (
"fmt"
genl "github.com/mame82/P4wnP1_go/mgenetlink"
nl "github.com/mame82/P4wnP1_go/mnetlink"
"errors"
)
const (
fam_name = "p4wnp1"
dwc2_group_name = "p4wnp1_dwc2_mc"
)
var (
EP4wnP1FamilyMissing = errors.New("Couldn't find generic netlink family for P4wnP1")
EDwc2GrpMissing = errors.New("Couldn't find generic netlink mcast group for P4wnP1 dwc2")
EDwc2GrpJoin = errors.New("Couldn't join generic netlink mcast group for P4wnP1 dwc2")
EWrongFamily = errors.New("Message not from generic netlink family P4wnP1")
)
type Client struct {
genl *genl.Client
fam *genl.Family
running bool
}
func NewClient() (c *Client, err error) {
res := &Client{}
res.genl,err = genl.NewGeNl()
if err != nil { return c,err }
return res,nil
}
func (c *Client) Open() (err error) {
err = c.genl.Open()
if err != nil { return }
// try to find GENL family for P4wnP1
c.fam,err = c.genl.GetFamily(fam_name)
if err != nil {
c.genl.Close()
return EP4wnP1FamilyMissing
}
// try to join group for dwc2
grpId,err := c.fam.GetGroupByName(dwc2_group_name)
if err != nil {
c.genl.Close()
return EDwc2GrpMissing
}
err = c.genl.AddGroupMembership(grpId)
if err != nil {
c.genl.Close()
return EDwc2GrpMissing
}
go c.rcv_loop()
return
}
func (c *Client) rcv_loop() {
c.running = true
// ToDo, make loop stoppable by non-blocking/interruptable socket read a.k.a select with timeout
for c.running {
fmt.Println("\nWaiting for messages from P4wnP1 kernel mods...\n")
msgs,errm := c.genl.Receive()
if errm == nil {
for _,msg := range msgs {
if cmd,errp := c.parseMsg(msg); errp == nil {
switch cmd.Cmd {
case dwc2_cmd_connection_state:
fmt.Println("COMMAND_CONNECTION_STATE")
params,perr := cmd.AttributesFromData()
if perr != nil {
fmt.Println("Couldn't parse params for COMMAND_CONNECTION_STATE")
continue
}
// find
for _,param := range params {
if param.Type == dwc2_attr_connection_state {
fmt.Println("Connection State: ", param.GetDataUint8())
}
}
default:
fmt.Printf("Unknown command:\n%+v\n", cmd)
}
} else {
fmt.Printf("Message ignored:\n%+v\n", msg)
continue
}
}
} else {
fmt.Println("Receive error: ", errm)
}
}
fmt.Println("GenNl rcv loop ended")
}
const (
dwc2_cmd_connection_state = uint8(0)
dwc2_attr_connection_dummy = uint16(0)
dwc2_attr_connection_state = uint16(1)
)
func (c *Client) parseMsg(msg nl.Message) (cmd genl.Message, err error) {
if msg.Type != c.fam.ID {
// Multicast message from different familiy, ignore
err = EWrongFamily
return
}
err = cmd.UnmarshalBinary(msg.GetData())
if err != nil { return }
return
}
func (c *Client) Close() (err error) {
c.running = false
// leave dwc2 group
if grpId,err := c.fam.GetGroupByName(dwc2_group_name); err == nil {
c.genl.DropGroupMembership(grpId)
}
// close soket
return c.genl.Close()
}

View File

@ -9,7 +9,6 @@
It has these top-level messages:
TriggerActionSet
TriggerActionSetRequestStorage
TriggerAction
TriggerServiceStarted
TriggerUSBGadgetConnected
@ -347,6 +346,7 @@ func (x EthernetInterfaceSettings_Mode) String() string {
// Triggers, Actions and resulting TriggerActions
type TriggerActionSet struct {
TriggerActions []*TriggerAction
Name string
}
// GetTriggerActions gets the TriggerActions of the TriggerActionSet.
@ -357,6 +357,14 @@ func (m *TriggerActionSet) GetTriggerActions() (x []*TriggerAction) {
return m.TriggerActions
}
// GetName gets the Name of the TriggerActionSet.
func (m *TriggerActionSet) GetName() (x string) {
if m == nil {
return x
}
return m.Name
}
// MarshalToWriter marshals TriggerActionSet to the provided writer.
func (m *TriggerActionSet) MarshalToWriter(writer jspb.Writer) {
if m == nil {
@ -369,6 +377,10 @@ func (m *TriggerActionSet) MarshalToWriter(writer jspb.Writer) {
})
}
if len(m.Name) > 0 {
writer.WriteString(2, m.Name)
}
return
}
@ -391,6 +403,8 @@ func (m *TriggerActionSet) UnmarshalFromReader(reader jspb.Reader) *TriggerActio
reader.ReadMessage(func() {
m.TriggerActions = append(m.TriggerActions, new(TriggerAction).UnmarshalFromReader(reader))
})
case 2:
m.Name = reader.ReadString()
default:
reader.SkipField()
}
@ -412,88 +426,6 @@ func (m *TriggerActionSet) Unmarshal(rawBytes []byte) (*TriggerActionSet, error)
return m, nil
}
type TriggerActionSetRequestStorage struct {
TemplateName string
Set *TriggerActionSet
}
// GetTemplateName gets the TemplateName of the TriggerActionSetRequestStorage.
func (m *TriggerActionSetRequestStorage) GetTemplateName() (x string) {
if m == nil {
return x
}
return m.TemplateName
}
// GetSet gets the Set of the TriggerActionSetRequestStorage.
func (m *TriggerActionSetRequestStorage) GetSet() (x *TriggerActionSet) {
if m == nil {
return x
}
return m.Set
}
// MarshalToWriter marshals TriggerActionSetRequestStorage to the provided writer.
func (m *TriggerActionSetRequestStorage) MarshalToWriter(writer jspb.Writer) {
if m == nil {
return
}
if len(m.TemplateName) > 0 {
writer.WriteString(1, m.TemplateName)
}
if m.Set != nil {
writer.WriteMessage(2, func() {
m.Set.MarshalToWriter(writer)
})
}
return
}
// Marshal marshals TriggerActionSetRequestStorage to a slice of bytes.
func (m *TriggerActionSetRequestStorage) Marshal() []byte {
writer := jspb.NewWriter()
m.MarshalToWriter(writer)
return writer.GetResult()
}
// UnmarshalFromReader unmarshals a TriggerActionSetRequestStorage from the provided reader.
func (m *TriggerActionSetRequestStorage) UnmarshalFromReader(reader jspb.Reader) *TriggerActionSetRequestStorage {
for reader.Next() {
if m == nil {
m = &TriggerActionSetRequestStorage{}
}
switch reader.GetFieldNumber() {
case 1:
m.TemplateName = reader.ReadString()
case 2:
reader.ReadMessage(func() {
m.Set = m.Set.UnmarshalFromReader(reader)
})
default:
reader.SkipField()
}
}
return m
}
// Unmarshal unmarshals a TriggerActionSetRequestStorage from a slice of bytes.
func (m *TriggerActionSetRequestStorage) Unmarshal(rawBytes []byte) (*TriggerActionSetRequestStorage, error) {
reader := jspb.NewReader(rawBytes)
m = m.UnmarshalFromReader(reader)
if err := reader.Err(); err != nil {
return nil, err
}
return m, nil
}
type TriggerAction struct {
Id uint32
OneShot bool
@ -5210,7 +5142,7 @@ type P4WNP1Client interface {
ListStoredWifiSettings(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
// TriggerActions
ListStoredTriggerActionSets(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
StoreTriggerActionSets(ctx context.Context, in *TriggerActionSetRequestStorage, opts ...grpcweb.CallOption) (*Empty, error)
StoreTriggerActionSets(ctx context.Context, in *TriggerActionSet, opts ...grpcweb.CallOption) (*Empty, error)
GetTriggerActionsState(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*TriggerActionSet, error)
DeployTriggerActionSetReplace(ctx context.Context, in *TriggerActionSet, opts ...grpcweb.CallOption) (*TriggerActionSet, error)
DeployTriggerActionSetAdd(ctx context.Context, in *TriggerActionSet, opts ...grpcweb.CallOption) (*TriggerActionSet, error)
@ -5538,7 +5470,7 @@ func (c *p4WNP1Client) ListStoredTriggerActionSets(ctx context.Context, in *Empt
return new(StringMessageArray).Unmarshal(resp)
}
func (c *p4WNP1Client) StoreTriggerActionSets(ctx context.Context, in *TriggerActionSetRequestStorage, opts ...grpcweb.CallOption) (*Empty, error) {
func (c *p4WNP1Client) StoreTriggerActionSets(ctx context.Context, in *TriggerActionSet, opts ...grpcweb.CallOption) (*Empty, error) {
resp, err := c.client.RPCCall(ctx, "StoreTriggerActionSets", in.Marshal(), opts...)
if err != nil {
return nil, err

View File

@ -9,7 +9,6 @@ It is generated from these files:
It has these top-level messages:
TriggerActionSet
TriggerActionSetRequestStorage
TriggerAction
TriggerServiceStarted
TriggerUSBGadgetConnected
@ -333,7 +332,7 @@ func (x ActionDeploySettingsTemplate_TemplateType) String() string {
return proto.EnumName(ActionDeploySettingsTemplate_TemplateType_name, int32(x))
}
func (ActionDeploySettingsTemplate_TemplateType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{15, 0}
return fileDescriptor0, []int{14, 0}
}
type EthernetInterfaceSettings_Mode int32
@ -362,12 +361,13 @@ func (x EthernetInterfaceSettings_Mode) String() string {
return proto.EnumName(EthernetInterfaceSettings_Mode_name, int32(x))
}
func (EthernetInterfaceSettings_Mode) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{45, 0}
return fileDescriptor0, []int{44, 0}
}
// Triggers, Actions and resulting TriggerActions
type TriggerActionSet struct {
TriggerActions []*TriggerAction `protobuf:"bytes,1,rep,name=TriggerActions" json:"TriggerActions,omitempty"`
Name string `protobuf:"bytes,2,opt,name=Name" json:"Name,omitempty"`
}
func (m *TriggerActionSet) Reset() { *m = TriggerActionSet{} }
@ -382,30 +382,13 @@ func (m *TriggerActionSet) GetTriggerActions() []*TriggerAction {
return nil
}
type TriggerActionSetRequestStorage struct {
TemplateName string `protobuf:"bytes,1,opt,name=TemplateName" json:"TemplateName,omitempty"`
Set *TriggerActionSet `protobuf:"bytes,2,opt,name=set" json:"set,omitempty"`
}
func (m *TriggerActionSetRequestStorage) Reset() { *m = TriggerActionSetRequestStorage{} }
func (m *TriggerActionSetRequestStorage) String() string { return proto.CompactTextString(m) }
func (*TriggerActionSetRequestStorage) ProtoMessage() {}
func (*TriggerActionSetRequestStorage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (m *TriggerActionSetRequestStorage) GetTemplateName() string {
func (m *TriggerActionSet) GetName() string {
if m != nil {
return m.TemplateName
return m.Name
}
return ""
}
func (m *TriggerActionSetRequestStorage) GetSet() *TriggerActionSet {
if m != nil {
return m.Set
}
return nil
}
type TriggerAction struct {
Id uint32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
OneShot bool `protobuf:"varint,2,opt,name=oneShot" json:"oneShot,omitempty"`
@ -436,7 +419,7 @@ type TriggerAction struct {
func (m *TriggerAction) Reset() { *m = TriggerAction{} }
func (m *TriggerAction) String() string { return proto.CompactTextString(m) }
func (*TriggerAction) ProtoMessage() {}
func (*TriggerAction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (*TriggerAction) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
type isTriggerAction_Trigger interface {
isTriggerAction_Trigger()
@ -1022,7 +1005,7 @@ type TriggerServiceStarted struct {
func (m *TriggerServiceStarted) Reset() { *m = TriggerServiceStarted{} }
func (m *TriggerServiceStarted) String() string { return proto.CompactTextString(m) }
func (*TriggerServiceStarted) ProtoMessage() {}
func (*TriggerServiceStarted) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (*TriggerServiceStarted) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
type TriggerUSBGadgetConnected struct {
}
@ -1030,7 +1013,7 @@ type TriggerUSBGadgetConnected struct {
func (m *TriggerUSBGadgetConnected) Reset() { *m = TriggerUSBGadgetConnected{} }
func (m *TriggerUSBGadgetConnected) String() string { return proto.CompactTextString(m) }
func (*TriggerUSBGadgetConnected) ProtoMessage() {}
func (*TriggerUSBGadgetConnected) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (*TriggerUSBGadgetConnected) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
type TriggerUSBGadgetDisconnected struct {
}
@ -1038,7 +1021,7 @@ type TriggerUSBGadgetDisconnected struct {
func (m *TriggerUSBGadgetDisconnected) Reset() { *m = TriggerUSBGadgetDisconnected{} }
func (m *TriggerUSBGadgetDisconnected) String() string { return proto.CompactTextString(m) }
func (*TriggerUSBGadgetDisconnected) ProtoMessage() {}
func (*TriggerUSBGadgetDisconnected) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (*TriggerUSBGadgetDisconnected) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
type TriggerWifiAPStarted struct {
}
@ -1046,7 +1029,7 @@ type TriggerWifiAPStarted struct {
func (m *TriggerWifiAPStarted) Reset() { *m = TriggerWifiAPStarted{} }
func (m *TriggerWifiAPStarted) String() string { return proto.CompactTextString(m) }
func (*TriggerWifiAPStarted) ProtoMessage() {}
func (*TriggerWifiAPStarted) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (*TriggerWifiAPStarted) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
type TriggerWifiConnectedAsSta struct {
}
@ -1054,7 +1037,7 @@ type TriggerWifiConnectedAsSta struct {
func (m *TriggerWifiConnectedAsSta) Reset() { *m = TriggerWifiConnectedAsSta{} }
func (m *TriggerWifiConnectedAsSta) String() string { return proto.CompactTextString(m) }
func (*TriggerWifiConnectedAsSta) ProtoMessage() {}
func (*TriggerWifiConnectedAsSta) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (*TriggerWifiConnectedAsSta) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
type TriggerSSHLogin struct {
LoginUser string `protobuf:"bytes,1,opt,name=loginUser" json:"loginUser,omitempty"`
@ -1063,7 +1046,7 @@ type TriggerSSHLogin struct {
func (m *TriggerSSHLogin) Reset() { *m = TriggerSSHLogin{} }
func (m *TriggerSSHLogin) String() string { return proto.CompactTextString(m) }
func (*TriggerSSHLogin) ProtoMessage() {}
func (*TriggerSSHLogin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (*TriggerSSHLogin) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (m *TriggerSSHLogin) GetLoginUser() string {
if m != nil {
@ -1078,7 +1061,7 @@ type TriggerDHCPLeaseGranted struct {
func (m *TriggerDHCPLeaseGranted) Reset() { *m = TriggerDHCPLeaseGranted{} }
func (m *TriggerDHCPLeaseGranted) String() string { return proto.CompactTextString(m) }
func (*TriggerDHCPLeaseGranted) ProtoMessage() {}
func (*TriggerDHCPLeaseGranted) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (*TriggerDHCPLeaseGranted) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
type TriggerGroupReceive struct {
GroupName string `protobuf:"bytes,1,opt,name=groupName" json:"groupName,omitempty"`
@ -1088,7 +1071,7 @@ type TriggerGroupReceive struct {
func (m *TriggerGroupReceive) Reset() { *m = TriggerGroupReceive{} }
func (m *TriggerGroupReceive) String() string { return proto.CompactTextString(m) }
func (*TriggerGroupReceive) ProtoMessage() {}
func (*TriggerGroupReceive) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (*TriggerGroupReceive) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *TriggerGroupReceive) GetGroupName() string {
if m != nil {
@ -1113,7 +1096,7 @@ type TriggerGroupReceiveSequence struct {
func (m *TriggerGroupReceiveSequence) Reset() { *m = TriggerGroupReceiveSequence{} }
func (m *TriggerGroupReceiveSequence) String() string { return proto.CompactTextString(m) }
func (*TriggerGroupReceiveSequence) ProtoMessage() {}
func (*TriggerGroupReceiveSequence) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (*TriggerGroupReceiveSequence) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (m *TriggerGroupReceiveSequence) GetGroupName() string {
if m != nil {
@ -1145,7 +1128,7 @@ type TriggerGPIOIn struct {
func (m *TriggerGPIOIn) Reset() { *m = TriggerGPIOIn{} }
func (m *TriggerGPIOIn) String() string { return proto.CompactTextString(m) }
func (*TriggerGPIOIn) ProtoMessage() {}
func (*TriggerGPIOIn) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (*TriggerGPIOIn) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *TriggerGPIOIn) GetGpioNum() GPIONum {
if m != nil {
@ -1175,7 +1158,7 @@ type ActionStartBashScript struct {
func (m *ActionStartBashScript) Reset() { *m = ActionStartBashScript{} }
func (m *ActionStartBashScript) String() string { return proto.CompactTextString(m) }
func (*ActionStartBashScript) ProtoMessage() {}
func (*ActionStartBashScript) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (*ActionStartBashScript) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *ActionStartBashScript) GetScriptName() string {
if m != nil {
@ -1191,7 +1174,7 @@ type ActionStartHIDScript struct {
func (m *ActionStartHIDScript) Reset() { *m = ActionStartHIDScript{} }
func (m *ActionStartHIDScript) String() string { return proto.CompactTextString(m) }
func (*ActionStartHIDScript) ProtoMessage() {}
func (*ActionStartHIDScript) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*ActionStartHIDScript) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *ActionStartHIDScript) GetScriptName() string {
if m != nil {
@ -1208,7 +1191,7 @@ type ActionDeploySettingsTemplate struct {
func (m *ActionDeploySettingsTemplate) Reset() { *m = ActionDeploySettingsTemplate{} }
func (m *ActionDeploySettingsTemplate) String() string { return proto.CompactTextString(m) }
func (*ActionDeploySettingsTemplate) ProtoMessage() {}
func (*ActionDeploySettingsTemplate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (*ActionDeploySettingsTemplate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *ActionDeploySettingsTemplate) GetTemplateName() string {
if m != nil {
@ -1230,7 +1213,7 @@ type ActionLog struct {
func (m *ActionLog) Reset() { *m = ActionLog{} }
func (m *ActionLog) String() string { return proto.CompactTextString(m) }
func (*ActionLog) ProtoMessage() {}
func (*ActionLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*ActionLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
type ActionGPIOOut struct {
GpioNum GPIONum `protobuf:"varint,1,opt,name=gpioNum,enum=P4wnP1_grpc.GPIONum" json:"gpioNum,omitempty"`
@ -1240,7 +1223,7 @@ type ActionGPIOOut struct {
func (m *ActionGPIOOut) Reset() { *m = ActionGPIOOut{} }
func (m *ActionGPIOOut) String() string { return proto.CompactTextString(m) }
func (*ActionGPIOOut) ProtoMessage() {}
func (*ActionGPIOOut) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*ActionGPIOOut) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *ActionGPIOOut) GetGpioNum() GPIONum {
if m != nil {
@ -1264,7 +1247,7 @@ type ActionGroupSend struct {
func (m *ActionGroupSend) Reset() { *m = ActionGroupSend{} }
func (m *ActionGroupSend) String() string { return proto.CompactTextString(m) }
func (*ActionGroupSend) ProtoMessage() {}
func (*ActionGroupSend) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*ActionGroupSend) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *ActionGroupSend) GetGroupName() string {
if m != nil {
@ -1288,7 +1271,7 @@ type WifiRequestSettingsStorage struct {
func (m *WifiRequestSettingsStorage) Reset() { *m = WifiRequestSettingsStorage{} }
func (m *WifiRequestSettingsStorage) String() string { return proto.CompactTextString(m) }
func (*WifiRequestSettingsStorage) ProtoMessage() {}
func (*WifiRequestSettingsStorage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (*WifiRequestSettingsStorage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *WifiRequestSettingsStorage) GetTemplateName() string {
if m != nil {
@ -1321,7 +1304,7 @@ type WiFiSettings struct {
func (m *WiFiSettings) Reset() { *m = WiFiSettings{} }
func (m *WiFiSettings) String() string { return proto.CompactTextString(m) }
func (*WiFiSettings) ProtoMessage() {}
func (*WiFiSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (*WiFiSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *WiFiSettings) GetName() string {
if m != nil {
@ -1403,7 +1386,7 @@ type WiFiState struct {
func (m *WiFiState) Reset() { *m = WiFiState{} }
func (m *WiFiState) String() string { return proto.CompactTextString(m) }
func (*WiFiState) ProtoMessage() {}
func (*WiFiState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (*WiFiState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *WiFiState) GetMode() WiFiStateMode {
if m != nil {
@ -1441,7 +1424,7 @@ type WiFiBSSCfg struct {
func (m *WiFiBSSCfg) Reset() { *m = WiFiBSSCfg{} }
func (m *WiFiBSSCfg) String() string { return proto.CompactTextString(m) }
func (*WiFiBSSCfg) ProtoMessage() {}
func (*WiFiBSSCfg) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (*WiFiBSSCfg) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *WiFiBSSCfg) GetSSID() string {
if m != nil {
@ -1465,7 +1448,7 @@ type StringMessage struct {
func (m *StringMessage) Reset() { *m = StringMessage{} }
func (m *StringMessage) String() string { return proto.CompactTextString(m) }
func (*StringMessage) ProtoMessage() {}
func (*StringMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (*StringMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *StringMessage) GetMsg() string {
if m != nil {
@ -1481,7 +1464,7 @@ type StringMessageArray struct {
func (m *StringMessageArray) Reset() { *m = StringMessageArray{} }
func (m *StringMessageArray) String() string { return proto.CompactTextString(m) }
func (*StringMessageArray) ProtoMessage() {}
func (*StringMessageArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (*StringMessageArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (m *StringMessageArray) GetMsgArray() []string {
if m != nil {
@ -1498,7 +1481,7 @@ type EventRequest struct {
func (m *EventRequest) Reset() { *m = EventRequest{} }
func (m *EventRequest) String() string { return proto.CompactTextString(m) }
func (*EventRequest) ProtoMessage() {}
func (*EventRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (*EventRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (m *EventRequest) GetListenType() int64 {
if m != nil {
@ -1518,7 +1501,7 @@ type EventValue struct {
func (m *EventValue) Reset() { *m = EventValue{} }
func (m *EventValue) String() string { return proto.CompactTextString(m) }
func (*EventValue) ProtoMessage() {}
func (*EventValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (*EventValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
type isEventValue_Val interface {
isEventValue_Val()
@ -1657,7 +1640,7 @@ type Event struct {
func (m *Event) Reset() { *m = Event{} }
func (m *Event) String() string { return proto.CompactTextString(m) }
func (*Event) ProtoMessage() {}
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (m *Event) GetType() int64 {
if m != nil {
@ -1683,7 +1666,7 @@ type TempDirOrFileRequest struct {
func (m *TempDirOrFileRequest) Reset() { *m = TempDirOrFileRequest{} }
func (m *TempDirOrFileRequest) String() string { return proto.CompactTextString(m) }
func (*TempDirOrFileRequest) ProtoMessage() {}
func (*TempDirOrFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (*TempDirOrFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (m *TempDirOrFileRequest) GetDir() string {
if m != nil {
@ -1713,7 +1696,7 @@ type TempDirOrFileResponse struct {
func (m *TempDirOrFileResponse) Reset() { *m = TempDirOrFileResponse{} }
func (m *TempDirOrFileResponse) String() string { return proto.CompactTextString(m) }
func (*TempDirOrFileResponse) ProtoMessage() {}
func (*TempDirOrFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (*TempDirOrFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (m *TempDirOrFileResponse) GetResultPath() string {
if m != nil {
@ -1731,7 +1714,7 @@ type ReadFileRequest struct {
func (m *ReadFileRequest) Reset() { *m = ReadFileRequest{} }
func (m *ReadFileRequest) String() string { return proto.CompactTextString(m) }
func (*ReadFileRequest) ProtoMessage() {}
func (*ReadFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (*ReadFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (m *ReadFileRequest) GetPath() string {
if m != nil {
@ -1761,7 +1744,7 @@ type ReadFileResponse struct {
func (m *ReadFileResponse) Reset() { *m = ReadFileResponse{} }
func (m *ReadFileResponse) String() string { return proto.CompactTextString(m) }
func (*ReadFileResponse) ProtoMessage() {}
func (*ReadFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (*ReadFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (m *ReadFileResponse) GetReadCount() int64 {
if m != nil {
@ -1780,7 +1763,7 @@ type WriteFileRequest struct {
func (m *WriteFileRequest) Reset() { *m = WriteFileRequest{} }
func (m *WriteFileRequest) String() string { return proto.CompactTextString(m) }
func (*WriteFileRequest) ProtoMessage() {}
func (*WriteFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (*WriteFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (m *WriteFileRequest) GetPath() string {
if m != nil {
@ -1817,7 +1800,7 @@ type FileInfoRequest struct {
func (m *FileInfoRequest) Reset() { *m = FileInfoRequest{} }
func (m *FileInfoRequest) String() string { return proto.CompactTextString(m) }
func (*FileInfoRequest) ProtoMessage() {}
func (*FileInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (*FileInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (m *FileInfoRequest) GetPath() string {
if m != nil {
@ -1837,7 +1820,7 @@ type FileInfoResponse struct {
func (m *FileInfoResponse) Reset() { *m = FileInfoResponse{} }
func (m *FileInfoResponse) String() string { return proto.CompactTextString(m) }
func (*FileInfoResponse) ProtoMessage() {}
func (*FileInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (*FileInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (m *FileInfoResponse) GetName() string {
if m != nil {
@ -1883,7 +1866,7 @@ type HIDScriptRequest struct {
func (m *HIDScriptRequest) Reset() { *m = HIDScriptRequest{} }
func (m *HIDScriptRequest) String() string { return proto.CompactTextString(m) }
func (*HIDScriptRequest) ProtoMessage() {}
func (*HIDScriptRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func (*HIDScriptRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (m *HIDScriptRequest) GetScriptPath() string {
if m != nil {
@ -1906,7 +1889,7 @@ type HIDScriptJob struct {
func (m *HIDScriptJob) Reset() { *m = HIDScriptJob{} }
func (m *HIDScriptJob) String() string { return proto.CompactTextString(m) }
func (*HIDScriptJob) ProtoMessage() {}
func (*HIDScriptJob) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (*HIDScriptJob) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func (m *HIDScriptJob) GetId() uint32 {
if m != nil {
@ -1922,7 +1905,7 @@ type HIDScriptJobList struct {
func (m *HIDScriptJobList) Reset() { *m = HIDScriptJobList{} }
func (m *HIDScriptJobList) String() string { return proto.CompactTextString(m) }
func (*HIDScriptJobList) ProtoMessage() {}
func (*HIDScriptJobList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (*HIDScriptJobList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (m *HIDScriptJobList) GetIds() []uint32 {
if m != nil {
@ -1940,7 +1923,7 @@ type HIDRunningJobStateResult struct {
func (m *HIDRunningJobStateResult) Reset() { *m = HIDRunningJobStateResult{} }
func (m *HIDRunningJobStateResult) String() string { return proto.CompactTextString(m) }
func (*HIDRunningJobStateResult) ProtoMessage() {}
func (*HIDRunningJobStateResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (*HIDRunningJobStateResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (m *HIDRunningJobStateResult) GetId() int64 {
if m != nil {
@ -1972,7 +1955,7 @@ type HIDScriptResult struct {
func (m *HIDScriptResult) Reset() { *m = HIDScriptResult{} }
func (m *HIDScriptResult) String() string { return proto.CompactTextString(m) }
func (*HIDScriptResult) ProtoMessage() {}
func (*HIDScriptResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (*HIDScriptResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (m *HIDScriptResult) GetJob() *HIDScriptJob {
if m != nil {
@ -2003,7 +1986,7 @@ type LEDSettings struct {
func (m *LEDSettings) Reset() { *m = LEDSettings{} }
func (m *LEDSettings) String() string { return proto.CompactTextString(m) }
func (*LEDSettings) ProtoMessage() {}
func (*LEDSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (*LEDSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (m *LEDSettings) GetBlinkCount() uint32 {
if m != nil {
@ -2035,7 +2018,7 @@ type GadgetSettings struct {
func (m *GadgetSettings) Reset() { *m = GadgetSettings{} }
func (m *GadgetSettings) String() string { return proto.CompactTextString(m) }
func (*GadgetSettings) ProtoMessage() {}
func (*GadgetSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (*GadgetSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (m *GadgetSettings) GetEnabled() bool {
if m != nil {
@ -2157,7 +2140,7 @@ type GadgetSettingsEthernet struct {
func (m *GadgetSettingsEthernet) Reset() { *m = GadgetSettingsEthernet{} }
func (m *GadgetSettingsEthernet) String() string { return proto.CompactTextString(m) }
func (*GadgetSettingsEthernet) ProtoMessage() {}
func (*GadgetSettingsEthernet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (*GadgetSettingsEthernet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (m *GadgetSettingsEthernet) GetHostAddr() string {
if m != nil {
@ -2181,7 +2164,7 @@ type GadgetSettingsUMS struct {
func (m *GadgetSettingsUMS) Reset() { *m = GadgetSettingsUMS{} }
func (m *GadgetSettingsUMS) String() string { return proto.CompactTextString(m) }
func (*GadgetSettingsUMS) ProtoMessage() {}
func (*GadgetSettingsUMS) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
func (*GadgetSettingsUMS) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (m *GadgetSettingsUMS) GetCdrom() bool {
if m != nil {
@ -2206,7 +2189,7 @@ func (m *DeployedEthernetInterfaceSettings) Reset() { *m = DeployedEther
func (m *DeployedEthernetInterfaceSettings) String() string { return proto.CompactTextString(m) }
func (*DeployedEthernetInterfaceSettings) ProtoMessage() {}
func (*DeployedEthernetInterfaceSettings) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{44}
return fileDescriptor0, []int{43}
}
func (m *DeployedEthernetInterfaceSettings) GetList() []*EthernetInterfaceSettings {
@ -2229,7 +2212,7 @@ type EthernetInterfaceSettings struct {
func (m *EthernetInterfaceSettings) Reset() { *m = EthernetInterfaceSettings{} }
func (m *EthernetInterfaceSettings) String() string { return proto.CompactTextString(m) }
func (*EthernetInterfaceSettings) ProtoMessage() {}
func (*EthernetInterfaceSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (*EthernetInterfaceSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (m *EthernetInterfaceSettings) GetName() string {
if m != nil {
@ -2297,7 +2280,7 @@ type DHCPServerSettings struct {
func (m *DHCPServerSettings) Reset() { *m = DHCPServerSettings{} }
func (m *DHCPServerSettings) String() string { return proto.CompactTextString(m) }
func (*DHCPServerSettings) ProtoMessage() {}
func (*DHCPServerSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (*DHCPServerSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (m *DHCPServerSettings) GetListenPort() uint32 {
if m != nil {
@ -2372,7 +2355,7 @@ type DHCPServerRange struct {
func (m *DHCPServerRange) Reset() { *m = DHCPServerRange{} }
func (m *DHCPServerRange) String() string { return proto.CompactTextString(m) }
func (*DHCPServerRange) ProtoMessage() {}
func (*DHCPServerRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (*DHCPServerRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (m *DHCPServerRange) GetRangeLower() string {
if m != nil {
@ -2404,7 +2387,7 @@ type DHCPServerStaticHost struct {
func (m *DHCPServerStaticHost) Reset() { *m = DHCPServerStaticHost{} }
func (m *DHCPServerStaticHost) String() string { return proto.CompactTextString(m) }
func (*DHCPServerStaticHost) ProtoMessage() {}
func (*DHCPServerStaticHost) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (*DHCPServerStaticHost) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (m *DHCPServerStaticHost) GetMac() string {
if m != nil {
@ -2426,11 +2409,10 @@ type Empty struct {
func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func init() {
proto.RegisterType((*TriggerActionSet)(nil), "P4wnP1_grpc.TriggerActionSet")
proto.RegisterType((*TriggerActionSetRequestStorage)(nil), "P4wnP1_grpc.TriggerActionSetRequestStorage")
proto.RegisterType((*TriggerAction)(nil), "P4wnP1_grpc.TriggerAction")
proto.RegisterType((*TriggerServiceStarted)(nil), "P4wnP1_grpc.TriggerServiceStarted")
proto.RegisterType((*TriggerUSBGadgetConnected)(nil), "P4wnP1_grpc.TriggerUSBGadgetConnected")
@ -2542,7 +2524,7 @@ type P4WNP1Client interface {
ListStoredWifiSettings(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
// TriggerActions
ListStoredTriggerActionSets(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
StoreTriggerActionSets(ctx context.Context, in *TriggerActionSetRequestStorage, opts ...grpc.CallOption) (*Empty, error)
StoreTriggerActionSets(ctx context.Context, in *TriggerActionSet, opts ...grpc.CallOption) (*Empty, error)
GetTriggerActionsState(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*TriggerActionSet, error)
DeployTriggerActionSetReplace(ctx context.Context, in *TriggerActionSet, opts ...grpc.CallOption) (*TriggerActionSet, error)
DeployTriggerActionSetAdd(ctx context.Context, in *TriggerActionSet, opts ...grpc.CallOption) (*TriggerActionSet, error)
@ -2867,7 +2849,7 @@ func (c *p4WNP1Client) ListStoredTriggerActionSets(ctx context.Context, in *Empt
return out, nil
}
func (c *p4WNP1Client) StoreTriggerActionSets(ctx context.Context, in *TriggerActionSetRequestStorage, opts ...grpc.CallOption) (*Empty, error) {
func (c *p4WNP1Client) StoreTriggerActionSets(ctx context.Context, in *TriggerActionSet, opts ...grpc.CallOption) (*Empty, error) {
out := new(Empty)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/StoreTriggerActionSets", in, out, c.cc, opts...)
if err != nil {
@ -2947,7 +2929,7 @@ type P4WNP1Server interface {
ListStoredWifiSettings(context.Context, *Empty) (*StringMessageArray, error)
// TriggerActions
ListStoredTriggerActionSets(context.Context, *Empty) (*StringMessageArray, error)
StoreTriggerActionSets(context.Context, *TriggerActionSetRequestStorage) (*Empty, error)
StoreTriggerActionSets(context.Context, *TriggerActionSet) (*Empty, error)
GetTriggerActionsState(context.Context, *Empty) (*TriggerActionSet, error)
DeployTriggerActionSetReplace(context.Context, *TriggerActionSet) (*TriggerActionSet, error)
DeployTriggerActionSetAdd(context.Context, *TriggerActionSet) (*TriggerActionSet, error)
@ -3537,7 +3519,7 @@ func _P4WNP1_ListStoredTriggerActionSets_Handler(srv interface{}, ctx context.Co
}
func _P4WNP1_StoreTriggerActionSets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(TriggerActionSetRequestStorage)
in := new(TriggerActionSet)
if err := dec(in); err != nil {
return nil, err
}
@ -3549,7 +3531,7 @@ func _P4WNP1_StoreTriggerActionSets_Handler(srv interface{}, ctx context.Context
FullMethod: "/P4wnP1_grpc.P4WNP1/StoreTriggerActionSets",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).StoreTriggerActionSets(ctx, req.(*TriggerActionSetRequestStorage))
return srv.(P4WNP1Server).StoreTriggerActionSets(ctx, req.(*TriggerActionSet))
}
return interceptor(ctx, in, info, handler)
}
@ -3766,223 +3748,222 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("grpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 3476 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x5a, 0xdd, 0x73, 0xdb, 0x48,
0x72, 0xe7, 0x87, 0x24, 0x92, 0x4d, 0x91, 0x84, 0xc6, 0xb6, 0x4c, 0xcb, 0x1f, 0xeb, 0x45, 0xf6,
0xf6, 0x1c, 0x6d, 0x4e, 0xf6, 0x6a, 0xb5, 0xde, 0xbd, 0xad, 0xbb, 0xda, 0xe3, 0x37, 0x69, 0xf3,
0xab, 0x06, 0xa4, 0x95, 0x64, 0xab, 0xc2, 0x83, 0x80, 0x11, 0x85, 0x98, 0x04, 0x18, 0x60, 0x20,
0xaf, 0xf2, 0x70, 0xa9, 0xca, 0x3f, 0x91, 0xff, 0x22, 0x8f, 0xc9, 0x5f, 0x74, 0xef, 0x79, 0xc9,
0x73, 0x52, 0x33, 0x03, 0x80, 0x00, 0x04, 0x52, 0xf6, 0xee, 0x5b, 0x4f, 0x4f, 0xf7, 0x6f, 0x1a,
0x3d, 0x3d, 0x3d, 0x3d, 0x4d, 0x02, 0xcc, 0xed, 0x95, 0x76, 0xb2, 0xb2, 0x2d, 0x6a, 0xa1, 0xe2,
0xf8, 0xec, 0x83, 0x39, 0xfe, 0x7a, 0xc6, 0x58, 0xf2, 0x3b, 0x90, 0x26, 0xb6, 0x31, 0x9f, 0x13,
0xbb, 0xa6, 0x51, 0xc3, 0x32, 0x15, 0x42, 0x51, 0x1d, 0xca, 0x11, 0x9e, 0x53, 0x4d, 0x3f, 0xcf,
0xbe, 0x28, 0x9e, 0x1e, 0x9d, 0x84, 0x34, 0x4f, 0x22, 0x22, 0x38, 0xa6, 0x21, 0xbb, 0xf0, 0x2c,
0x8e, 0x8b, 0xc9, 0xbf, 0xb8, 0xc4, 0xa1, 0x0a, 0xb5, 0x6c, 0x75, 0x4e, 0x90, 0x0c, 0xfb, 0x13,
0xb2, 0x5c, 0x2d, 0x54, 0x4a, 0x86, 0xea, 0x92, 0x54, 0xd3, 0xcf, 0xd3, 0x2f, 0x0a, 0x38, 0xc2,
0x43, 0x2f, 0x21, 0xeb, 0x10, 0x5a, 0xcd, 0x3c, 0x4f, 0xbf, 0x28, 0x9e, 0x3e, 0xdd, 0xbc, 0x3c,
0x43, 0x67, 0x92, 0xf2, 0x7f, 0x01, 0x94, 0x22, 0x33, 0xa8, 0x0c, 0x19, 0x43, 0xe7, 0xe0, 0x25,
0x9c, 0x31, 0x74, 0x54, 0x85, 0x9c, 0x65, 0x12, 0xe5, 0xca, 0x12, 0xb0, 0x79, 0xec, 0x0f, 0xd1,
0x11, 0xe4, 0x0d, 0x87, 0x69, 0x5d, 0x93, 0x6a, 0x96, 0x4f, 0x05, 0x63, 0xf4, 0x04, 0x0a, 0xc6,
0x72, 0xe9, 0x52, 0xf5, 0x62, 0x41, 0xaa, 0x3b, 0x7c, 0x72, 0xcd, 0x40, 0x7d, 0x28, 0x3b, 0xc4,
0xbe, 0x36, 0x34, 0xa2, 0x50, 0xd5, 0xa6, 0x44, 0xaf, 0xee, 0x72, 0x8b, 0xe5, 0x24, 0x8b, 0x95,
0x88, 0x64, 0x37, 0x85, 0x63, 0xba, 0xe8, 0xef, 0x01, 0xb9, 0xce, 0x45, 0x47, 0xd5, 0xe7, 0x84,
0x36, 0x2c, 0xd3, 0x24, 0x1a, 0x43, 0xdc, 0xe3, 0x88, 0x5f, 0x26, 0x21, 0x4e, 0x95, 0x7a, 0x4c,
0xba, 0x9b, 0xc2, 0x09, 0x18, 0x48, 0x85, 0x07, 0x01, 0xb7, 0x69, 0x38, 0x5a, 0x00, 0x9e, 0xe3,
0xe0, 0x7f, 0xbb, 0x15, 0x3c, 0xac, 0xd0, 0x4d, 0xe1, 0x64, 0x24, 0xd4, 0x83, 0xd2, 0x07, 0xe3,
0xd2, 0xa8, 0x8d, 0x7d, 0x4f, 0xe4, 0x39, 0xf4, 0xe7, 0x49, 0xd0, 0xe7, 0x61, 0xc1, 0x6e, 0x0a,
0x47, 0x35, 0x99, 0x1f, 0x18, 0x23, 0x30, 0xbf, 0xe6, 0x28, 0x54, 0xad, 0x16, 0x36, 0xfb, 0xe1,
0xfc, 0x96, 0x34, 0xf3, 0xc3, 0x6d, 0x0c, 0xf4, 0x03, 0xe4, 0x1d, 0xe7, 0xaa, 0x6f, 0xcd, 0x0d,
0xb3, 0x0a, 0x1c, 0xef, 0x49, 0xe2, 0x4e, 0x29, 0x5d, 0x2e, 0xd3, 0x4d, 0xe1, 0x40, 0x1e, 0x61,
0x90, 0xf4, 0x2b, 0x6d, 0xd5, 0x27, 0xaa, 0x43, 0x3a, 0xb6, 0x6a, 0xb2, 0x6f, 0x2c, 0x72, 0x8c,
0x2f, 0x92, 0x30, 0x9a, 0xdd, 0xc6, 0x38, 0x2c, 0xdb, 0x4d, 0xe1, 0x5b, 0xfa, 0xa8, 0x0d, 0xfb,
0x73, 0xdb, 0x72, 0x57, 0x98, 0x68, 0x84, 0x45, 0xdf, 0x3e, 0xc7, 0x7b, 0x9e, 0x84, 0xd7, 0x09,
0xc9, 0x75, 0x53, 0x38, 0xa2, 0x87, 0xfe, 0x09, 0xee, 0x87, 0xc7, 0x0a, 0x3b, 0x70, 0xa6, 0x46,
0xaa, 0x25, 0x8e, 0xf7, 0xe2, 0x2e, 0x3c, 0x5f, 0xbe, 0x9b, 0xc2, 0x89, 0x38, 0xe8, 0x0c, 0xf6,
0xe6, 0x2b, 0xc3, 0xea, 0x99, 0xd5, 0x32, 0x47, 0x4c, 0x4c, 0x08, 0x9d, 0x71, 0x6f, 0xd4, 0x63,
0x3e, 0xf3, 0x64, 0x51, 0x13, 0xe0, 0x42, 0x75, 0xae, 0x14, 0xcd, 0x36, 0x56, 0xb4, 0x5a, 0x49,
0x38, 0x19, 0xde, 0x21, 0x66, 0xfb, 0x5e, 0x0f, 0x24, 0xbb, 0x69, 0x1c, 0xd2, 0x43, 0x35, 0x28,
0x5c, 0x19, 0xba, 0x07, 0x22, 0x25, 0x04, 0x55, 0x08, 0xa4, 0xdb, 0x6b, 0x06, 0x18, 0x6b, 0x2d,
0xa4, 0xc1, 0xa1, 0x4e, 0x56, 0x0b, 0xeb, 0x46, 0x21, 0x94, 0x1a, 0xe6, 0xdc, 0xf1, 0x73, 0x4d,
0xf5, 0x20, 0x21, 0xfe, 0x05, 0x5e, 0x33, 0x51, 0xa1, 0x9b, 0xc6, 0x1b, 0xa0, 0xd0, 0x31, 0x64,
0x17, 0xd6, 0xbc, 0x8a, 0x38, 0xe2, 0x61, 0x02, 0x62, 0xdf, 0x9a, 0x77, 0xd3, 0x98, 0x09, 0xa1,
0xd7, 0x90, 0x63, 0x3e, 0x1a, 0xb9, 0xb4, 0x7a, 0x2f, 0xc1, 0xa1, 0x42, 0x9e, 0xf9, 0x73, 0xe4,
0xb2, 0x4f, 0xf1, 0x85, 0xd1, 0x1f, 0xa0, 0xc0, 0xf7, 0x47, 0x21, 0xa6, 0x5e, 0xbd, 0x9f, 0x10,
0xc0, 0x9e, 0xa6, 0x2f, 0xc3, 0xdc, 0x10, 0x28, 0xd4, 0x0b, 0x90, 0xf3, 0xb6, 0xaa, 0x9e, 0x87,
0x3d, 0x21, 0x2a, 0x3f, 0x84, 0x07, 0x89, 0xf9, 0x49, 0x7e, 0x0c, 0x8f, 0x36, 0xa6, 0x19, 0xf9,
0x19, 0x3c, 0xd9, 0x96, 0x26, 0xe4, 0x43, 0xb8, 0x9f, 0x74, 0xd6, 0x43, 0xa0, 0xb7, 0xcf, 0xac,
0xfc, 0x12, 0x2a, 0xb1, 0x03, 0xc8, 0xd2, 0xef, 0x82, 0x11, 0x53, 0x87, 0xd8, 0xde, 0x45, 0xb1,
0x66, 0xc8, 0x8f, 0xe0, 0xe1, 0x86, 0xd3, 0x26, 0xf7, 0xe0, 0x5e, 0x42, 0xa0, 0x33, 0x3c, 0xee,
0x8f, 0xd0, 0xc5, 0xb3, 0x66, 0xa0, 0xfb, 0xb0, 0x7b, 0xad, 0x2e, 0x5c, 0xc2, 0x2f, 0x88, 0x5d,
0x2c, 0x06, 0xf2, 0xbf, 0xc1, 0xe3, 0x2d, 0x67, 0xe6, 0x0e, 0xc8, 0x63, 0x90, 0x7a, 0x73, 0xd3,
0xb2, 0xc9, 0xc8, 0xa5, 0xa3, 0xcb, 0x91, 0xad, 0x13, 0xdb, 0xbb, 0x7e, 0x6e, 0xf1, 0xd1, 0x21,
0xec, 0xf1, 0x15, 0x9d, 0x6a, 0xf6, 0x79, 0xf6, 0xc5, 0x2e, 0xf6, 0x46, 0xf2, 0x7f, 0xa7, 0x83,
0xbb, 0x4d, 0x9c, 0x31, 0x74, 0x22, 0xe2, 0x67, 0xe8, 0x2e, 0xf9, 0x8a, 0xe5, 0xd3, 0xfb, 0x91,
0x28, 0x60, 0x52, 0x43, 0x77, 0x89, 0x7d, 0x21, 0xf4, 0x47, 0x80, 0x95, 0xbb, 0x58, 0x4c, 0x57,
0x4d, 0xeb, 0x83, 0xc9, 0xd7, 0x2f, 0xc7, 0x6e, 0x55, 0x01, 0x3c, 0x0e, 0x84, 0x70, 0x48, 0x01,
0x7d, 0x07, 0x20, 0x8e, 0x74, 0x4b, 0x9f, 0x8b, 0x2b, 0xb2, 0x7c, 0xfa, 0x30, 0x41, 0x9d, 0x4d,
0xe3, 0x90, 0xa8, 0xfc, 0x1d, 0x3c, 0x48, 0x3c, 0xe2, 0xe8, 0x19, 0x80, 0xc3, 0xa9, 0x90, 0xd7,
0x42, 0x1c, 0xf9, 0x35, 0xdc, 0x4f, 0x3a, 0xd6, 0x77, 0xea, 0xfd, 0x6f, 0x1a, 0x9e, 0x6c, 0x3b,
0xbf, 0xac, 0xf8, 0xa0, 0x09, 0xc5, 0x47, 0x98, 0x87, 0xde, 0xc0, 0x0e, 0xbd, 0x59, 0x11, 0xcf,
0x4f, 0xaf, 0x3f, 0x3a, 0x39, 0x9c, 0xf8, 0xc4, 0xe4, 0x66, 0x45, 0x30, 0xc7, 0x90, 0xc9, 0xba,
0xd8, 0x61, 0x5c, 0x74, 0x00, 0xa5, 0xf6, 0xb4, 0xdf, 0x9f, 0x29, 0xad, 0xc9, 0xa4, 0x37, 0xec,
0x28, 0x52, 0x0a, 0x15, 0x21, 0x37, 0x6c, 0x4d, 0xce, 0x47, 0xf8, 0xad, 0x94, 0x46, 0x79, 0xd8,
0x39, 0xef, 0xb5, 0x7b, 0x52, 0x06, 0xe5, 0x20, 0x3b, 0x55, 0xea, 0x52, 0x16, 0x95, 0xa0, 0x50,
0xef, 0x4f, 0x5b, 0x93, 0xd1, 0x68, 0xd2, 0x95, 0x76, 0xd0, 0x3d, 0xa8, 0x4c, 0x70, 0xaf, 0xd3,
0x69, 0xe1, 0x59, 0xad, 0x31, 0xe9, 0x8d, 0x86, 0x8a, 0xb4, 0x2b, 0x17, 0xa1, 0x10, 0x24, 0x19,
0x79, 0x05, 0xa5, 0x48, 0x06, 0xf9, 0xe4, 0x70, 0x79, 0x19, 0x3e, 0x07, 0xe5, 0xd3, 0x47, 0xb7,
0xa4, 0x47, 0x2e, 0x7d, 0xc7, 0x04, 0xfc, 0x23, 0xd2, 0x82, 0x4a, 0x2c, 0xf3, 0xfc, 0xa2, 0x93,
0xf6, 0x01, 0x8e, 0x58, 0x5a, 0xf0, 0xeb, 0x45, 0xcf, 0xbd, 0x9f, 0x52, 0x37, 0x7e, 0x0b, 0x79,
0xc7, 0x53, 0xf3, 0x8a, 0xc7, 0xa8, 0xf1, 0xe7, 0x46, 0xdb, 0xf0, 0x71, 0x71, 0x20, 0x2a, 0xff,
0x47, 0x16, 0xf6, 0xc3, 0x53, 0x08, 0xc1, 0x8e, 0xb9, 0x5e, 0x83, 0xd3, 0xac, 0x4c, 0xd4, 0x0d,
0x87, 0xd5, 0x7d, 0xba, 0x77, 0x84, 0x83, 0x31, 0x8b, 0x4b, 0x9b, 0xcc, 0xdd, 0x85, 0x4a, 0x2d,
0xfb, 0x86, 0x9f, 0x90, 0x02, 0x0e, 0x71, 0xd0, 0x8f, 0xb0, 0xff, 0xc1, 0xb2, 0xdf, 0x1b, 0xe6,
0x7c, 0xb6, 0xb4, 0x74, 0x51, 0x49, 0x96, 0x63, 0xb9, 0x9b, 0x19, 0x70, 0x2e, 0x84, 0x06, 0x96,
0x4e, 0x70, 0xf1, 0xc3, 0x7a, 0x80, 0x5e, 0x43, 0x41, 0x75, 0xe9, 0x95, 0xd0, 0xde, 0x4d, 0xd8,
0x16, 0xa6, 0x5d, 0x73, 0xe9, 0x15, 0x57, 0xcd, 0xab, 0x1e, 0xc5, 0xaa, 0x5e, 0xed, 0x4a, 0x35,
0x4d, 0xb2, 0xe0, 0x85, 0x64, 0x09, 0xfb, 0x43, 0x74, 0x02, 0x7b, 0xea, 0x6a, 0x56, 0x57, 0x14,
0xaf, 0x08, 0x7c, 0x78, 0x0b, 0xae, 0xae, 0x28, 0x8d, 0xcb, 0x39, 0xde, 0x55, 0x57, 0x75, 0x45,
0x41, 0x3f, 0x42, 0x45, 0x5b, 0x18, 0xc4, 0xa4, 0x4c, 0x67, 0xb6, 0x30, 0x1c, 0x5a, 0xcd, 0xf3,
0xd7, 0xc1, 0x46, 0xc5, 0x92, 0x90, 0xaf, 0x2b, 0x4a, 0xdf, 0x70, 0x28, 0x7a, 0xcc, 0x2f, 0x72,
0x32, 0x73, 0x1c, 0x43, 0xe7, 0xd5, 0x5c, 0x1e, 0xe7, 0x19, 0x43, 0x71, 0x0c, 0x9d, 0xe5, 0x3e,
0x93, 0xfc, 0xbc, 0xb4, 0x4c, 0x5e, 0xb3, 0xe4, 0xb1, 0x37, 0x92, 0xff, 0x33, 0x0d, 0x05, 0xbe,
0x33, 0x94, 0x9d, 0xde, 0x13, 0xd8, 0xe1, 0x0e, 0x10, 0x51, 0x7c, 0x74, 0x7b, 0x6b, 0x99, 0x14,
0xf7, 0x00, 0x97, 0x0b, 0x7f, 0x7d, 0x26, 0xfa, 0xf5, 0x08, 0x76, 0xb8, 0x1d, 0x62, 0xab, 0x38,
0x8d, 0x1a, 0x50, 0xd1, 0x5c, 0xdb, 0x26, 0x66, 0x10, 0x7a, 0x7c, 0x9f, 0xb6, 0xc6, 0x50, 0x5c,
0x43, 0x3e, 0x05, 0x58, 0xbb, 0x80, 0x2d, 0xa3, 0x28, 0xbd, 0xa6, 0x1f, 0x47, 0x8c, 0x46, 0x12,
0x64, 0xc7, 0xca, 0x5b, 0x6e, 0x50, 0x01, 0x33, 0x52, 0xfe, 0x1c, 0x4a, 0x0a, 0xb5, 0xd9, 0x56,
0x13, 0xc7, 0x61, 0xa1, 0x2e, 0x41, 0x76, 0xe9, 0xcc, 0x3d, 0x2d, 0x46, 0xca, 0xaf, 0x00, 0x45,
0x44, 0x6a, 0xb6, 0xad, 0xde, 0xb0, 0x90, 0x5c, 0x3a, 0x73, 0x4e, 0xf3, 0xa7, 0x5a, 0x01, 0x07,
0x63, 0xf9, 0x04, 0xf6, 0x5b, 0xd7, 0xc4, 0xf4, 0x5f, 0x5f, 0x2c, 0x44, 0xd9, 0xa6, 0x11, 0x93,
0xe5, 0x21, 0x0e, 0x9d, 0xc5, 0x21, 0x8e, 0xac, 0x02, 0x70, 0x79, 0x7e, 0xb0, 0xd1, 0x11, 0xe4,
0xa8, 0xc3, 0x17, 0x14, 0x56, 0x74, 0x53, 0xd8, 0x67, 0xa0, 0x43, 0xd8, 0xa5, 0x17, 0x96, 0x25,
0x7c, 0x9a, 0xef, 0xa6, 0xb0, 0x18, 0xa2, 0x2a, 0xec, 0x51, 0xc3, 0xa4, 0xaf, 0xcf, 0xb8, 0x57,
0xb3, 0xac, 0x12, 0x14, 0xe3, 0xfa, 0x2e, 0x64, 0xaf, 0xd5, 0x85, 0xdc, 0x87, 0x5d, 0xbe, 0x04,
0x73, 0x0b, 0x5d, 0x5b, 0xc1, 0x69, 0xf4, 0x32, 0xb8, 0xfd, 0x32, 0x09, 0x61, 0xb5, 0x36, 0x2d,
0xb8, 0x16, 0xff, 0x0c, 0xf7, 0xd9, 0xd9, 0x6f, 0x1a, 0xf6, 0xc8, 0x6e, 0x1b, 0x0b, 0xe2, 0x7f,
0xa8, 0x04, 0x59, 0xdd, 0xf0, 0xab, 0x05, 0x46, 0xb2, 0xe0, 0x5a, 0xd9, 0xe4, 0xd2, 0xf8, 0xd9,
0x73, 0xba, 0x37, 0x62, 0x2e, 0xb1, 0xcc, 0xc5, 0x4d, 0xdb, 0x5a, 0xb0, 0x6b, 0x59, 0x3c, 0xfd,
0x42, 0x1c, 0x76, 0x7d, 0xc5, 0x56, 0x70, 0x56, 0x96, 0xe9, 0x10, 0x71, 0xdc, 0x1d, 0x77, 0x41,
0xc7, 0x2a, 0xbd, 0xf2, 0xaf, 0xa1, 0x35, 0x47, 0x1e, 0x41, 0x05, 0x13, 0x55, 0x0f, 0x5b, 0x85,
0x60, 0x67, 0xb5, 0x16, 0xe6, 0x34, 0xcb, 0x82, 0x0e, 0xbb, 0xdf, 0xb8, 0x59, 0x59, 0x2c, 0x06,
0x4c, 0x52, 0x57, 0xa9, 0xca, 0xed, 0xd9, 0xc7, 0x9c, 0x96, 0x5f, 0x81, 0xb4, 0x06, 0xf4, 0x8c,
0x78, 0x02, 0x05, 0x9b, 0xa8, 0x7a, 0xc3, 0x72, 0x4d, 0xea, 0x79, 0x72, 0xcd, 0x90, 0xaf, 0x41,
0x3a, 0xb7, 0x0d, 0x4a, 0xee, 0xb2, 0xe1, 0x90, 0xa5, 0x81, 0x15, 0xab, 0x27, 0x45, 0x4e, 0xf3,
0x46, 0x2c, 0xdb, 0x2e, 0x5d, 0x87, 0x0e, 0x2d, 0xda, 0xfa, 0x99, 0x9d, 0x75, 0xe1, 0x9d, 0x08,
0x2f, 0xb0, 0x74, 0x27, 0x64, 0xe9, 0x6f, 0xa0, 0xc2, 0x96, 0xec, 0x99, 0x97, 0xd6, 0x96, 0x65,
0xe5, 0xbf, 0x80, 0xb4, 0x16, 0xf3, 0x3e, 0x28, 0x29, 0xe9, 0xb2, 0x73, 0x6a, 0xfc, 0x2b, 0xf1,
0x3c, 0xc4, 0x69, 0xc6, 0xe3, 0x59, 0x20, 0xcb, 0x8f, 0x74, 0x70, 0xd2, 0x97, 0x96, 0x3e, 0x31,
0x96, 0x22, 0xb7, 0x66, 0xb1, 0x3f, 0x64, 0x4e, 0x36, 0x9c, 0xa6, 0x61, 0xf3, 0xac, 0x99, 0xc7,
0x62, 0x20, 0xff, 0x23, 0x48, 0x41, 0x55, 0x11, 0x3a, 0x21, 0xa2, 0x94, 0x08, 0xef, 0xea, 0x9a,
0x83, 0xbe, 0x84, 0x32, 0x35, 0x96, 0xc4, 0x72, 0xa9, 0x42, 0x34, 0xcb, 0xd4, 0x1d, 0x2f, 0xa9,
0xc4, 0xb8, 0xf2, 0x33, 0xd8, 0x0f, 0xb0, 0xdf, 0x58, 0x17, 0xf1, 0x4e, 0x84, 0xfc, 0x45, 0x68,
0xed, 0x37, 0xd6, 0x05, 0x4f, 0x8e, 0x12, 0x64, 0x0d, 0x5d, 0xf4, 0x5b, 0x4a, 0x98, 0x91, 0xf2,
0x3b, 0xa8, 0x76, 0x7b, 0x4d, 0xec, 0x9a, 0xa6, 0x61, 0xce, 0xdf, 0x58, 0x17, 0x3c, 0xb7, 0x61,
0x1e, 0x63, 0x21, 0xc4, 0x2c, 0xef, 0x6d, 0x20, 0xd8, 0xb9, 0x5e, 0xf6, 0x74, 0xdf, 0x4b, 0x8c,
0x66, 0x1b, 0xeb, 0x58, 0xae, 0xad, 0x11, 0x2f, 0xc7, 0x79, 0x23, 0xf9, 0x2f, 0x50, 0x09, 0x7d,
0x39, 0x87, 0xfb, 0x0a, 0xb2, 0xff, 0x6c, 0x5d, 0x70, 0xbc, 0x78, 0xb2, 0x0b, 0x1b, 0x8a, 0x99,
0x14, 0xf3, 0x92, 0xe1, 0xb4, 0x0d, 0xd3, 0x70, 0xae, 0x82, 0x8b, 0x30, 0xc4, 0x59, 0x9f, 0x8d,
0x37, 0x8e, 0x65, 0xae, 0xaf, 0x42, 0x9f, 0x23, 0x9f, 0x40, 0xb1, 0xdf, 0x6a, 0x06, 0x37, 0xed,
0x67, 0x50, 0xbc, 0x58, 0x18, 0xe6, 0xfb, 0x99, 0x16, 0xc4, 0x71, 0x09, 0x03, 0x67, 0x89, 0x40,
0xfe, 0xeb, 0x0e, 0x94, 0xc5, 0x0b, 0x23, 0xd0, 0xa9, 0x42, 0x8e, 0x98, 0xe2, 0x22, 0x4e, 0x8b,
0x56, 0x8e, 0x37, 0x64, 0x6e, 0xbc, 0x36, 0x74, 0x3f, 0xb7, 0x5e, 0x1b, 0x9c, 0xb3, 0x0a, 0xf2,
0x3c, 0x23, 0x79, 0x64, 0xab, 0xa6, 0x7b, 0xa9, 0x6a, 0xd4, 0xb5, 0x89, 0xcd, 0xe3, 0xa5, 0x80,
0x23, 0x3c, 0xb6, 0xc2, 0xca, 0xb6, 0x74, 0x57, 0xa3, 0x3c, 0x6c, 0x0a, 0xd8, 0x1f, 0x72, 0xb7,
0x12, 0xdb, 0x50, 0xc5, 0x7d, 0xca, 0xdc, 0xca, 0x47, 0xe8, 0x19, 0x14, 0x5d, 0x87, 0xcc, 0x1a,
0xcd, 0xc6, 0xac, 0xd5, 0x18, 0xf0, 0x3b, 0x35, 0x8f, 0x0b, 0xae, 0x43, 0x1a, 0xcd, 0x46, 0xab,
0x31, 0x60, 0xb7, 0x1f, 0x9b, 0xc7, 0xc3, 0x66, 0x4f, 0xe1, 0xbd, 0x91, 0x3c, 0xce, 0xbb, 0x0e,
0xe1, 0x63, 0xf4, 0x02, 0x24, 0x36, 0xd9, 0xed, 0x35, 0x67, 0x6f, 0x5b, 0xff, 0x50, 0x1f, 0xd5,
0x70, 0xd3, 0xbb, 0x21, 0xcb, 0xae, 0x43, 0xba, 0xbd, 0xa6, 0xcf, 0x45, 0x32, 0x94, 0x7c, 0xc9,
0xc1, 0x68, 0xaa, 0xb4, 0x78, 0x1b, 0x23, 0x8f, 0x8b, 0x42, 0x8c, 0xb3, 0x7c, 0x53, 0x98, 0x0c,
0xae, 0x9d, 0xf3, 0x26, 0x85, 0x30, 0x85, 0xc5, 0x53, 0xed, 0x1c, 0x3d, 0x84, 0x1c, 0x9b, 0x9f,
0x0e, 0x14, 0xde, 0x70, 0xc8, 0xe3, 0x3d, 0xd7, 0x21, 0xd3, 0x81, 0x82, 0x9e, 0x02, 0xb0, 0x09,
0xa5, 0x85, 0x7b, 0xb5, 0xbe, 0x77, 0x11, 0x33, 0x3d, 0xc1, 0x40, 0x6f, 0xa0, 0x6c, 0x9b, 0xba,
0xe1, 0xcc, 0x82, 0x12, 0x4b, 0x74, 0x03, 0xfe, 0x26, 0x5a, 0x1f, 0x46, 0xf6, 0xaa, 0x45, 0xaf,
0x88, 0x6d, 0x12, 0x8a, 0x4b, 0x5c, 0x35, 0xd8, 0xc2, 0x01, 0x48, 0x9a, 0xae, 0xcd, 0x88, 0xb6,
0x5c, 0xa3, 0x55, 0x3e, 0x1e, 0xad, 0xac, 0xe9, 0x5a, 0x4b, 0x5b, 0x06, 0x70, 0x35, 0xd8, 0x77,
0x97, 0x21, 0xc3, 0x44, 0x9f, 0xe0, 0xd9, 0x16, 0xa8, 0xe9, 0x40, 0xc1, 0x45, 0x77, 0x19, 0x58,
0x24, 0x8f, 0xe1, 0x30, 0x79, 0x31, 0x5e, 0xb8, 0x58, 0x0e, 0x9d, 0xa9, 0xba, 0xee, 0x5f, 0x2b,
0x79, 0xc6, 0xa8, 0xe9, 0xba, 0x8d, 0x1e, 0x41, 0x5e, 0x27, 0xd7, 0x62, 0x4e, 0x84, 0x5d, 0x4e,
0x27, 0xd7, 0x6c, 0x4a, 0xfe, 0x23, 0x1c, 0xdc, 0x5a, 0x93, 0xa5, 0x23, 0x4d, 0xb7, 0xad, 0xa5,
0x17, 0xb9, 0x62, 0xc0, 0x0e, 0xf0, 0xa5, 0xb1, 0x20, 0x1e, 0x02, 0xa7, 0xe5, 0x19, 0x7c, 0x2e,
0xde, 0x19, 0x44, 0xf7, 0x4d, 0xe9, 0x99, 0x94, 0xd8, 0x97, 0xaa, 0x46, 0x82, 0x0f, 0xff, 0x01,
0x76, 0x78, 0x29, 0x26, 0x1a, 0xb5, 0xd1, 0xee, 0xd8, 0x46, 0x2d, 0xcc, 0x75, 0xe4, 0x7f, 0xcf,
0xc2, 0xa3, 0xcd, 0xc8, 0x49, 0xd9, 0xf8, 0x47, 0x2f, 0xf3, 0x8a, 0x77, 0xc1, 0x57, 0x1f, 0xb7,
0xda, 0x49, 0xa8, 0x20, 0x63, 0xc9, 0x63, 0xc5, 0x9c, 0x43, 0x1c, 0xe7, 0xcc, 0x4f, 0x0e, 0x6b,
0x0e, 0x2b, 0x68, 0x4c, 0x42, 0x97, 0xaa, 0xf3, 0xfe, 0xcc, 0x3b, 0x97, 0xc1, 0x38, 0x7c, 0xea,
0x77, 0xa3, 0xa7, 0x7e, 0x04, 0x48, 0xbf, 0xd2, 0x56, 0x0a, 0xb1, 0xaf, 0x89, 0x1d, 0xd4, 0x6e,
0xa2, 0x71, 0xfa, 0x59, 0xc4, 0xc8, 0x66, 0xb7, 0x31, 0x8e, 0x8a, 0xe1, 0x04, 0x55, 0xf4, 0x05,
0x94, 0xfc, 0x50, 0xea, 0x99, 0x53, 0x87, 0x78, 0xc7, 0x39, 0xca, 0x94, 0x1b, 0xb0, 0xc3, 0x6b,
0x6c, 0x80, 0xbd, 0x41, 0x6d, 0x38, 0xad, 0xf5, 0xa5, 0x14, 0xaa, 0x40, 0x91, 0xad, 0x31, 0x6b,
0xf4, 0x7b, 0xad, 0xe1, 0x44, 0x4a, 0x07, 0x0c, 0xa5, 0x85, 0xdf, 0xb5, 0xb0, 0x94, 0x61, 0xcf,
0xb9, 0xe9, 0x70, 0x50, 0x1b, 0xd6, 0x3a, 0xad, 0xa6, 0x94, 0x95, 0xff, 0x2f, 0x0b, 0xe8, 0xb6,
0x55, 0xeb, 0x6a, 0x6d, 0x6c, 0xd9, 0x41, 0x56, 0x5c, 0x73, 0xd0, 0x0b, 0xa8, 0x88, 0x51, 0xe0,
0x6e, 0x2f, 0x76, 0xe2, 0x6c, 0xde, 0x42, 0x21, 0xaa, 0xc3, 0x0b, 0x01, 0xcf, 0xe3, 0x6b, 0x06,
0x3a, 0x06, 0xc9, 0xb4, 0x28, 0x7b, 0x38, 0x58, 0xb6, 0x41, 0x55, 0xde, 0x03, 0x17, 0x6d, 0xee,
0x5b, 0x7c, 0x74, 0x02, 0x48, 0xb7, 0x86, 0x16, 0xad, 0x1b, 0xa6, 0xbe, 0x5e, 0x56, 0xec, 0x45,
0xc2, 0x0c, 0xbb, 0x2f, 0x35, 0x75, 0xb1, 0xb8, 0x50, 0xb5, 0xf7, 0x5e, 0xfb, 0x4e, 0xa4, 0xcc,
0x18, 0x17, 0x9d, 0xc1, 0x9e, 0xad, 0x9a, 0x73, 0xe2, 0x54, 0x73, 0x3c, 0x8a, 0x9f, 0x6c, 0xd8,
0x32, 0xcc, 0x84, 0xb0, 0x27, 0x8b, 0xda, 0x90, 0xb3, 0x56, 0xe2, 0x57, 0x0a, 0xf1, 0x0e, 0xf9,
0xbb, 0x3b, 0x76, 0xfa, 0x64, 0x24, 0xc4, 0x5b, 0x26, 0xb5, 0x6f, 0xb0, 0xaf, 0x8c, 0x1a, 0x50,
0x74, 0xd8, 0x07, 0x6a, 0x5d, 0xcb, 0xa1, 0x4e, 0xb5, 0xc0, 0xb1, 0x3e, 0xdf, 0x84, 0x15, 0x48,
0xe2, 0xb0, 0xd6, 0xd1, 0x0f, 0xb0, 0x1f, 0x46, 0x67, 0xb7, 0xce, 0x7b, 0x72, 0xe3, 0xed, 0x1b,
0x23, 0xa3, 0x2f, 0xde, 0x82, 0xf7, 0xe2, 0xfd, 0x21, 0xf3, 0x7d, 0x5a, 0xb6, 0xa0, 0x12, 0xfb,
0x46, 0x7e, 0x87, 0x32, 0xa2, 0x6f, 0x7d, 0x08, 0xfa, 0x5e, 0x21, 0x4e, 0x30, 0x3f, 0x5d, 0xad,
0x88, 0x9f, 0x76, 0x42, 0x9c, 0x60, 0xcf, 0x79, 0x3d, 0x14, 0xde, 0x73, 0xc6, 0x90, 0xbf, 0x87,
0xfb, 0x49, 0x5f, 0xc4, 0x5f, 0x1d, 0xaa, 0x16, 0xbc, 0x3a, 0x54, 0x8d, 0xd7, 0x19, 0x2b, 0x0f,
0x3f, 0x63, 0xac, 0xe4, 0x1c, 0xec, 0xb6, 0x96, 0x2b, 0x7a, 0x73, 0xfc, 0x3b, 0x90, 0xe2, 0x1d,
0x23, 0xb4, 0x07, 0x99, 0xe9, 0x58, 0x4a, 0xa1, 0x3c, 0xec, 0x34, 0x47, 0xe7, 0x43, 0x29, 0x8d,
0x72, 0x90, 0x1d, 0xb5, 0xdb, 0x52, 0xe6, 0xf8, 0x25, 0xc0, 0xba, 0x43, 0xc4, 0xce, 0x0b, 0xee,
0x29, 0xbd, 0x61, 0x47, 0x34, 0x3f, 0xda, 0xb5, 0x7e, 0x9f, 0x0d, 0x78, 0xf3, 0xa3, 0x3e, 0x9a,
0x74, 0xa5, 0xcc, 0xf1, 0xff, 0xa4, 0x21, 0xe7, 0xb5, 0x25, 0x50, 0x01, 0x76, 0x87, 0xd3, 0xc1,
0xec, 0x6b, 0x29, 0xe5, 0x93, 0xa7, 0x52, 0xda, 0x27, 0xbf, 0x91, 0x32, 0x3e, 0x79, 0x26, 0x65,
0x7d, 0xf2, 0x5b, 0x69, 0xc7, 0x27, 0x5f, 0x4b, 0xbb, 0x3e, 0xf9, 0x9d, 0xb4, 0xe7, 0x93, 0xdf,
0x4b, 0x39, 0x9f, 0xfc, 0xbd, 0x94, 0x67, 0x16, 0xf1, 0x25, 0x5e, 0x49, 0x85, 0x80, 0xfe, 0x5a,
0x82, 0x80, 0x3e, 0x95, 0x8a, 0x01, 0xfd, 0x8d, 0xb4, 0x1f, 0xd0, 0x67, 0x52, 0x29, 0xa0, 0xbf,
0x95, 0xca, 0x01, 0xfd, 0x5a, 0xaa, 0x04, 0xf4, 0x77, 0x92, 0x14, 0xd0, 0xdf, 0x4b, 0x07, 0x01,
0xfd, 0x7b, 0x09, 0xf9, 0xf4, 0xe9, 0x2b, 0xe9, 0xde, 0xf1, 0xef, 0x60, 0x3f, 0xdc, 0x5a, 0x61,
0xce, 0xeb, 0x8f, 0xce, 0x85, 0x3f, 0xbb, 0xbd, 0x4e, 0x57, 0x4a, 0x33, 0xf1, 0xc9, 0xa8, 0xd3,
0xe9, 0xb7, 0xa4, 0xcc, 0x71, 0x13, 0x2a, 0xb1, 0x86, 0x01, 0xf3, 0xe5, 0x74, 0xf8, 0x76, 0xc8,
0x7c, 0x9f, 0x62, 0xbb, 0x51, 0x1b, 0x8b, 0x3d, 0x50, 0x26, 0x35, 0x29, 0x83, 0xee, 0x41, 0x45,
0x99, 0xd4, 0x66, 0xed, 0x5a, 0xaf, 0x3f, 0x7a, 0xd7, 0xc2, 0xb3, 0xda, 0x58, 0xca, 0x1e, 0x37,
0xa1, 0x14, 0x79, 0x37, 0xa3, 0x07, 0x70, 0xc0, 0xa4, 0x86, 0xa3, 0xc9, 0xac, 0x31, 0x1a, 0x0e,
0x5b, 0x8d, 0x49, 0xab, 0x29, 0x1c, 0x5f, 0x1b, 0xcf, 0xa6, 0x0c, 0xf0, 0x00, 0x4a, 0x4c, 0x62,
0x3d, 0x9b, 0x39, 0xfe, 0x52, 0x74, 0x4f, 0xfc, 0xf6, 0x03, 0xda, 0x87, 0xfc, 0xf9, 0xb8, 0x76,
0x3a, 0x1b, 0x2b, 0x6f, 0x85, 0xfd, 0xa3, 0x71, 0x6b, 0x28, 0xa5, 0x4f, 0xff, 0x7a, 0x08, 0x7b,
0xe3, 0xb3, 0xf3, 0xe1, 0xf8, 0x6b, 0x34, 0x80, 0x6a, 0x87, 0x50, 0xff, 0x7e, 0x8b, 0x5c, 0x93,
0x08, 0x45, 0xef, 0x15, 0x16, 0x70, 0x47, 0x8f, 0xb7, 0x5c, 0xe5, 0x72, 0x0a, 0x75, 0xe1, 0x9e,
0xc0, 0xfa, 0xd5, 0x48, 0x6d, 0x38, 0xe8, 0x10, 0x1a, 0x2b, 0x38, 0x7f, 0x01, 0xce, 0x08, 0x0e,
0x94, 0x5b, 0x38, 0xdb, 0x74, 0xee, 0x02, 0xfc, 0x13, 0x94, 0x3b, 0x84, 0x86, 0x4b, 0xe7, 0x24,
0xab, 0xaa, 0x11, 0x5e, 0x48, 0x5a, 0x20, 0x28, 0x51, 0x84, 0x8d, 0xd2, 0x47, 0x09, 0xd8, 0x72,
0x0a, 0x35, 0x61, 0x7f, 0xc0, 0x8a, 0xf2, 0xe9, 0x40, 0xe1, 0xb7, 0xc7, 0x1d, 0x05, 0xd6, 0x06,
0x94, 0x19, 0x7c, 0x26, 0x36, 0x6b, 0x73, 0xf1, 0xf1, 0x91, 0x85, 0xcc, 0x86, 0x05, 0x2c, 0xf8,
0x6d, 0x87, 0xd0, 0xda, 0x62, 0x71, 0x77, 0xfd, 0x94, 0xe4, 0xc3, 0x93, 0x68, 0xf2, 0xbf, 0x0b,
0x43, 0x4e, 0xa1, 0x05, 0x7c, 0x11, 0x8a, 0xe6, 0xcd, 0xab, 0x45, 0x3b, 0x56, 0x91, 0x86, 0xce,
0xd1, 0x47, 0x7e, 0xb2, 0x9c, 0x42, 0x03, 0xfe, 0xbe, 0xc4, 0xae, 0xe9, 0xdd, 0x9f, 0x4f, 0x93,
0x5f, 0x6c, 0xde, 0xb3, 0xf6, 0xe8, 0xc9, 0xa6, 0x69, 0xf6, 0x24, 0xe3, 0x70, 0x95, 0x30, 0x1c,
0x7b, 0xb1, 0xde, 0x81, 0xb8, 0xf9, 0x89, 0x28, 0xa7, 0x10, 0x86, 0x07, 0xdd, 0x5e, 0xb3, 0x43,
0xe8, 0xfa, 0xdd, 0x28, 0x5e, 0x99, 0x9b, 0xb5, 0xee, 0x34, 0xb1, 0x05, 0xa8, 0xdb, 0x6b, 0x36,
0x54, 0x53, 0x23, 0x8b, 0xb5, 0x95, 0x5b, 0x00, 0x93, 0xe3, 0x62, 0x08, 0x0f, 0x85, 0x69, 0xde,
0xab, 0x3a, 0x90, 0x4f, 0x8e, 0x83, 0xa7, 0x1b, 0xf1, 0xd9, 0x93, 0x5d, 0x4e, 0xa1, 0x3a, 0x1c,
0x06, 0x66, 0xd5, 0x16, 0x8b, 0x3b, 0xe0, 0x92, 0x6d, 0xfa, 0xc9, 0x77, 0x57, 0xec, 0xa5, 0xbf,
0xed, 0xeb, 0x7e, 0x13, 0x9f, 0x4a, 0xec, 0x12, 0x70, 0x03, 0x8b, 0x6d, 0x25, 0x68, 0x03, 0xc5,
0xb6, 0x35, 0xde, 0x1e, 0xda, 0x60, 0xe0, 0x5b, 0x80, 0xb6, 0xe2, 0x37, 0x9f, 0x50, 0x74, 0xa7,
0x62, 0x4d, 0xae, 0x98, 0xc7, 0xe2, 0x1d, 0x2b, 0xbe, 0x03, 0xa5, 0xb6, 0xd2, 0x21, 0xd4, 0xef,
0xfd, 0xc4, 0xf0, 0x62, 0x9d, 0xa3, 0x18, 0x5e, 0xbc, 0x61, 0x24, 0xa7, 0xd0, 0x9f, 0xe1, 0x41,
0x5b, 0x69, 0xd8, 0x44, 0xa5, 0x24, 0xd2, 0xa9, 0x43, 0xb1, 0xff, 0x1d, 0x24, 0xf4, 0x09, 0x8f,
0xe4, 0x6d, 0x22, 0xc1, 0x0a, 0x7f, 0x82, 0x22, 0xef, 0x3d, 0xf6, 0x79, 0x59, 0x1d, 0xdb, 0x95,
0x70, 0x83, 0x35, 0xee, 0x3e, 0x36, 0x25, 0xa7, 0x5e, 0xa5, 0x51, 0x07, 0x8a, 0x2d, 0xed, 0x2a,
0xe8, 0x86, 0x6d, 0xcb, 0x01, 0x5b, 0xe6, 0xe4, 0x14, 0xea, 0x01, 0x12, 0x29, 0x26, 0xf2, 0x53,
0xc5, 0xe6, 0xe6, 0xf4, 0xd1, 0x61, 0x72, 0x83, 0x5c, 0x4e, 0xa1, 0x3f, 0xc0, 0x7e, 0x87, 0xd0,
0x75, 0x63, 0x3d, 0x29, 0x5e, 0x37, 0x6b, 0xb7, 0xe1, 0x50, 0xb8, 0x23, 0x60, 0x36, 0xae, 0x44,
0x51, 0xfe, 0x69, 0x38, 0x18, 0x0e, 0x14, 0x6a, 0xd9, 0xe4, 0xdc, 0xb8, 0x5c, 0x7f, 0xcf, 0x6f,
0x63, 0xe2, 0x9b, 0x7e, 0x0f, 0xda, 0x10, 0xae, 0x63, 0x78, 0xc0, 0x72, 0x0f, 0x83, 0xd5, 0x23,
0xb8, 0xdb, 0xfc, 0xbe, 0xd9, 0x87, 0x1c, 0xb1, 0xea, 0xfd, 0xde, 0xf7, 0x69, 0xa0, 0x9b, 0xbf,
0x7b, 0x00, 0x8f, 0x38, 0x96, 0x7f, 0x61, 0x7c, 0x34, 0x64, 0xf2, 0x27, 0x8f, 0xc4, 0x76, 0x24,
0x98, 0x97, 0xb4, 0x1d, 0x9f, 0x6d, 0xc6, 0x17, 0x3f, 0x1c, 0xa4, 0xd0, 0x04, 0x1e, 0xaf, 0x01,
0xe3, 0xff, 0xb7, 0xfa, 0xc5, 0xa8, 0x3f, 0xc1, 0x21, 0x47, 0xbc, 0x0d, 0xf8, 0xd5, 0xf6, 0x3f,
0x78, 0x45, 0xfe, 0x3e, 0xb6, 0xc1, 0x07, 0x03, 0x38, 0xec, 0x10, 0x1a, 0xfd, 0x2f, 0xda, 0xe6,
0xd0, 0xde, 0xfe, 0x8f, 0x32, 0x5e, 0xa2, 0x3c, 0x15, 0x9b, 0x73, 0xdb, 0x98, 0xd5, 0x82, 0xbd,
0x6d, 0xb7, 0x23, 0xdc, 0xbd, 0xc0, 0x4f, 0xf0, 0x28, 0x79, 0x81, 0x9a, 0xae, 0xff, 0x5a, 0xf0,
0x8b, 0x3d, 0xfe, 0x7f, 0xbf, 0x6f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x9e, 0x44, 0xcf,
0xfd, 0x27, 0x00, 0x00,
// 3462 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x5a, 0x5b, 0x77, 0xe3, 0x46,
0x72, 0xe6, 0x45, 0x12, 0xc9, 0xe2, 0x0d, 0xea, 0x99, 0xd1, 0x70, 0x34, 0x17, 0x8f, 0x11, 0xaf,
0x77, 0xa2, 0xcd, 0xca, 0x63, 0x59, 0x1e, 0x7b, 0x7d, 0x76, 0x8f, 0x97, 0x77, 0x72, 0x86, 0xb7,
0xd3, 0x20, 0xad, 0x24, 0x7b, 0x4e, 0xb8, 0x10, 0xd0, 0xa2, 0xb0, 0x43, 0x02, 0x0c, 0xd0, 0xd0,
0x58, 0x79, 0xd8, 0x9c, 0x93, 0x3f, 0x91, 0x7f, 0x91, 0xc7, 0xe4, 0xa7, 0xe4, 0x17, 0xe4, 0x3d,
0x2f, 0x79, 0xce, 0x9e, 0xee, 0x06, 0x40, 0x00, 0x02, 0xa9, 0xb1, 0xf7, 0xad, 0xba, 0xba, 0xea,
0xeb, 0x46, 0x75, 0x55, 0x75, 0x75, 0x91, 0x00, 0x0b, 0x7b, 0xad, 0x9d, 0xae, 0x6d, 0x8b, 0x5a,
0xa8, 0x38, 0x39, 0xff, 0x60, 0x4e, 0xbe, 0x9c, 0x33, 0x96, 0xfc, 0x27, 0x90, 0xa6, 0xb6, 0xb1,
0x58, 0x10, 0xbb, 0xae, 0x51, 0xc3, 0x32, 0x15, 0x42, 0x51, 0x03, 0x2a, 0x11, 0x9e, 0x53, 0x4b,
0xbf, 0xcc, 0xbe, 0x2a, 0x9e, 0x1d, 0x9f, 0x86, 0x34, 0x4f, 0x23, 0x22, 0x38, 0xa6, 0x81, 0x10,
0xec, 0x8d, 0xd4, 0x15, 0xa9, 0x65, 0x5e, 0xa6, 0x5f, 0x15, 0x30, 0xa7, 0xe5, 0xff, 0x04, 0x28,
0x47, 0xc4, 0x50, 0x05, 0x32, 0x86, 0x5e, 0x4b, 0xbf, 0x4c, 0xbf, 0x2a, 0xe3, 0x8c, 0xa1, 0xa3,
0x1a, 0xe4, 0x2c, 0x93, 0x28, 0xd7, 0x16, 0xe5, 0x8a, 0x79, 0xec, 0x0f, 0xd1, 0x31, 0xe4, 0x0d,
0x87, 0x69, 0xdd, 0x90, 0x5a, 0x96, 0x4f, 0x05, 0x63, 0xf4, 0x0c, 0x0a, 0xc6, 0x6a, 0xe5, 0x52,
0xf5, 0x72, 0x49, 0x6a, 0x7b, 0x7c, 0x72, 0xc3, 0x40, 0x03, 0xa8, 0x38, 0xc4, 0xbe, 0x31, 0x34,
0xa2, 0x50, 0xd5, 0xa6, 0x44, 0xaf, 0xed, 0xbf, 0x4c, 0xbf, 0x2a, 0x9e, 0xc9, 0x49, 0x5f, 0xa3,
0x44, 0x24, 0x7b, 0x29, 0x1c, 0xd3, 0x45, 0x7f, 0x0f, 0xc8, 0x75, 0x2e, 0xbb, 0xaa, 0xbe, 0x20,
0xb4, 0x69, 0x99, 0x26, 0xd1, 0x18, 0xe2, 0x01, 0x47, 0xfc, 0x3c, 0x09, 0x71, 0xa6, 0x34, 0x62,
0xd2, 0xbd, 0x14, 0x4e, 0xc0, 0x40, 0x2a, 0x3c, 0x0a, 0xb8, 0x2d, 0xc3, 0xd1, 0x02, 0xf0, 0x1c,
0x07, 0xff, 0xdb, 0x9d, 0xe0, 0x61, 0x85, 0x5e, 0x0a, 0x27, 0x23, 0xa1, 0x3e, 0x94, 0x3f, 0x18,
0x57, 0x46, 0x7d, 0xe2, 0x5b, 0x22, 0xcf, 0xa1, 0x3f, 0x4d, 0x82, 0xbe, 0x08, 0x0b, 0xf6, 0x52,
0x38, 0xaa, 0xc9, 0xec, 0xc0, 0x18, 0xc1, 0xf6, 0xeb, 0x8e, 0x42, 0xd5, 0x5a, 0x61, 0xbb, 0x1d,
0x2e, 0xee, 0x48, 0x33, 0x3b, 0xdc, 0xc5, 0x40, 0xdf, 0x41, 0xde, 0x71, 0xae, 0x07, 0xd6, 0xc2,
0x30, 0x6b, 0xc0, 0xf1, 0x9e, 0x25, 0x9e, 0x94, 0xd2, 0xe3, 0x32, 0xbd, 0x14, 0x0e, 0xe4, 0x11,
0x06, 0x49, 0xbf, 0xd6, 0xd6, 0x03, 0xa2, 0x3a, 0xa4, 0x6b, 0xab, 0x26, 0xfb, 0xc6, 0x22, 0xc7,
0xf8, 0x2c, 0x09, 0xa3, 0xd5, 0x6b, 0x4e, 0xc2, 0xb2, 0xbd, 0x14, 0xbe, 0xa3, 0x8f, 0x3a, 0x50,
0x5a, 0xd8, 0x96, 0xbb, 0xc6, 0x44, 0x23, 0xcc, 0xfb, 0x4a, 0x1c, 0xef, 0x65, 0x12, 0x5e, 0x37,
0x24, 0xd7, 0x4b, 0xe1, 0x88, 0x1e, 0xfa, 0x27, 0x78, 0x18, 0x1e, 0x2b, 0xe4, 0x9f, 0x5d, 0x62,
0x6a, 0xa4, 0x56, 0xe6, 0x78, 0xaf, 0xee, 0xc3, 0xf3, 0xe5, 0x7b, 0x29, 0x9c, 0x88, 0x83, 0xce,
0xe1, 0x60, 0xb1, 0x36, 0xac, 0xbe, 0x59, 0xab, 0x70, 0xc4, 0xc4, 0x68, 0xed, 0x4e, 0xfa, 0xe3,
0x3e, 0xb3, 0x99, 0x27, 0x8b, 0x5a, 0x00, 0x97, 0xaa, 0x73, 0xad, 0x68, 0xb6, 0xb1, 0xa6, 0xb5,
0x6a, 0x42, 0x64, 0x78, 0x79, 0x81, 0x9d, 0x7b, 0x23, 0x90, 0xec, 0xa5, 0x71, 0x48, 0x0f, 0xd5,
0xa1, 0x70, 0x6d, 0xe8, 0x1e, 0x88, 0x94, 0xe0, 0x54, 0x21, 0x90, 0x5e, 0xbf, 0x15, 0x60, 0x6c,
0xb4, 0x90, 0x06, 0x47, 0x3a, 0x59, 0x2f, 0xad, 0x5b, 0x85, 0x50, 0x6a, 0x98, 0x0b, 0x67, 0x4a,
0x56, 0xeb, 0xa5, 0x4a, 0x49, 0xed, 0x30, 0xc1, 0xff, 0x05, 0x5e, 0x2b, 0x51, 0xa1, 0x97, 0xc6,
0x5b, 0xa0, 0xd0, 0x09, 0x64, 0x97, 0xd6, 0xa2, 0x86, 0x38, 0xe2, 0x51, 0x02, 0xe2, 0xc0, 0x5a,
0xf4, 0xd2, 0x98, 0x09, 0xa1, 0x37, 0x90, 0x63, 0x36, 0x1a, 0xbb, 0xb4, 0xf6, 0x20, 0xc1, 0xa0,
0x42, 0x9e, 0xd9, 0x73, 0xec, 0xb2, 0x4f, 0xf1, 0x85, 0xd1, 0x6f, 0xa1, 0xc0, 0xcf, 0x47, 0x21,
0xa6, 0x5e, 0x7b, 0x98, 0xe0, 0xc0, 0x9e, 0xa6, 0x2f, 0xc3, 0xcc, 0x10, 0x28, 0x34, 0x0a, 0x90,
0xf3, 0x8e, 0xaa, 0x91, 0x87, 0x03, 0x21, 0x2a, 0x3f, 0x86, 0x47, 0x89, 0xf9, 0x49, 0x7e, 0x0a,
0x4f, 0xb6, 0xa6, 0x19, 0xf9, 0x05, 0x3c, 0xdb, 0x95, 0x26, 0xe4, 0x23, 0x78, 0x98, 0x14, 0xeb,
0x21, 0xd0, 0xbb, 0x31, 0x2b, 0x7f, 0x01, 0xd5, 0x58, 0x00, 0xb2, 0xf4, 0xbb, 0x64, 0xc4, 0xcc,
0x21, 0x36, 0xcf, 0xe5, 0x05, 0xbc, 0x61, 0xc8, 0x4f, 0xe0, 0xf1, 0x96, 0x68, 0x93, 0xfb, 0xf0,
0x20, 0xc1, 0xd1, 0x19, 0x1e, 0xb7, 0x07, 0xbf, 0x3f, 0x3c, 0xbc, 0x80, 0x81, 0x1e, 0xc2, 0xfe,
0x8d, 0xba, 0x74, 0xc5, 0xcd, 0xb2, 0x8f, 0xc5, 0x40, 0xfe, 0x57, 0x78, 0xba, 0x23, 0x66, 0xee,
0x81, 0x3c, 0x01, 0xa9, 0xbf, 0x30, 0x2d, 0x9b, 0x8c, 0x5d, 0x3a, 0xbe, 0x1a, 0xdb, 0x3a, 0xb1,
0xbd, 0xeb, 0xe7, 0x0e, 0x1f, 0x1d, 0xc1, 0x01, 0x5f, 0xd1, 0xa9, 0x65, 0x5f, 0x66, 0x5f, 0xed,
0x63, 0x6f, 0x24, 0xff, 0x57, 0x3a, 0xb8, 0xdb, 0x44, 0x8c, 0xa1, 0x53, 0xe1, 0x3f, 0x23, 0x77,
0xc5, 0x57, 0xac, 0x9c, 0x3d, 0x8c, 0x78, 0x01, 0x93, 0x1a, 0xb9, 0x2b, 0xec, 0x0b, 0xa1, 0xdf,
0x01, 0xac, 0xdd, 0xe5, 0x72, 0xb6, 0x6e, 0x59, 0x1f, 0x4c, 0xbe, 0x7e, 0xe5, 0xec, 0xf9, 0x1d,
0x95, 0xbe, 0x39, 0x09, 0x84, 0x70, 0x48, 0x01, 0x7d, 0x03, 0x20, 0x42, 0xba, 0xad, 0x2f, 0xc4,
0x15, 0x59, 0x39, 0x7b, 0x9c, 0xa0, 0xce, 0xa6, 0x71, 0x48, 0x54, 0xfe, 0x06, 0x1e, 0x25, 0x86,
0x38, 0x7a, 0x01, 0xe0, 0x70, 0x2a, 0x64, 0xb5, 0x10, 0x47, 0x7e, 0x03, 0x0f, 0x93, 0xc2, 0xfa,
0x5e, 0xbd, 0xff, 0x4b, 0xc3, 0xb3, 0x5d, 0xf1, 0x8b, 0x64, 0x28, 0x51, 0x8f, 0x0e, 0x41, 0x44,
0x78, 0xe8, 0x2d, 0xec, 0xd1, 0xdb, 0x35, 0xf1, 0xec, 0xf4, 0xe6, 0xa3, 0x93, 0xc3, 0xa9, 0x4f,
0x4c, 0x6f, 0xd7, 0x04, 0x73, 0x0c, 0x99, 0x40, 0x29, 0xcc, 0x45, 0x87, 0x50, 0xee, 0xcc, 0x06,
0x83, 0xb9, 0xd2, 0x9e, 0x4e, 0xfb, 0xa3, 0xae, 0x22, 0xa5, 0x50, 0x11, 0x72, 0xa3, 0xf6, 0xf4,
0x62, 0x8c, 0xdf, 0x49, 0x69, 0x94, 0x87, 0xbd, 0x8b, 0x7e, 0xa7, 0x2f, 0x65, 0x50, 0x0e, 0xb2,
0x33, 0xa5, 0x21, 0x65, 0x51, 0x19, 0x0a, 0x8d, 0xc1, 0xac, 0x3d, 0x1d, 0x8f, 0xa7, 0x3d, 0x69,
0x0f, 0x3d, 0x80, 0xea, 0x14, 0xf7, 0xbb, 0xdd, 0x36, 0x9e, 0xd7, 0x9b, 0xd3, 0xfe, 0x78, 0xa4,
0x48, 0xfb, 0x72, 0x11, 0x0a, 0x41, 0x92, 0x91, 0xd7, 0x50, 0x8e, 0x64, 0x90, 0x9f, 0xec, 0x2e,
0x5f, 0x84, 0xe3, 0xa0, 0x72, 0xf6, 0xe4, 0x8e, 0xf4, 0xd8, 0xa5, 0x3f, 0x30, 0x01, 0x3f, 0x44,
0xda, 0x50, 0x8d, 0x65, 0x9e, 0x9f, 0x15, 0x69, 0x1f, 0xe0, 0x98, 0xa5, 0x05, 0xcc, 0x42, 0xcb,
0xa1, 0xbe, 0x79, 0x15, 0x6a, 0xd9, 0xea, 0x82, 0x1f, 0xdd, 0x34, 0xe1, 0xe8, 0xc2, 0x3c, 0xf4,
0x35, 0xe4, 0x1d, 0x4f, 0x8d, 0x43, 0x17, 0x63, 0x9b, 0xbf, 0x30, 0x3a, 0x86, 0x8f, 0x8b, 0x03,
0x51, 0xf9, 0xdf, 0xb3, 0x50, 0x0a, 0x4f, 0xb1, 0x12, 0xd3, 0xdc, 0xac, 0xc1, 0x69, 0x56, 0x26,
0xea, 0x86, 0xc3, 0xea, 0x3e, 0xdd, 0x0b, 0xe1, 0x60, 0xcc, 0xfc, 0xd2, 0x26, 0x0b, 0x77, 0xa9,
0x52, 0xcb, 0xbe, 0xe5, 0x11, 0x52, 0xc0, 0x21, 0x0e, 0xfa, 0x1e, 0x4a, 0x1f, 0x2c, 0xfb, 0xbd,
0x61, 0x2e, 0xe6, 0x2b, 0x4b, 0x17, 0x95, 0x64, 0x25, 0x96, 0xbb, 0xd9, 0x06, 0x2e, 0x84, 0xd0,
0xd0, 0xd2, 0x09, 0x2e, 0x7e, 0xd8, 0x0c, 0xd0, 0x1b, 0x28, 0xa8, 0x2e, 0xbd, 0x16, 0xda, 0xfb,
0x09, 0xc7, 0xc2, 0xb4, 0xeb, 0x2e, 0xbd, 0xe6, 0xaa, 0x79, 0xd5, 0xa3, 0x58, 0xd5, 0xab, 0x5d,
0xab, 0xa6, 0x49, 0x96, 0xbc, 0x90, 0x2c, 0x63, 0x7f, 0x88, 0x4e, 0xe1, 0x40, 0x5d, 0xcf, 0x1b,
0x8a, 0xe2, 0x15, 0x81, 0x8f, 0xef, 0xc0, 0x35, 0x14, 0xa5, 0x79, 0xb5, 0xc0, 0xfb, 0xea, 0xba,
0xa1, 0x28, 0xe8, 0x7b, 0xa8, 0x6a, 0x4b, 0x83, 0x98, 0x94, 0xe9, 0xcc, 0x97, 0x86, 0x43, 0x6b,
0x79, 0x5e, 0xba, 0x6f, 0x55, 0x2c, 0x0b, 0xf9, 0x86, 0xa2, 0x0c, 0x0c, 0x87, 0xa2, 0xa7, 0xfc,
0x22, 0x27, 0x73, 0xc7, 0x31, 0x74, 0x5e, 0xcd, 0xe5, 0x71, 0x9e, 0x31, 0x14, 0xc7, 0xd0, 0x59,
0xee, 0x33, 0xc9, 0x8f, 0x2b, 0xcb, 0xe4, 0x35, 0x4b, 0x1e, 0x7b, 0x23, 0xf9, 0x3f, 0xd2, 0x50,
0xe0, 0x27, 0x43, 0x59, 0xf4, 0x9e, 0xc2, 0x1e, 0x37, 0x80, 0xf0, 0xe2, 0xe3, 0xbb, 0x47, 0xcb,
0xa4, 0xb8, 0x05, 0xb8, 0x5c, 0xf8, 0xeb, 0x33, 0xd1, 0xaf, 0x47, 0xb0, 0xc7, 0xf7, 0x21, 0x8e,
0x8a, 0xd3, 0xa8, 0x09, 0x55, 0xcd, 0xb5, 0x6d, 0x62, 0x06, 0xae, 0xc7, 0xcf, 0x69, 0xa7, 0x0f,
0xc5, 0x35, 0xe4, 0x33, 0x80, 0x8d, 0x09, 0xd8, 0x32, 0x8a, 0xd2, 0x6f, 0xf9, 0x7e, 0xc4, 0x68,
0x24, 0x41, 0x76, 0xa2, 0xbc, 0xf3, 0x5e, 0x2f, 0x8c, 0x94, 0x3f, 0x85, 0xb2, 0x42, 0x6d, 0x76,
0xd4, 0xc4, 0x71, 0x98, 0xab, 0x4b, 0x90, 0x5d, 0x39, 0x0b, 0x4f, 0x8b, 0x91, 0xf2, 0x6b, 0x40,
0x11, 0x91, 0xba, 0x6d, 0xab, 0xb7, 0xcc, 0x25, 0x57, 0xce, 0x82, 0xd3, 0xfc, 0x1d, 0x55, 0xc0,
0xc1, 0x58, 0x3e, 0x85, 0x52, 0xfb, 0x86, 0x98, 0xd4, 0x8b, 0x26, 0xe6, 0xa2, 0xec, 0xd0, 0x88,
0xc9, 0xf2, 0x10, 0x87, 0xce, 0xe2, 0x10, 0x47, 0x56, 0x01, 0xb8, 0x3c, 0x0f, 0x6c, 0x74, 0x0c,
0x39, 0xea, 0xf0, 0x05, 0xc5, 0x2e, 0x7a, 0x29, 0xec, 0x33, 0xd0, 0x11, 0xec, 0xd3, 0x4b, 0xcb,
0x12, 0x36, 0xcd, 0xf7, 0x52, 0x58, 0x0c, 0x51, 0x0d, 0x0e, 0xa8, 0x61, 0xd2, 0x37, 0xe7, 0xdc,
0xaa, 0x59, 0x56, 0x09, 0x8a, 0x71, 0x63, 0x1f, 0xb2, 0x37, 0xea, 0x52, 0x1e, 0xc0, 0x3e, 0x5f,
0x82, 0x99, 0x85, 0x6e, 0x76, 0xc1, 0x69, 0xf4, 0x45, 0x70, 0xfb, 0x65, 0x12, 0xdc, 0x6a, 0xb3,
0xb5, 0xe0, 0x5a, 0xfc, 0x23, 0x3c, 0x64, 0xb1, 0xdf, 0x32, 0xec, 0xb1, 0xdd, 0x31, 0x96, 0xc4,
0xff, 0x50, 0x09, 0xb2, 0xba, 0xe1, 0x57, 0x0b, 0x8c, 0x64, 0xce, 0xb5, 0xb6, 0xc9, 0x95, 0xf1,
0xa3, 0x67, 0x74, 0x6f, 0xc4, 0x4c, 0x62, 0x99, 0xcb, 0xdb, 0x8e, 0xb5, 0x64, 0xd7, 0xb2, 0x78,
0xfa, 0x85, 0x38, 0xec, 0xfa, 0x8a, 0xad, 0xe0, 0xac, 0x2d, 0xd3, 0x21, 0x22, 0xdc, 0x1d, 0x77,
0x49, 0x27, 0x2a, 0xbd, 0xf6, 0xaf, 0xa1, 0x0d, 0x47, 0x1e, 0x43, 0x15, 0x13, 0x55, 0x0f, 0xef,
0x0a, 0xc1, 0xde, 0x7a, 0x23, 0xcc, 0x69, 0x96, 0x05, 0x1d, 0x76, 0xbf, 0xf1, 0x6d, 0x65, 0xb1,
0x18, 0x30, 0x49, 0x5d, 0xa5, 0x2a, 0xdf, 0x4f, 0x09, 0x73, 0x5a, 0x7e, 0x0d, 0xd2, 0x06, 0xd0,
0xdb, 0xc4, 0x33, 0x28, 0xd8, 0x44, 0xd5, 0x9b, 0x96, 0x6b, 0x52, 0xcf, 0x92, 0x1b, 0x86, 0x7c,
0x03, 0xd2, 0x85, 0x6d, 0x50, 0x72, 0xdf, 0x1e, 0x8e, 0x58, 0x1a, 0x58, 0xb3, 0x7a, 0x52, 0xe4,
0x34, 0x6f, 0xc4, 0xb2, 0xed, 0xca, 0x75, 0xe8, 0xc8, 0xa2, 0xed, 0x1f, 0x59, 0xac, 0x0b, 0xeb,
0x44, 0x78, 0xc1, 0x4e, 0xf7, 0x42, 0x3b, 0xfd, 0x05, 0x54, 0xd9, 0x92, 0x7d, 0xf3, 0xca, 0xda,
0xb1, 0xac, 0xfc, 0x67, 0x90, 0x36, 0x62, 0xde, 0x07, 0x25, 0x25, 0x5d, 0x16, 0xa7, 0xc6, 0xbf,
0x10, 0xcf, 0x42, 0x9c, 0x66, 0x3c, 0x9e, 0x05, 0xb2, 0x3c, 0xa4, 0x83, 0x48, 0x5f, 0x59, 0xfa,
0xd4, 0x58, 0x89, 0xdc, 0x9a, 0xc5, 0xfe, 0x90, 0x19, 0xd9, 0x70, 0x5a, 0x86, 0xcd, 0xb3, 0x66,
0x1e, 0x8b, 0x81, 0xfc, 0x8f, 0x20, 0x05, 0x55, 0x45, 0x28, 0x42, 0x44, 0x29, 0x11, 0x3e, 0xd5,
0x0d, 0x07, 0x7d, 0x0e, 0x15, 0x6a, 0xac, 0x88, 0xe5, 0x52, 0x85, 0x68, 0x96, 0xa9, 0x3b, 0x5e,
0x52, 0x89, 0x71, 0xe5, 0x17, 0x50, 0x0a, 0xb0, 0xdf, 0x5a, 0x97, 0xf1, 0x4e, 0x84, 0xfc, 0x59,
0x68, 0xed, 0xb7, 0xd6, 0x25, 0x4f, 0x8e, 0x12, 0x64, 0x0d, 0x5d, 0x34, 0x43, 0xca, 0x98, 0x91,
0xf2, 0x0f, 0x50, 0xeb, 0xf5, 0x5b, 0xd8, 0x35, 0x4d, 0xc3, 0x5c, 0xbc, 0xb5, 0x2e, 0x79, 0x6e,
0xc3, 0xdc, 0xc7, 0x42, 0x88, 0x59, 0xde, 0xdb, 0x40, 0xb0, 0x77, 0xb3, 0xea, 0xeb, 0xbe, 0x95,
0x18, 0xcd, 0x0e, 0xd6, 0xb1, 0x5c, 0x5b, 0x23, 0x5e, 0x8e, 0xf3, 0x46, 0xf2, 0x9f, 0xa1, 0x1a,
0xfa, 0x72, 0x0e, 0xf7, 0x2b, 0xc8, 0xfe, 0xc9, 0xba, 0xe4, 0x78, 0xf1, 0x64, 0x17, 0xde, 0x28,
0x66, 0x52, 0xcc, 0x4a, 0x86, 0xd3, 0x31, 0x4c, 0xc3, 0xb9, 0x0e, 0x2e, 0xc2, 0x10, 0x67, 0x13,
0x1b, 0x6f, 0x1d, 0xcb, 0xdc, 0x5c, 0x85, 0x3e, 0x47, 0x3e, 0x85, 0xe2, 0xa0, 0xdd, 0x0a, 0x6e,
0xda, 0x4f, 0xa0, 0x78, 0xb9, 0x34, 0xcc, 0xf7, 0x73, 0x2d, 0xf0, 0xe3, 0x32, 0x06, 0xce, 0x12,
0x8e, 0xfc, 0x3f, 0x7b, 0x50, 0x11, 0x2f, 0x8c, 0x40, 0xa7, 0x06, 0x39, 0x62, 0x8a, 0x8b, 0x38,
0x2d, 0x5a, 0x39, 0xde, 0x90, 0x99, 0xf1, 0xc6, 0xd0, 0xfd, 0xdc, 0x7a, 0x63, 0x70, 0xce, 0x3a,
0xc8, 0xf3, 0x8c, 0xe4, 0x9e, 0xad, 0x9a, 0xee, 0x95, 0xaa, 0x51, 0xd7, 0x26, 0x36, 0xf7, 0x97,
0x02, 0x8e, 0xf0, 0xd8, 0x0a, 0x6b, 0xdb, 0xd2, 0x5d, 0x8d, 0x72, 0xb7, 0x29, 0x60, 0x7f, 0xc8,
0xcd, 0x4a, 0x6c, 0x43, 0x15, 0xf7, 0x29, 0x33, 0x2b, 0x1f, 0xa1, 0x17, 0x50, 0x74, 0x1d, 0x32,
0x6f, 0xb6, 0x9a, 0xf3, 0x76, 0x73, 0xc8, 0xef, 0xd4, 0x3c, 0x2e, 0xb8, 0x0e, 0x69, 0xb6, 0x9a,
0xed, 0xe6, 0x90, 0xdd, 0x7e, 0x6c, 0x1e, 0x8f, 0x5a, 0x7d, 0x85, 0xf7, 0x46, 0xf2, 0x38, 0xef,
0x3a, 0x84, 0x8f, 0xd1, 0x2b, 0x90, 0xd8, 0x64, 0xaf, 0xdf, 0x9a, 0xbf, 0x6b, 0xff, 0x43, 0x63,
0x5c, 0xc7, 0x2d, 0xef, 0x86, 0xac, 0xb8, 0x0e, 0xe9, 0xf5, 0x5b, 0x3e, 0x17, 0xc9, 0x50, 0xf6,
0x25, 0x87, 0xe3, 0x99, 0xd2, 0xe6, 0x6d, 0x8c, 0x3c, 0x2e, 0x0a, 0x31, 0xce, 0xf2, 0xb7, 0xc2,
0x64, 0x70, 0xfd, 0x82, 0x37, 0x29, 0xc4, 0x56, 0x98, 0x3f, 0xd5, 0x2f, 0xd0, 0x63, 0xc8, 0xb1,
0xf9, 0xd9, 0x50, 0xe1, 0x0d, 0x87, 0x3c, 0x3e, 0x70, 0x1d, 0x32, 0x1b, 0x2a, 0xe8, 0x39, 0x00,
0x9b, 0x50, 0xda, 0xb8, 0x5f, 0x1f, 0x78, 0x17, 0x31, 0xd3, 0x13, 0x0c, 0xf4, 0x16, 0x2a, 0xb6,
0xa9, 0x1b, 0xce, 0x3c, 0x28, 0xb1, 0x44, 0x37, 0xe0, 0x6f, 0xa2, 0xf5, 0x61, 0xe4, 0xac, 0xda,
0xf4, 0x9a, 0xd8, 0x26, 0xa1, 0xb8, 0xcc, 0x55, 0x83, 0x23, 0x1c, 0x82, 0xa4, 0xe9, 0xda, 0x9c,
0x68, 0xab, 0x0d, 0x5a, 0xf5, 0xe3, 0xd1, 0x2a, 0x9a, 0xae, 0xb5, 0xb5, 0x55, 0x00, 0x57, 0x87,
0x92, 0xbb, 0x0a, 0x6d, 0x4c, 0xf4, 0x09, 0x5e, 0xec, 0x80, 0x9a, 0x0d, 0x15, 0x5c, 0x74, 0x57,
0xc1, 0x8e, 0xe4, 0x09, 0x1c, 0x25, 0x2f, 0xc6, 0x0b, 0x17, 0xcb, 0xa1, 0x73, 0x55, 0xd7, 0xfd,
0x6b, 0x25, 0xcf, 0x18, 0x75, 0x5d, 0xb7, 0xd1, 0x13, 0xc8, 0xeb, 0xe4, 0x46, 0xcc, 0x09, 0xb7,
0xcb, 0xe9, 0xe4, 0x86, 0x4d, 0xc9, 0xbf, 0x83, 0xc3, 0x3b, 0x6b, 0xb2, 0x74, 0xa4, 0xe9, 0xb6,
0xb5, 0xf2, 0x3c, 0x57, 0x0c, 0x58, 0x00, 0x5f, 0x19, 0xcb, 0xa0, 0xa5, 0xc9, 0x68, 0x79, 0x0e,
0x9f, 0x8a, 0x77, 0x06, 0xd1, 0xfd, 0xad, 0xf4, 0x4d, 0x4a, 0xec, 0x2b, 0x55, 0x23, 0xc1, 0x87,
0x7f, 0x07, 0x7b, 0xbc, 0x14, 0x13, 0x5d, 0xd4, 0x68, 0x77, 0x6c, 0xab, 0x16, 0xe6, 0x3a, 0xf2,
0xbf, 0x65, 0xe1, 0xc9, 0x76, 0xe4, 0xa4, 0x6c, 0xfc, 0xbd, 0x97, 0x79, 0xc5, 0xbb, 0xe0, 0x57,
0x1f, 0xb7, 0xda, 0x69, 0xa8, 0x20, 0x63, 0xc9, 0x63, 0xcd, 0x8c, 0x43, 0x1c, 0xe7, 0xdc, 0x4f,
0x0e, 0x1b, 0x0e, 0x2b, 0x68, 0x4c, 0x42, 0x57, 0xaa, 0xf3, 0xfe, 0xdc, 0x8b, 0xcb, 0x60, 0x1c,
0x8e, 0xfa, 0xfd, 0x68, 0xd4, 0x8f, 0x01, 0xe9, 0xd7, 0xda, 0x5a, 0x21, 0xf6, 0x0d, 0xb1, 0x83,
0xda, 0x4d, 0x34, 0x4e, 0x3f, 0x89, 0x6c, 0xb2, 0xd5, 0x6b, 0x4e, 0xa2, 0x62, 0x38, 0x41, 0x15,
0x7d, 0x06, 0x65, 0xdf, 0x95, 0xfa, 0xe6, 0xcc, 0x21, 0x5e, 0x38, 0x47, 0x99, 0x72, 0x13, 0xf6,
0x78, 0x8d, 0x0d, 0x70, 0x30, 0xac, 0x8f, 0x66, 0xf5, 0x81, 0x94, 0x42, 0x55, 0x28, 0xb2, 0x35,
0xe6, 0xcd, 0x41, 0xbf, 0x3d, 0x9a, 0x4a, 0xe9, 0x80, 0xa1, 0xb4, 0xf1, 0x0f, 0x6d, 0x2c, 0x65,
0xd8, 0x73, 0x6e, 0x36, 0x1a, 0xd6, 0x47, 0xf5, 0x6e, 0xbb, 0x25, 0x65, 0xe5, 0xff, 0xcf, 0x02,
0xba, 0xbb, 0xab, 0x4d, 0xb5, 0x36, 0xb1, 0xec, 0x20, 0x2b, 0x6e, 0x38, 0xe8, 0x15, 0x54, 0xc5,
0x28, 0x30, 0xb7, 0xe7, 0x3b, 0x71, 0x36, 0x6f, 0xa1, 0x10, 0xd5, 0xe1, 0x85, 0x80, 0x67, 0xf1,
0x0d, 0x03, 0x9d, 0x80, 0x64, 0x5a, 0x94, 0x3d, 0x1c, 0x2c, 0xdb, 0xa0, 0x2a, 0xef, 0x81, 0x8b,
0x36, 0xf7, 0x1d, 0x3e, 0x3a, 0x05, 0xa4, 0x5b, 0x23, 0x8b, 0x36, 0x0c, 0x53, 0xdf, 0x2c, 0x2b,
0xce, 0x22, 0x61, 0x86, 0xdd, 0x97, 0x9a, 0xba, 0x5c, 0x5e, 0xaa, 0xda, 0x7b, 0xaf, 0x7d, 0x27,
0x52, 0x66, 0x8c, 0x8b, 0xce, 0xe1, 0xc0, 0x56, 0xcd, 0x05, 0x71, 0x6a, 0x39, 0xee, 0xc5, 0xcf,
0xb6, 0x1c, 0x19, 0x66, 0x42, 0xd8, 0x93, 0x45, 0x1d, 0xc8, 0x59, 0x6b, 0xf1, 0x13, 0x82, 0x78,
0x87, 0xfc, 0xdd, 0x3d, 0x27, 0x7d, 0x3a, 0x16, 0xe2, 0x6d, 0x93, 0xda, 0xb7, 0xd8, 0x57, 0x46,
0x4d, 0x28, 0x3a, 0xec, 0x03, 0xb5, 0x9e, 0xe5, 0x50, 0xa7, 0x56, 0xe0, 0x58, 0x9f, 0x6e, 0xc3,
0x0a, 0x24, 0x71, 0x58, 0xeb, 0xf8, 0x3b, 0x28, 0x85, 0xd1, 0xd9, 0xad, 0xf3, 0x9e, 0xdc, 0x7a,
0xe7, 0xc6, 0xc8, 0xe8, 0x8b, 0xb7, 0xe0, 0xbd, 0x78, 0xbf, 0xcb, 0x7c, 0x9b, 0x96, 0x2d, 0xa8,
0xc6, 0xbe, 0x91, 0xdf, 0xa1, 0x8c, 0x18, 0x58, 0x1f, 0x82, 0xbe, 0x57, 0x88, 0x13, 0xcc, 0xcf,
0xd6, 0x6b, 0xe2, 0xa7, 0x9d, 0x10, 0x27, 0x38, 0x73, 0x5e, 0x0f, 0x85, 0xcf, 0x9c, 0x31, 0xe4,
0x6f, 0xe1, 0x61, 0xd2, 0x17, 0xf1, 0x57, 0x87, 0xaa, 0x05, 0xaf, 0x0e, 0x55, 0xe3, 0x75, 0xc6,
0xda, 0xc3, 0xcf, 0x18, 0x6b, 0x39, 0x07, 0xfb, 0xed, 0xd5, 0x9a, 0xde, 0x9e, 0xfc, 0x1a, 0xa4,
0x78, 0xc7, 0x08, 0x1d, 0x40, 0x66, 0x36, 0x91, 0x52, 0x28, 0x0f, 0x7b, 0xad, 0xf1, 0xc5, 0x48,
0x4a, 0xa3, 0x1c, 0x64, 0xc7, 0x9d, 0x8e, 0x94, 0x39, 0xf9, 0x02, 0x60, 0xd3, 0x21, 0x62, 0xf1,
0x82, 0xfb, 0x4a, 0x7f, 0xd4, 0x15, 0xcd, 0x8f, 0x4e, 0x7d, 0x30, 0x60, 0x03, 0xde, 0xfc, 0x68,
0x8c, 0xa7, 0x3d, 0x29, 0x73, 0xf2, 0xbf, 0x69, 0xc8, 0x79, 0x6d, 0x09, 0x54, 0x80, 0xfd, 0xd1,
0x6c, 0x38, 0xff, 0x52, 0x4a, 0xf9, 0xe4, 0x99, 0x94, 0xf6, 0xc9, 0xaf, 0xa4, 0x8c, 0x4f, 0x9e,
0x4b, 0x59, 0x9f, 0xfc, 0x5a, 0xda, 0xf3, 0xc9, 0x37, 0xd2, 0xbe, 0x4f, 0x7e, 0x23, 0x1d, 0xf8,
0xe4, 0xb7, 0x52, 0xce, 0x27, 0x7f, 0x23, 0xe5, 0xd9, 0x8e, 0xf8, 0x12, 0xaf, 0xa5, 0x42, 0x40,
0x7f, 0x29, 0x41, 0x40, 0x9f, 0x49, 0xc5, 0x80, 0xfe, 0x4a, 0x2a, 0x05, 0xf4, 0xb9, 0x54, 0x0e,
0xe8, 0xaf, 0xa5, 0x4a, 0x40, 0xbf, 0x91, 0xaa, 0x01, 0xfd, 0x8d, 0x24, 0x05, 0xf4, 0xb7, 0xd2,
0x61, 0x40, 0xff, 0x46, 0x42, 0x3e, 0x7d, 0xf6, 0x5a, 0x7a, 0x70, 0xf2, 0x6b, 0x28, 0x85, 0x5b,
0x2b, 0xcc, 0x78, 0x83, 0xf1, 0x85, 0xb0, 0x67, 0xaf, 0xdf, 0xed, 0x49, 0x69, 0x26, 0x3e, 0x1d,
0x77, 0xbb, 0x83, 0xb6, 0x94, 0x39, 0x69, 0x41, 0x35, 0xd6, 0x30, 0x60, 0xb6, 0x9c, 0x8d, 0xde,
0x8d, 0x98, 0xed, 0x53, 0xec, 0x34, 0xea, 0x13, 0x71, 0x06, 0xca, 0xb4, 0x2e, 0x65, 0xd0, 0x03,
0xa8, 0x2a, 0xd3, 0xfa, 0xbc, 0x53, 0xef, 0x0f, 0xc6, 0x3f, 0xb4, 0xf1, 0xbc, 0x3e, 0x91, 0xb2,
0x27, 0x2d, 0x28, 0x47, 0xde, 0xcd, 0xe8, 0x11, 0x1c, 0x32, 0xa9, 0xd1, 0x78, 0x3a, 0x6f, 0x8e,
0x47, 0xa3, 0x76, 0x73, 0xda, 0x6e, 0x09, 0xc3, 0xd7, 0x27, 0xf3, 0x19, 0x03, 0x3c, 0x84, 0x32,
0x93, 0xd8, 0xcc, 0x66, 0x4e, 0x3e, 0x17, 0xdd, 0x13, 0xbf, 0xfd, 0x80, 0x4a, 0x90, 0xbf, 0x98,
0xd4, 0xcf, 0xe6, 0x13, 0xe5, 0x9d, 0xd8, 0xff, 0x78, 0xd2, 0x1e, 0x49, 0xe9, 0xb3, 0xff, 0x3e,
0x82, 0x83, 0xc9, 0xf9, 0xc5, 0x68, 0xf2, 0x25, 0x1a, 0x42, 0xad, 0x4b, 0xa8, 0x7f, 0xbf, 0x45,
0xae, 0x49, 0x84, 0xa2, 0xf7, 0x0a, 0x73, 0xb8, 0xe3, 0xa7, 0x3b, 0xae, 0x72, 0x39, 0x85, 0x7a,
0xf0, 0x40, 0x60, 0xfd, 0xd5, 0x48, 0x1d, 0x38, 0xec, 0x12, 0x1a, 0x2b, 0x38, 0x7f, 0x06, 0xce,
0x18, 0x0e, 0x95, 0x3b, 0x38, 0xbb, 0x74, 0xee, 0x03, 0xfc, 0x3d, 0x54, 0xba, 0x84, 0x86, 0x4b,
0xe7, 0xa4, 0x5d, 0xd5, 0x22, 0xbc, 0x90, 0xb4, 0x40, 0x50, 0xa2, 0x08, 0x5b, 0xa5, 0x8f, 0x13,
0xb0, 0xe5, 0x14, 0x6a, 0x41, 0x69, 0xc8, 0x8a, 0xf2, 0xd9, 0x50, 0xe1, 0xb7, 0xc7, 0x3d, 0x05,
0xd6, 0x16, 0x94, 0x39, 0x7c, 0x22, 0x0e, 0x6b, 0x7b, 0xf1, 0xf1, 0x91, 0x85, 0xcc, 0x96, 0x05,
0x2c, 0xf8, 0x65, 0x97, 0xd0, 0xfa, 0x72, 0x79, 0x7f, 0xfd, 0x94, 0x64, 0xc3, 0xd3, 0x68, 0xf2,
0xbf, 0x0f, 0x43, 0x4e, 0xa1, 0x25, 0x7c, 0x16, 0xf2, 0xe6, 0xed, 0xab, 0x45, 0x3b, 0x56, 0x91,
0x86, 0xce, 0xf1, 0x47, 0x7e, 0xb2, 0x9c, 0x42, 0x43, 0xfe, 0xbe, 0xc4, 0xae, 0xe9, 0xdd, 0x9f,
0xcf, 0x93, 0x5f, 0x6c, 0xde, 0xb3, 0xf6, 0xf8, 0xd9, 0xb6, 0x69, 0xf6, 0x24, 0xe3, 0x70, 0xd5,
0x30, 0x1c, 0x7b, 0xb1, 0xde, 0x83, 0xb8, 0xfd, 0x89, 0x28, 0xa7, 0x10, 0x86, 0x47, 0xbd, 0x7e,
0xab, 0x4b, 0xe8, 0xe6, 0xdd, 0x28, 0x5e, 0x99, 0xdb, 0xb5, 0xee, 0xdd, 0x62, 0x1b, 0x50, 0xaf,
0xdf, 0x6a, 0xaa, 0xa6, 0x46, 0x96, 0x9b, 0x5d, 0xee, 0x00, 0x4c, 0xf6, 0x8b, 0x11, 0x3c, 0x16,
0x5b, 0xf3, 0x5e, 0xd5, 0x81, 0x7c, 0xb2, 0x1f, 0x3c, 0xdf, 0x8a, 0xcf, 0x9e, 0xec, 0x72, 0x0a,
0x35, 0xe0, 0x28, 0xd8, 0x56, 0x7d, 0xb9, 0xbc, 0x07, 0x2e, 0x79, 0x4f, 0x7f, 0xf0, 0xcd, 0x15,
0x7b, 0xe9, 0xef, 0xfa, 0xba, 0x5f, 0xc4, 0xa7, 0x12, 0xbb, 0x04, 0x7c, 0x83, 0xc5, 0x8e, 0x12,
0xb4, 0x81, 0x62, 0xc7, 0x1a, 0x6f, 0x0f, 0x6d, 0xd9, 0xe0, 0x3b, 0x80, 0x8e, 0xe2, 0x37, 0x9f,
0x50, 0xf4, 0xa4, 0x62, 0x4d, 0xae, 0x98, 0xc5, 0xe2, 0x1d, 0x2b, 0x7e, 0x02, 0xe5, 0x8e, 0xd2,
0x25, 0xd4, 0xef, 0xfd, 0xc4, 0xf0, 0x62, 0x9d, 0xa3, 0x18, 0x5e, 0xbc, 0x61, 0x24, 0xa7, 0xd0,
0x1f, 0xe1, 0x51, 0x47, 0x69, 0xda, 0x44, 0xa5, 0x24, 0xd2, 0xa9, 0x43, 0xb1, 0xff, 0x1d, 0x24,
0xf4, 0x09, 0x8f, 0xe5, 0x5d, 0x22, 0xc1, 0x0a, 0xbf, 0x87, 0x22, 0xef, 0x3d, 0x0e, 0x78, 0x59,
0x1d, 0x3b, 0x95, 0x70, 0x83, 0x35, 0x6e, 0x3e, 0x36, 0x25, 0xa7, 0x5e, 0xa7, 0x51, 0x17, 0x8a,
0x6d, 0xed, 0x3a, 0xe8, 0x86, 0xed, 0xca, 0x01, 0x3b, 0xe6, 0xe4, 0x14, 0xea, 0x03, 0x12, 0x29,
0x26, 0xf2, 0x53, 0xc5, 0xf6, 0xe6, 0xf4, 0xf1, 0x51, 0x72, 0x83, 0x5c, 0x4e, 0xa1, 0xdf, 0x42,
0xa9, 0x4b, 0xe8, 0xa6, 0xb1, 0x9e, 0xe4, 0xaf, 0xdb, 0xb5, 0x3b, 0x70, 0x24, 0xcc, 0x11, 0x30,
0x9b, 0xd7, 0xa2, 0x28, 0xff, 0x69, 0x38, 0x18, 0x0e, 0x15, 0x6a, 0xd9, 0xe4, 0xc2, 0xb8, 0xda,
0x7c, 0xcf, 0x2f, 0x63, 0xe2, 0xdb, 0x7e, 0x0f, 0xda, 0xe2, 0xae, 0x13, 0x78, 0xc4, 0x72, 0x0f,
0x83, 0xd5, 0x23, 0xb8, 0xbb, 0xec, 0xbe, 0xdd, 0x86, 0x1c, 0xb1, 0xe6, 0xfd, 0xde, 0xf7, 0xd3,
0x40, 0xb7, 0x7f, 0xf7, 0x10, 0x9e, 0x70, 0x2c, 0xff, 0xc2, 0xf8, 0x68, 0xc8, 0xe4, 0x4f, 0x1e,
0x8b, 0xe3, 0x48, 0xd8, 0x5e, 0xd2, 0x71, 0x7c, 0xb2, 0x1d, 0x5f, 0xfc, 0x70, 0x90, 0x42, 0x53,
0x78, 0xba, 0x01, 0x8c, 0xff, 0x85, 0xeb, 0x67, 0xa3, 0x0e, 0xe1, 0x88, 0x23, 0xde, 0x05, 0x7c,
0xbe, 0xfd, 0xcf, 0x5f, 0x0a, 0xd9, 0x96, 0x97, 0x86, 0x70, 0xd4, 0x25, 0x34, 0xfa, 0xd7, 0xb0,
0xed, 0xce, 0xbc, 0x7b, 0x09, 0x5e, 0x94, 0x3c, 0x17, 0xc7, 0x11, 0x9f, 0xc3, 0x64, 0xbd, 0x64,
0xaf, 0xd9, 0x7b, 0x36, 0x79, 0xef, 0x02, 0x7f, 0x80, 0x27, 0xc9, 0x0b, 0xd4, 0x75, 0xfd, 0xaf,
0x05, 0xbf, 0x3c, 0xe0, 0x7f, 0xbf, 0xfb, 0xea, 0x2f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x95, 0x67,
0xb2, 0x29, 0x8c, 0x27, 0x00, 0x00,
}

View File

@ -51,7 +51,7 @@ service P4WNP1 {
// TriggerActions
rpc ListStoredTriggerActionSets(Empty) returns (StringMessageArray) {}
rpc StoreTriggerActionSets(TriggerActionSetRequestStorage) returns (Empty) {}
rpc StoreTriggerActionSets(TriggerActionSet) returns (Empty) {}
rpc GetTriggerActionsState(Empty) returns (TriggerActionSet) {}
rpc DeployTriggerActionSetReplace(TriggerActionSet) returns (TriggerActionSet) {} // Adds a set of additional TriggerActions, returns a set of all Triggeractions registered afterwards
rpc DeployTriggerActionSetAdd(TriggerActionSet) returns (TriggerActionSet) {} // Replaces registered TriggerActions with given set, returns a set ONLY OF ADDED TriggerActions (with assigned IDs)
@ -60,12 +60,9 @@ service P4WNP1 {
/* Triggers, Actions and resulting TriggerActions */
message TriggerActionSet {
repeated TriggerAction TriggerActions = 1;
string Name = 2;
}
message TriggerActionSetRequestStorage {
string TemplateName = 1;
TriggerActionSet set = 2;
}
message TriggerAction {

View File

@ -39,9 +39,9 @@ type server struct {
listenAddrWeb string
}
func (s *server) StoreTriggerActionSets(ctx context.Context, sr *pb.TriggerActionSetRequestStorage) (e *pb.Empty, err error) {
func (s *server) StoreTriggerActionSets(ctx context.Context, set *pb.TriggerActionSet) (e *pb.Empty, err error) {
e = &pb.Empty{}
err = s.rootSvc.SubSysDataStore.Put(cSTORE_PREFIX_TRIGGER_ACTION_SET+ sr.TemplateName, sr.Set, true)
err = s.rootSvc.SubSysDataStore.Put(cSTORE_PREFIX_TRIGGER_ACTION_SET+ set.Name, set, true)
return
}

View File

@ -146,15 +146,26 @@ func InitComponentsTriggerActions() {
hvue.DataFunc(func(vm *hvue.VM) interface{} {
data := struct {
*js.Object
TriggerAction *jsTriggerAction `js:"TriggerAction"`
ShowLoadModal bool `js:"showLoadModal"`
TemplateName string `js:"templateName"`
}{Object: O()}
data.TriggerAction = NewTriggerAction()
data.ShowLoadModal = false
data.TemplateName = ""
return &data
}),
hvue.Method("addTA",
func(vm *hvue.VM) {
vm.Get("$store").Call("dispatch", VUEX_ACTION_ADD_NEW_TRIGGER_ACTION)
}),
hvue.Method("storeTAS",
func(vm *hvue.VM) {
tas := vm.Get("$store").Get("state").Get("triggerActionList")
vm.Get("$store").Call("dispatch", VUEX_ACTION_STORE_TRIGGER_ACTION_SET, tas)
}),
hvue.Method("updateStoredTriggerActionSetsList",
func(vm *hvue.VM) {
vm.Store.Call("dispatch", VUEX_ACTION_UPDATE_STORED_TRIGGER_ACTION_SETS_LIST)
}),
hvue.Mounted(func(vm *hvue.VM) {
vm.Store.Call("dispatch", VUEX_ACTION_UPDATE_TRIGGER_ACTIONS)
}),
@ -683,11 +694,45 @@ const templateAction = `
const templateTriggerActionManager = `
<q-page padding>
<q-modal v-model="showLoadModal">
<q-modal-layout>
<q-toolbar slot="header">
<q-toolbar-title>
Load TriggerAction Set
</q-toolbar-title>
</q-toolbar>
<q-list>
<q-item link tag="label" v-for="tname in this.$store.state.StoredTriggerActionSetsList" :key="tname">
<q-item-side>
<q-radio v-model="templateName" :val="tname"/>
</q-item-side>
<q-item-main>
<q-item-tile label>{{ tname }}</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile>
<q-btn color="secondary" v-close-overlay label="close" />
<q-btn color="primary" label="load" />
<q-btn color="primary" label="deploy" />
</q-item-tile>
</q-item-main>
</q-item>
</q-list>
</q-modal-layout>
</q-modal>
<div class="row gutter-sm">
<div class="col-12">
<q-card>
<q-card-actions>
<q-btn label="add" @click="addTA" icon="event" />
<q-btn label="store" @click="storeTAS" icon="event" />
<q-btn label="load" @click="updateStoredTriggerActionSetsList(); showLoadModal=true" icon="event" />
</q-card-actions>
</q-card>
</div>

View File

@ -943,43 +943,3 @@ func (data *jsEventReceiver) HandleEvent(ev *pb.Event) {
}
/* TriggerActions */
type jsTriggerActionList struct {
*js.Object
TriggerActions *js.Object `js:"TriggerActions"`
}
func NewTriggerActionList() *jsTriggerActionList {
tal := &jsTriggerActionList{Object: O()}
tal.TriggerActions = O()
return tal
}
func (tal *jsTriggerActionList) UpdateEntry(ta *jsTriggerAction) {
key := strconv.Itoa(int(ta.Id))
//Check if job exists, update existing one if already present
var updateTa *jsTriggerAction
if res := tal.TriggerActions.Get(key); res == js.Undefined {
updateTa = &jsTriggerAction{Object: O()}
} else {
updateTa = &jsTriggerAction{Object: res}
}
//Create job object
updateTa.Id = ta.Id
updateTa.IsActive = ta.IsActive
updateTa.Immutable = ta.Immutable
updateTa.OneShot = ta.OneShot
updateTa.ActionType = ta.ActionType
updateTa.TriggerType = ta.TriggerType
updateTa.TriggerData = ta.TriggerData
updateTa.ActionData = ta.ActionData
hvue.Set(tal.TriggerActions, key, updateTa)
}
func (tal *jsTriggerActionList) DeleteEntry(id uint32) {
tal.TriggerActions.Delete(strconv.Itoa(int(id))) //JS version
//delete(jl.Jobs, strconv.Itoa(int(id)))
}

View File

@ -1,8 +1,12 @@
// +build js
package main
import (
"github.com/gopherjs/gopherjs/js"
pb "github.com/mame82/P4wnP1_go/proto/gopherjs"
"github.com/mame82/hvue"
"strconv"
)
type triggerType int
@ -617,3 +621,65 @@ var availableTemplateTypes = []TemplateType{
TemplateTypeBluetooth,
TemplateTypeTriggerActions,
}
/* TriggerActions */
type jsTriggerActionSet struct {
*js.Object
Name string `js:"Name"`
TriggerActions *js.Object `js:"TriggerActions"`
}
func NewTriggerActionList() *jsTriggerActionSet {
tal := &jsTriggerActionSet{Object: O()}
tal.TriggerActions = O()
tal.Name = "default_ta_set"
return tal
}
func (tal *jsTriggerActionSet) UpdateEntry(ta *jsTriggerAction) {
key := strconv.Itoa(int(ta.Id))
//Check if job exists, update existing one if already present
var updateTa *jsTriggerAction
if res := tal.TriggerActions.Get(key); res == js.Undefined {
updateTa = &jsTriggerAction{Object: O()}
} else {
updateTa = &jsTriggerAction{Object: res}
}
//Create job object
updateTa.Id = ta.Id
updateTa.IsActive = ta.IsActive
updateTa.Immutable = ta.Immutable
updateTa.OneShot = ta.OneShot
updateTa.ActionType = ta.ActionType
updateTa.TriggerType = ta.TriggerType
updateTa.TriggerData = ta.TriggerData
updateTa.ActionData = ta.ActionData
hvue.Set(tal.TriggerActions, key, updateTa)
}
func (tal *jsTriggerActionSet) DeleteEntry(id uint32) {
tal.TriggerActions.Delete(strconv.Itoa(int(id))) //JS version
//delete(jl.Jobs, strconv.Itoa(int(id)))
}
func (src jsTriggerActionSet) toGo() (target *pb.TriggerActionSet) {
js_ta_array := js.Global.Get("Object").Call("values", src.TriggerActions)
count := js_ta_array.Length()
// println("tal len:", count)
// iterate over array
target = &pb.TriggerActionSet{
Name: src.Name,
}
target.TriggerActions = make([]*pb.TriggerAction, count)
for i:=0;i<count;i++ {
jsTa := &jsTriggerAction{Object: js_ta_array.Index(i)}
target.TriggerActions[i] = jsTa.toGo()
}
//println("Go TAS: ", target )
return
}

View File

@ -16,14 +16,18 @@ const (
maxLogEntries = 500
VUEX_ACTION_UPDATE_RUNNING_HID_JOBS = "updateRunningHidJobs"
VUEX_ACTION_UPDATE_TRIGGER_ACTIONS = "updateTriggerActions"
VUEX_ACTION_ADD_NEW_TRIGGER_ACTION = "addTriggerAction"
VUEX_ACTION_DEPLOY_CURRENT_GADGET_SETTINGS = "deployCurrentGadgetSettings"
VUEX_ACTION_UPDATE_GADGET_SETTINGS_FROM_DEPLOYED = "updateCurrentGadgetSettingsFromDeployed"
VUEX_ACTION_DEPLOY_ETHERNET_INTERFACE_SETTINGS = "deployEthernetInterfaceSettings"
VUEX_ACTION_UPDATE_WIFI_STATE = "updateCurrentWifiSettingsFromDeployed"
VUEX_ACTION_DEPLOY_WIFI_SETTINGS = "deployWifiSettings"
VUEX_ACTION_UPDATE_TRIGGER_ACTIONS = "updateTriggerActions"
VUEX_ACTION_ADD_NEW_TRIGGER_ACTION = "addTriggerAction"
VUEX_ACTION_STORE_TRIGGER_ACTION_SET = "storeTriggerActionSet"
VUEX_ACTION_UPDATE_STORED_TRIGGER_ACTION_SETS_LIST = "updateStoredTriggerActionSetsList"
VUEX_ACTION_UPDATE_STORED_WIFI_SETTINGS_LIST = "updateStoredWifiSettingsList"
VUEX_ACTION_STORE_WIFI_SETTINGS = "storeWifiSettings"
VUEX_ACTION_LOAD_WIFI_SETTINGS = "storeWifiSettings"
@ -33,6 +37,8 @@ const (
VUEX_MUTATION_SET_CURRENT_HID_SCRIPT_SOURCE_TO = "setCurrentHIDScriptSource"
VUEX_MUTATION_SET_STORED_WIFI_SETTINGS_LIST = "setStoredWifiSettingsList"
VUEX_MUTATION_SET_STORED_TRIGGER_ACTIONS_SETS_LIST = "setStoredTriggerActionSetsList"
initHIDScript = `layout('us'); // US keyboard layout
typingSpeed(100,150) // Wait 100ms between key strokes + an additional random value between 0ms and 150ms (natural)
@ -68,7 +74,7 @@ type GlobalState struct {
CurrentlyDeployingWifiSettings bool `js:"deployingWifiSettings"`
EventReceiver *jsEventReceiver `js:"eventReceiver"`
HidJobList *jsHidJobStateList `js:"hidJobList"`
TriggerActionList *jsTriggerActionList `js:"triggerActionList"`
TriggerActionList *jsTriggerActionSet `js:"triggerActionList"`
IsModalEnabled bool `js:"isModalEnabled"`
IsConnected bool `js:"isConnected"`
FailedConnectionAttempts int `js:"failedConnectionAttempts"`
@ -77,6 +83,7 @@ type GlobalState struct {
WiFiState *jsWiFiState `js:"wifiState"`
StoredWifiSettingsList []string `js:"StoredWifiSettingsList"`
StoredTriggerActionSetsList []string `js:"StoredTriggerActionSetsList"`
}
func createGlobalStateStruct() GlobalState {
@ -93,6 +100,7 @@ func createGlobalStateStruct() GlobalState {
state.FailedConnectionAttempts = 0
state.StoredWifiSettingsList = []string{}
state.StoredTriggerActionSetsList = []string{}
//Retrieve Interface settings
// ToDo: Replace panics by default values
ifSettings, err := RpcClient.GetAllDeployedEthernetInterfaceSettings(time.Second * 5)
@ -215,6 +223,26 @@ func actionUpdateRunningHidJobs(store *mvuex.Store, context *mvuex.ActionContext
return
}
func actionUpdateStoredTriggerActionSetsList(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState) {
go func() {
println("Trying to fetch wsList")
//fetch deployed gadget settings
tasList, err := RpcClient.ListStoredTriggerActionSets(time.Second * 10)
if err != nil {
println("Couldn't retrieve WifiSettingsList")
return
}
//commit to current
context.Commit(VUEX_MUTATION_SET_STORED_TRIGGER_ACTIONS_SETS_LIST, tasList)
//context.Commit(VUEX_MUTATION_SET_STORED_WIFI_SETTINGS_LIST, []string{"test1", "test2"})
}()
return
}
func actionUpdateTriggerActions(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState) {
go func() {
tastate,err := RpcClient.GetTriggerActionsState(time.Second * 10)
@ -248,6 +276,24 @@ func actionAddNewTriggerAction(store *mvuex.Store, context *mvuex.ActionContext,
return
}
func actionStoreTriggerActionSet(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState, req *jsTriggerActionSet) {
go func() {
println("Vuex dispatch store TriggerAction list: ", req.Name)
req.toGo()
// convert to Go type
err := RpcClient.StoreTriggerActionSet(time.Second*30, req.toGo())
if err != nil {
QuasarNotifyError("Error storing TriggerActionSet", err.Error(), QUASAR_NOTIFICATION_POSITION_BOTTOM)
return
}
QuasarNotifySuccess("TriggerActionSet stored", "", QUASAR_NOTIFICATION_POSITION_TOP)
}()
}
func actionDeployCurrentGadgetSettings(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState) {
go func() {
@ -321,6 +367,9 @@ func initMVuex() *mvuex.Store {
println("New ws list", wsList)
hvue.Set(state, "StoredWifiSettingsList", wsList)
}),
mvuex.Mutation(VUEX_MUTATION_SET_STORED_TRIGGER_ACTIONS_SETS_LIST, func(store *mvuex.Store, state *GlobalState, tasList []interface{}) {
hvue.Set(state, "StoredTriggerActionSetsList", tasList)
}),
/*
mvuex.Mutation("startLogListening", func (store *mvuex.Store, state *GlobalState) {
state.EventReceiver.StartListening()
@ -339,8 +388,11 @@ func initMVuex() *mvuex.Store {
mvuex.Action(VUEX_ACTION_DEPLOY_WIFI_SETTINGS, actionDeployWifiSettings),
mvuex.Action(VUEX_ACTION_UPDATE_STORED_WIFI_SETTINGS_LIST, actionUpdateStoredWifiSettingsList),
mvuex.Action(VUEX_ACTION_STORE_WIFI_SETTINGS, actionStoreWifiSettings),
mvuex.Action(VUEX_ACTION_UPDATE_TRIGGER_ACTIONS, actionUpdateTriggerActions),
mvuex.Action(VUEX_ACTION_ADD_NEW_TRIGGER_ACTION, actionAddNewTriggerAction),
mvuex.Action(VUEX_ACTION_STORE_TRIGGER_ACTION_SET, actionStoreTriggerActionSet),
mvuex.Action(VUEX_ACTION_UPDATE_STORED_TRIGGER_ACTION_SETS_LIST, actionUpdateStoredTriggerActionSetsList),
mvuex.Getter("triggerActions", func(state *GlobalState) interface{} {
return state.TriggerActionList.TriggerActions

10
web_client/rbuild3.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/bash
# dependencies for the web app
gopherjs build -o ../build/webapp.js #main.go
#scp ../build/webapp* pi@raspberrypi.local:/usr/local/P4wnP1/www/
#scp ../dist/www/index.html pi@raspberrypi.local:/usr/local/P4wnP1/www/
#scp ../dist/www/p4wnp1.css pi@raspberrypi.local:/usr/local/P4wnP1/www
scp ../build/webapp* 172.16.0.1:/usr/local/P4wnP1/www/
scp ../dist/www/index.html 172.16.0.1:/usr/local/P4wnP1/www/
scp ../dist/www/p4wnp1.css 172.16.0.1:/usr/local/P4wnP1/www/

View File

@ -154,7 +154,7 @@ func (rpc *Rpc) StoreTriggerActionSet(timeout time.Duration, set *pb.TriggerActi
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_,err = rpc.Client.StoreTriggerActionSets(ctx, &pb.TriggerActionSetRequestStorage{Set:set})
_,err = rpc.Client.StoreTriggerActionSets(ctx, set)
return err
}