diff --git a/cmd/testwifi/testwifi.go b/cmd/testwifi/testwifi.go deleted file mode 100644 index 21fbcf7..0000000 --- a/cmd/testwifi/testwifi.go +++ /dev/null @@ -1,50 +0,0 @@ -// +build linux,arm - -package main - -import ( - "github.com/mame82/P4wnP1_go/service" - "log" - pb "github.com/mame82/P4wnP1_go/proto" - "fmt" - "time" -) - -func main() { - ap_settings := &pb.WiFiSettings{ - Mode: pb.WiFiSettings_AP, - AuthMode: pb.WiFiSettings_WPA2_PSK, - Disabled: false, - Reg: "US", - ApChannel: 6, - ApHideSsid: false, - BssCfgAP: &pb.BSSCfg{ - SSID: "P4wnP1", - PSK: "MaMe82-P4wnP1", - }, - DisableNexmon: true, - BssCfgClient: nil, //not needed - } - - sta_settings := &pb.WiFiSettings{ - Mode: pb.WiFiSettings_STA, - AuthMode: pb.WiFiSettings_WPA2_PSK, - Disabled: false, - Reg: "DE", - BssCfgClient: &pb.BSSCfg{ - SSID: "WLAN-579086", - PSK: "5824989790864470", - }, - DisableNexmon: true, - BssCfgAP: nil, //not needed - } - - err := service.DeployWifiSettings(ap_settings) - if err != nil { log.Println(err)} - - err = service.DeployWifiSettings(sta_settings) - if err != nil { log.Println(err)} - - fmt.Println("Sleeping 10 seconds") - time.Sleep(time.Second * 10) -} diff --git a/cmd/testwifi2/testwifi2.go b/cmd/testwifi2/testwifi2.go deleted file mode 100644 index c6672e7..0000000 --- a/cmd/testwifi2/testwifi2.go +++ /dev/null @@ -1,719 +0,0 @@ -package main - -import ( - "github.com/mame82/P4wnP1_go/service" - "log" - "fmt" -) - -var iw_scan_out = `BSS 4e:66:41:a0:5b:35(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2437 - beacon interval: 100 TUs - capability: ESS Privacy SpectrumMgmt ShortSlotTime RadioMeasure (0x1511) - signal: -43.01 dBm - last seen: 13740 ms ago - SSID: Android AP8905 - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 6 - TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 20 dBm - Power constraint: 0 dB - TPC report: TX power: 17 dBm - ERP: - Extended supported rates: 6.0 9.0 12.0 48.0 - RSN: * Version: 1 - * Group cipher: CCMP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c) - HT capabilities: - Capabilities: 0x1ad - RX LDPC - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 3839 bytes - No DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 4 usec (0x05) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 6 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 1 - * HT protection: no - * non-GF present: 0 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Extended capabilities: Extended Channel Switching, BSS Transition, 6 - WMM: * Parameter version 1 - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS 5c:dc:96:b4:59:af(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2437 - beacon interval: 100 TUs - capability: ESS Privacy ShortSlotTime RadioMeasure (0x1411) - signal: -38.00 dBm - last seen: 10 ms ago - SSID: WLAN-579086 - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 6 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 22 dBm - ERP: - ERP D4.0: - RSN: * Version: 1 - * Group cipher: CCMP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c) - Extended supported rates: 6.0 9.0 12.0 48.0 - HT capabilities: - Capabilities: 0x19fe - HT20/HT40 - SM Power Save disabled - RX Greenfield - RX HT20 SGI - RX HT40 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 7935 bytes - DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 16 usec (0x07) - HT RX MCS rate indexes supported: 0-15, 32 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 6 - * secondary channel offset: below - * STA channel width: any - * RIFS: 1 - * HT protection: no - * non-GF present: 0 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Overlapping BSS scan params: - * passive dwell: 20 TUs - * active dwell: 10 TUs - * channel width trigger scan interval: 300 s - * scan passive total per channel: 200 TUs - * scan active total per channel: 20 TUs - * BSS width channel transition delay factor: 5 - * OBSS Scan Activity Threshold: 0.25 % - Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6 - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * Response Type: 3 (AP) - * UUID: 7470bfaa-0621-242d-7915-13686f9ded23 - * Manufacturer: ARCADYAN - * Model: DT724 - * Model Number: 1.0 - * Serial Number: 888 - * Primary Device Type: 6-0050f204-1 - * Device name: DT724 - * Config methods: - * RF Bands: 0x3 - * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20 - WMM: * Parameter version 1 - * u-APSD - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS 4e:66:41:a0:5b:35(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2462 - beacon interval: 100 TUs - capability: ESS SpectrumMgmt ShortSlotTime RadioMeasure (0x1501) - signal: -35.00 dBm - last seen: 10 ms ago - SSID: AndroidAP8905 - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 11 - TIM: DTIM Count 0 DTIM Period 2 Bitmap Control 0x0 Bitmap[0] 0x0 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 20 dBm - Power constraint: 0 dB - TPC report: TX power: 17 dBm - ERP: - Extended supported rates: 6.0 9.0 12.0 48.0 - HT capabilities: - Capabilities: 0x1ad - RX LDPC - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 3839 bytes - No DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 4 usec (0x05) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 11 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 1 - * HT protection: no - * non-GF present: 0 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Extended capabilities: Extended Channel Switching, BSS Transition, 6 - WMM: * Parameter version 1 - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS 88:e3:ab:9d:38:f5(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2412 - beacon interval: 100 TUs - capability: ESS Privacy ShortSlotTime RadioMeasure (0x1411) - signal: -84.00 dBm - last seen: 0 ms ago - SSID: WLAN-WGF3FG - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 1 - ERP: Barker_Preamble_Mode - ERP D4.0: Barker_Preamble_Mode - RSN: * Version: 1 - * Group cipher: CCMP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c) - Extended supported rates: 6.0 9.0 12.0 48.0 - HT capabilities: - Capabilities: 0x19ac - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 7935 bytes - DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 1 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 0 - * HT protection: no - * non-GF present: 1 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Overlapping BSS scan params: - * passive dwell: 20 TUs - * active dwell: 10 TUs - * channel width trigger scan interval: 300 s - * scan passive total per channel: 200 TUs - * scan active total per channel: 20 TUs - * BSS width channel transition delay factor: 5 - * OBSS Scan Activity Threshold: 0.25 % - Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6 - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * Response Type: 3 (AP) - * UUID: 13082394-62d2-8063-e9de-c42e3a2d1071 - * Manufacturer: Broadcom - * Model: Broadcom - * Model Number: 123456 - * Serial Number: 1234 - * Primary Device Type: 6-0050f204-1 - * Device name: BroadcomAP - * Config methods: - * RF Bands: 0x3 - * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20 - WMM: * Parameter version 1 - * u-APSD - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS b8:bc:1b:63:33:d9(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2412 - beacon interval: 100 TUs - capability: ESS Privacy ShortSlotTime RadioMeasure (0x1411) - signal: -81.00 dBm - last seen: 0 ms ago - SSID: schmidtderhit - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 1 - ERP: Barker_Preamble_Mode - ERP D4.0: Barker_Preamble_Mode - RSN: * Version: 1 - * Group cipher: CCMP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c) - Extended supported rates: 6.0 9.0 12.0 48.0 - HT capabilities: - Capabilities: 0x19ac - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 7935 bytes - DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 1 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 0 - * HT protection: no - * non-GF present: 1 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Overlapping BSS scan params: - * passive dwell: 20 TUs - * active dwell: 10 TUs - * channel width trigger scan interval: 300 s - * scan passive total per channel: 200 TUs - * scan active total per channel: 20 TUs - * BSS width channel transition delay factor: 5 - * OBSS Scan Activity Threshold: 0.25 % - Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6 - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * Response Type: 3 (AP) - * UUID: 8e998705-3ed2-399e-e43d-0d4c0a412fec - * Manufacturer: Broadcom - * Model: Broadcom - * Model Number: 123456 - * Serial Number: 1234 - * Primary Device Type: 6-0050f204-1 - * Device name: BroadcomAP - * Config methods: - * RF Bands: 0x3 - * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20 - WMM: * Parameter version 1 - * u-APSD - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS 88:e3:ab:9d:38:f6(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2412 - beacon interval: 100 TUs - capability: ESS ShortSlotTime RadioMeasure (0x1401) - signal: -84.00 dBm - last seen: 0 ms ago - SSID: Telekom_FON - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 1 - ERP: Barker_Preamble_Mode - ERP D4.0: Barker_Preamble_Mode - Extended supported rates: 6.0 9.0 12.0 48.0 - HT capabilities: - Capabilities: 0x19ac - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 7935 bytes - DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 1 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 0 - * HT protection: no - * non-GF present: 1 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Overlapping BSS scan params: - * passive dwell: 20 TUs - * active dwell: 10 TUs - * channel width trigger scan interval: 300 s - * scan passive total per channel: 200 TUs - * scan active total per channel: 20 TUs - * BSS width channel transition delay factor: 5 - * OBSS Scan Activity Threshold: 0.25 % - Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6 - WMM: * Parameter version 1 - * u-APSD - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS b8:bc:1b:63:33:da(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2412 - beacon interval: 100 TUs - capability: ESS ShortSlotTime RadioMeasure (0x1401) - signal: -83.00 dBm - last seen: 0 ms ago - SSID: Telekom_FON - Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 - DS Parameter set: channel 1 - ERP: Barker_Preamble_Mode - ERP D4.0: Barker_Preamble_Mode - Extended supported rates: 6.0 9.0 12.0 48.0 - HT capabilities: - Capabilities: 0x19ac - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 7935 bytes - DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 1 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 0 - * HT protection: no - * non-GF present: 1 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Overlapping BSS scan params: - * passive dwell: 20 TUs - * active dwell: 10 TUs - * channel width trigger scan interval: 300 s - * scan passive total per channel: 200 TUs - * scan active total per channel: 20 TUs - * BSS width channel transition delay factor: 5 - * OBSS Scan Activity Threshold: 0.25 % - Extended capabilities: HT Information Exchange Supported, Extended Channel Switching, 6 - WMM: * Parameter version 1 - * u-APSD - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec -BSS 24:65:11:89:1c:28(on wlan0) -- associated - TSF: 0 usec (0d, 00:00:00) - freq: 2462 - beacon interval: 100 TUs - capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431) - signal: -40.00 dBm - last seen: 0 ms ago - SSID: spycki3 - Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0 - DS Parameter set: channel 11 - TIM: DTIM Count 0 DTIM Period 1 Bitmap Control 0x0 Bitmap[0] 0x1 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 20 dBm - ERP: - RSN: * Version: 1 - * Group cipher: TKIP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000) - Extended supported rates: 24.0* 36.0 48.0 54.0 - HT capabilities: - Capabilities: 0x11ce - HT20/HT40 - SM Power Save disabled - RX HT40 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 3839 bytes - DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT RX MCS rate indexes supported: 0-15 - HT TX MCS rate indexes are undefined - HT operation: - * primary channel: 11 - * secondary channel offset: below - * STA channel width: any - * RIFS: 1 - * HT protection: 20 MHz - * non-GF present: 1 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - WPA: * Version: 1 - * Group cipher: TKIP - * Pairwise ciphers: TKIP - * Authentication suites: PSK - WMM: * Parameter version 1 - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * UUID: 0cb4b30f-b5d6-7e18-4ec8-246511891c10 - * RF Bands: 0x3 -BSS c0:25:06:eb:8e:7d(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2437 - beacon interval: 100 TUs - capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431) - signal: -84.00 dBm - last seen: 0 ms ago - SSID: FRITZ!Box Fon WLAN 7390 - Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0 - DS Parameter set: channel 6 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 20 dBm - ERP: - Extended supported rates: 24.0* 36.0 48.0 54.0 - HT capabilities: - Capabilities: 0x18c - HT20 - SM Power Save disabled - TX STBC - RX STBC 1-stream - Max AMSDU length: 3839 bytes - No DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT TX/RX MCS rate indexes supported: 0-15 - HT operation: - * primary channel: 6 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 1 - * HT protection: no - * non-GF present: 0 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Extended capabilities: 6 - WMM: * Parameter version 1 - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec - RSN: * Version: 1 - * Group cipher: TKIP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000) - WPA: * Version: 1 - * Group cipher: TKIP - * Pairwise ciphers: TKIP - * Authentication suites: PSK - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * Response Type: 3 (AP) - * UUID: 76fc7d2e-2e0b-5c3b-7135-c02506eb8e7c - * Manufacturer: AVM - * Model: FBox - * Model Number: 0000 - * Serial Number: 0000 - * Primary Device Type: 6-0050f204-1 - * Device name: FBox - * Config methods: Display, PBC, Keypad - * RF Bands: 0x3 - * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20 -BSS c2:25:06:eb:8e:7d(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2437 - beacon interval: 100 TUs - capability: ESS Privacy ShortPreamble ShortSlotTime (0x0431) - signal: -82.00 dBm - last seen: 0 ms ago - SSID: SDK Gast - Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0 - DS Parameter set: channel 6 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 20 dBm - ERP: - Extended supported rates: 24.0* 36.0 48.0 54.0 - HT capabilities: - Capabilities: 0x18c - HT20 - SM Power Save disabled - TX STBC - RX STBC 1-stream - Max AMSDU length: 3839 bytes - No DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT TX/RX MCS rate indexes supported: 0-15 - HT operation: - * primary channel: 6 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 1 - * HT protection: no - * non-GF present: 0 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Extended capabilities: 6 - WMM: * Parameter version 1 - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec - RSN: * Version: 1 - * Group cipher: TKIP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000) - WPA: * Version: 1 - * Group cipher: TKIP - * Pairwise ciphers: TKIP - * Authentication suites: PSK - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * Response Type: 3 (AP) - * UUID: dfb77a7a-25b2-93f6-7ba8-01e7cd0bdb51 - * Manufacturer: AVM - * Model: FBox - * Model Number: 0000 - * Serial Number: 0000 - * Primary Device Type: 6-0050f204-1 - * Device name: FBox - * Config methods: Display, PBC, Keypad - * RF Bands: 0x3 - * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20 -BSS e0:28:6d:dd:b1:fc(on wlan0) - TSF: 0 usec (0d, 00:00:00) - freq: 2462 - beacon interval: 100 TUs - capability: ESS Privacy ShortPreamble (0x0031) - signal: -75.00 dBm - last seen: 0 ms ago - SSID: FRITZ!Box 7362 SL - Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0* 9.0 12.0* 18.0 - DS Parameter set: channel 11 - Country: DE Environment: Indoor/Outdoor - Channels [1 - 13] @ 20 dBm - ERP: - Extended supported rates: 24.0* 36.0 48.0 54.0 - HT capabilities: - Capabilities: 0x1ad - RX LDPC - HT20 - SM Power Save disabled - RX HT20 SGI - TX STBC - RX STBC 1-stream - Max AMSDU length: 3839 bytes - No DSSS/CCK HT40 - Maximum RX AMPDU length 65535 bytes (exponent: 0x003) - Minimum RX AMPDU time spacing: 8 usec (0x06) - HT TX/RX MCS rate indexes supported: 0-23 - HT operation: - * primary channel: 11 - * secondary channel offset: no secondary - * STA channel width: 20 MHz - * RIFS: 1 - * HT protection: no - * non-GF present: 1 - * OBSS non-GF present: 0 - * dual beacon: 0 - * dual CTS protection: 0 - * STBC beacon: 0 - * L-SIG TXOP Prot: 0 - * PCO active: 0 - * PCO phase: 0 - Extended capabilities: 6 - WMM: * Parameter version 1 - * BE: CW 15-1023, AIFSN 3 - * BK: CW 15-1023, AIFSN 7 - * VI: CW 7-15, AIFSN 2, TXOP 3008 usec - * VO: CW 3-7, AIFSN 2, TXOP 1504 usec - RSN: * Version: 1 - * Group cipher: CCMP - * Pairwise ciphers: CCMP - * Authentication suites: PSK - * Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000) - WPS: * Version: 1.0 - * Wi-Fi Protected Setup State: 2 (Configured) - * Response Type: 3 (AP) - * UUID: 80ffd276-a392-0a84-6421-e0286dddb1fc - * Manufacturer: AVM - * Model: FBox - * Model Number: 0000 - * Serial Number: 0000 - * Primary Device Type: 6-0050f204-1 - * Device name: FBox - * Config methods: Display, PBC, Keypad - * RF Bands: 0x1 - * Unknown TLV (0x1049, 6 bytes): 00 37 2a 00 01 20` - - func main() { - //res, err := service.ParseIwScan(iw_scan_out) - res, err := service.WifiScan("wlan0") - if err != nil { - log.Fatal(err) - } - fmt.Printf("Parsed scan result:\n%v\n", res) - err = service.WifiCreateWpaSupplicantConfigFile("spycki1 2 3", "a b c c b b", "/tmp/wpa_supplicant.conf") - if err != nil { log.Fatal(err)} - - } \ No newline at end of file diff --git a/proto/gopherjs/grpc.pb.gopherjs.go b/proto/gopherjs/grpc.pb.gopherjs.go index f9aafef..c1a6d94 100644 --- a/proto/gopherjs/grpc.pb.gopherjs.go +++ b/proto/gopherjs/grpc.pb.gopherjs.go @@ -177,110 +177,6 @@ func (x GPIOInEdge) String() string { return GPIOInEdge_name[int(x)] } -type GPIONum int - -const ( - GPIONum_NUM_1 GPIONum = 0 - GPIONum_NUM_2 GPIONum = 1 - GPIONum_NUM_3 GPIONum = 2 - GPIONum_NUM_4 GPIONum = 3 - GPIONum_NUM_5 GPIONum = 4 - GPIONum_NUM_6 GPIONum = 5 - GPIONum_NUM_7 GPIONum = 6 - GPIONum_NUM_8 GPIONum = 7 - GPIONum_NUM_9 GPIONum = 8 - GPIONum_NUM_10 GPIONum = 9 - GPIONum_NUM_11 GPIONum = 10 - GPIONum_NUM_12 GPIONum = 11 - GPIONum_NUM_13 GPIONum = 12 - GPIONum_NUM_14 GPIONum = 13 - GPIONum_NUM_15 GPIONum = 14 - GPIONum_NUM_16 GPIONum = 15 - GPIONum_NUM_17 GPIONum = 16 - GPIONum_NUM_18 GPIONum = 17 - GPIONum_NUM_19 GPIONum = 18 - GPIONum_NUM_20 GPIONum = 19 - GPIONum_NUM_21 GPIONum = 20 - GPIONum_NUM_22 GPIONum = 21 - GPIONum_NUM_23 GPIONum = 22 - GPIONum_NUM_24 GPIONum = 23 - GPIONum_NUM_25 GPIONum = 24 - GPIONum_NUM_26 GPIONum = 25 - GPIONum_NUM_27 GPIONum = 26 - GPIONum_NUM_28 GPIONum = 27 - GPIONum_NUM_29 GPIONum = 28 - GPIONum_NUM_30 GPIONum = 29 -) - -var GPIONum_name = map[int]string{ - 0: "NUM_1", - 1: "NUM_2", - 2: "NUM_3", - 3: "NUM_4", - 4: "NUM_5", - 5: "NUM_6", - 6: "NUM_7", - 7: "NUM_8", - 8: "NUM_9", - 9: "NUM_10", - 10: "NUM_11", - 11: "NUM_12", - 12: "NUM_13", - 13: "NUM_14", - 14: "NUM_15", - 15: "NUM_16", - 16: "NUM_17", - 17: "NUM_18", - 18: "NUM_19", - 19: "NUM_20", - 20: "NUM_21", - 21: "NUM_22", - 22: "NUM_23", - 23: "NUM_24", - 24: "NUM_25", - 25: "NUM_26", - 26: "NUM_27", - 27: "NUM_28", - 28: "NUM_29", - 29: "NUM_30", -} -var GPIONum_value = map[string]int{ - "NUM_1": 0, - "NUM_2": 1, - "NUM_3": 2, - "NUM_4": 3, - "NUM_5": 4, - "NUM_6": 5, - "NUM_7": 6, - "NUM_8": 7, - "NUM_9": 8, - "NUM_10": 9, - "NUM_11": 10, - "NUM_12": 11, - "NUM_13": 12, - "NUM_14": 13, - "NUM_15": 14, - "NUM_16": 15, - "NUM_17": 16, - "NUM_18": 17, - "NUM_19": 18, - "NUM_20": 19, - "NUM_21": 20, - "NUM_22": 21, - "NUM_23": 22, - "NUM_24": 23, - "NUM_25": 24, - "NUM_26": 25, - "NUM_27": 26, - "NUM_28": 27, - "NUM_29": 28, - "NUM_30": 29, -} - -func (x GPIONum) String() string { - return GPIONum_name[int(x)] -} - type GPIOOutValue int const ( @@ -2719,17 +2615,17 @@ func (m *TriggerGroupReceiveMulti) Unmarshal(rawBytes []byte) (*TriggerGroupRece } type TriggerGPIOIn struct { - GpioNum GPIONum + GpioName string PullUpDown GPIOInPullUpDown GpioInEdge GPIOInEdge } -// GetGpioNum gets the GpioNum of the TriggerGPIOIn. -func (m *TriggerGPIOIn) GetGpioNum() (x GPIONum) { +// GetGpioName gets the GpioName of the TriggerGPIOIn. +func (m *TriggerGPIOIn) GetGpioName() (x string) { if m == nil { return x } - return m.GpioNum + return m.GpioName } // GetPullUpDown gets the PullUpDown of the TriggerGPIOIn. @@ -2754,8 +2650,8 @@ func (m *TriggerGPIOIn) MarshalToWriter(writer jspb.Writer) { return } - if int(m.GpioNum) != 0 { - writer.WriteEnum(1, int(m.GpioNum)) + if len(m.GpioName) > 0 { + writer.WriteString(1, m.GpioName) } if int(m.PullUpDown) != 0 { @@ -2785,7 +2681,7 @@ func (m *TriggerGPIOIn) UnmarshalFromReader(reader jspb.Reader) *TriggerGPIOIn { switch reader.GetFieldNumber() { case 1: - m.GpioNum = GPIONum(reader.ReadEnum()) + m.GpioName = reader.ReadString() case 2: m.PullUpDown = GPIOInPullUpDown(reader.ReadEnum()) case 3: @@ -3064,16 +2960,16 @@ func (m *ActionLog) Unmarshal(rawBytes []byte) (*ActionLog, error) { } type ActionGPIOOut struct { - GpioNum GPIONum - Value GPIOOutValue + GpioName string + Value GPIOOutValue } -// GetGpioNum gets the GpioNum of the ActionGPIOOut. -func (m *ActionGPIOOut) GetGpioNum() (x GPIONum) { +// GetGpioName gets the GpioName of the ActionGPIOOut. +func (m *ActionGPIOOut) GetGpioName() (x string) { if m == nil { return x } - return m.GpioNum + return m.GpioName } // GetValue gets the Value of the ActionGPIOOut. @@ -3090,8 +2986,8 @@ func (m *ActionGPIOOut) MarshalToWriter(writer jspb.Writer) { return } - if int(m.GpioNum) != 0 { - writer.WriteEnum(1, int(m.GpioNum)) + if len(m.GpioName) > 0 { + writer.WriteString(1, m.GpioName) } if int(m.Value) != 0 { @@ -3117,7 +3013,7 @@ func (m *ActionGPIOOut) UnmarshalFromReader(reader jspb.Reader) *ActionGPIOOut { switch reader.GetFieldNumber() { case 1: - m.GpioNum = GPIONum(reader.ReadEnum()) + m.GpioName = reader.ReadString() case 2: m.Value = GPIOOutValue(reader.ReadEnum()) default: @@ -6642,6 +6538,8 @@ type P4WNP1Client interface { ListStoredHIDScripts(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) ListStoredBashScripts(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) ListStoredDBBackups(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) + // GPIO + GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) } type p4WNP1Client struct { @@ -7370,3 +7268,12 @@ func (c *p4WNP1Client) ListStoredDBBackups(ctx context.Context, in *Empty, opts return new(StringMessageArray).Unmarshal(resp) } + +func (c *p4WNP1Client) GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) { + resp, err := c.client.RPCCall(ctx, "GetAvailableGpios", in.Marshal(), opts...) + if err != nil { + return nil, err + } + + return new(StringMessageArray).Unmarshal(resp) +} diff --git a/proto/grpc.pb.go b/proto/grpc.pb.go index d99f0fd..f550c75 100644 --- a/proto/grpc.pb.go +++ b/proto/grpc.pb.go @@ -189,111 +189,6 @@ func (x GPIOInEdge) String() string { } func (GPIOInEdge) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } -type GPIONum int32 - -const ( - GPIONum_NUM_1 GPIONum = 0 - GPIONum_NUM_2 GPIONum = 1 - GPIONum_NUM_3 GPIONum = 2 - GPIONum_NUM_4 GPIONum = 3 - GPIONum_NUM_5 GPIONum = 4 - GPIONum_NUM_6 GPIONum = 5 - GPIONum_NUM_7 GPIONum = 6 - GPIONum_NUM_8 GPIONum = 7 - GPIONum_NUM_9 GPIONum = 8 - GPIONum_NUM_10 GPIONum = 9 - GPIONum_NUM_11 GPIONum = 10 - GPIONum_NUM_12 GPIONum = 11 - GPIONum_NUM_13 GPIONum = 12 - GPIONum_NUM_14 GPIONum = 13 - GPIONum_NUM_15 GPIONum = 14 - GPIONum_NUM_16 GPIONum = 15 - GPIONum_NUM_17 GPIONum = 16 - GPIONum_NUM_18 GPIONum = 17 - GPIONum_NUM_19 GPIONum = 18 - GPIONum_NUM_20 GPIONum = 19 - GPIONum_NUM_21 GPIONum = 20 - GPIONum_NUM_22 GPIONum = 21 - GPIONum_NUM_23 GPIONum = 22 - GPIONum_NUM_24 GPIONum = 23 - GPIONum_NUM_25 GPIONum = 24 - GPIONum_NUM_26 GPIONum = 25 - GPIONum_NUM_27 GPIONum = 26 - GPIONum_NUM_28 GPIONum = 27 - GPIONum_NUM_29 GPIONum = 28 - GPIONum_NUM_30 GPIONum = 29 -) - -var GPIONum_name = map[int32]string{ - 0: "NUM_1", - 1: "NUM_2", - 2: "NUM_3", - 3: "NUM_4", - 4: "NUM_5", - 5: "NUM_6", - 6: "NUM_7", - 7: "NUM_8", - 8: "NUM_9", - 9: "NUM_10", - 10: "NUM_11", - 11: "NUM_12", - 12: "NUM_13", - 13: "NUM_14", - 14: "NUM_15", - 15: "NUM_16", - 16: "NUM_17", - 17: "NUM_18", - 18: "NUM_19", - 19: "NUM_20", - 20: "NUM_21", - 21: "NUM_22", - 22: "NUM_23", - 23: "NUM_24", - 24: "NUM_25", - 25: "NUM_26", - 26: "NUM_27", - 27: "NUM_28", - 28: "NUM_29", - 29: "NUM_30", -} -var GPIONum_value = map[string]int32{ - "NUM_1": 0, - "NUM_2": 1, - "NUM_3": 2, - "NUM_4": 3, - "NUM_5": 4, - "NUM_6": 5, - "NUM_7": 6, - "NUM_8": 7, - "NUM_9": 8, - "NUM_10": 9, - "NUM_11": 10, - "NUM_12": 11, - "NUM_13": 12, - "NUM_14": 13, - "NUM_15": 14, - "NUM_16": 15, - "NUM_17": 16, - "NUM_18": 17, - "NUM_19": 18, - "NUM_20": 19, - "NUM_21": 20, - "NUM_22": 21, - "NUM_23": 22, - "NUM_24": 23, - "NUM_25": 24, - "NUM_26": 25, - "NUM_27": 26, - "NUM_28": 27, - "NUM_29": 28, - "NUM_30": 29, -} - -func (x GPIONum) String() string { - return proto.EnumName(GPIONum_name, int32(x)) -} -func (GPIONum) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - type GPIOOutValue int32 const ( @@ -316,7 +211,7 @@ var GPIOOutValue_value = map[string]int32{ func (x GPIOOutValue) String() string { return proto.EnumName(GPIOOutValue_name, int32(x)) } -func (GPIOOutValue) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (GPIOOutValue) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } // WiFi2 (distinguish state and settings) type WiFiWorkingMode int32 @@ -344,7 +239,7 @@ var WiFiWorkingMode_value = map[string]int32{ func (x WiFiWorkingMode) String() string { return proto.EnumName(WiFiWorkingMode_name, int32(x)) } -func (WiFiWorkingMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (WiFiWorkingMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } type WiFiStateMode int32 @@ -368,7 +263,7 @@ var WiFiStateMode_value = map[string]int32{ func (x WiFiStateMode) String() string { return proto.EnumName(WiFiStateMode_name, int32(x)) } -func (WiFiStateMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (WiFiStateMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } type WiFiAuthMode int32 @@ -389,7 +284,7 @@ var WiFiAuthMode_value = map[string]int32{ func (x WiFiAuthMode) String() string { return proto.EnumName(WiFiAuthMode_name, int32(x)) } -func (WiFiAuthMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (WiFiAuthMode) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } type AccessibleFolder int32 @@ -413,7 +308,7 @@ var AccessibleFolder_value = map[string]int32{ func (x AccessibleFolder) String() string { return proto.EnumName(AccessibleFolder_name, int32(x)) } -func (AccessibleFolder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (AccessibleFolder) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } type ActionDeploySettingsTemplate_TemplateType int32 @@ -1661,7 +1556,7 @@ func (m *TriggerGroupReceiveMulti) GetType() GroupReceiveMultiType { } type TriggerGPIOIn struct { - GpioNum GPIONum `protobuf:"varint,1,opt,name=gpioNum,enum=P4wnP1_grpc.GPIONum" json:"gpioNum,omitempty"` + GpioName string `protobuf:"bytes,1,opt,name=gpio_name,json=gpioName" json:"gpio_name,omitempty"` PullUpDown GPIOInPullUpDown `protobuf:"varint,2,opt,name=pullUpDown,enum=P4wnP1_grpc.GPIOInPullUpDown" json:"pullUpDown,omitempty"` GpioInEdge GPIOInEdge `protobuf:"varint,3,opt,name=gpioInEdge,enum=P4wnP1_grpc.GPIOInEdge" json:"gpioInEdge,omitempty"` } @@ -1671,11 +1566,11 @@ func (m *TriggerGPIOIn) String() string { return proto.CompactTextStr func (*TriggerGPIOIn) ProtoMessage() {} func (*TriggerGPIOIn) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } -func (m *TriggerGPIOIn) GetGpioNum() GPIONum { +func (m *TriggerGPIOIn) GetGpioName() string { if m != nil { - return m.GpioNum + return m.GpioName } - return GPIONum_NUM_1 + return "" } func (m *TriggerGPIOIn) GetPullUpDown() GPIOInPullUpDown { @@ -1757,8 +1652,8 @@ func (*ActionLog) ProtoMessage() {} func (*ActionLog) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } type ActionGPIOOut struct { - GpioNum GPIONum `protobuf:"varint,1,opt,name=gpioNum,enum=P4wnP1_grpc.GPIONum" json:"gpioNum,omitempty"` - Value GPIOOutValue `protobuf:"varint,2,opt,name=value,enum=P4wnP1_grpc.GPIOOutValue" json:"value,omitempty"` + GpioName string `protobuf:"bytes,1,opt,name=gpio_name,json=gpioName" json:"gpio_name,omitempty"` + Value GPIOOutValue `protobuf:"varint,2,opt,name=value,enum=P4wnP1_grpc.GPIOOutValue" json:"value,omitempty"` } func (m *ActionGPIOOut) Reset() { *m = ActionGPIOOut{} } @@ -1766,11 +1661,11 @@ func (m *ActionGPIOOut) String() string { return proto.CompactTextStr func (*ActionGPIOOut) ProtoMessage() {} func (*ActionGPIOOut) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } -func (m *ActionGPIOOut) GetGpioNum() GPIONum { +func (m *ActionGPIOOut) GetGpioName() string { if m != nil { - return m.GpioNum + return m.GpioName } - return GPIONum_NUM_1 + return "" } func (m *ActionGPIOOut) GetValue() GPIOOutValue { @@ -3113,7 +3008,6 @@ func init() { proto.RegisterEnum("P4wnP1_grpc.GroupReceiveMultiType", GroupReceiveMultiType_name, GroupReceiveMultiType_value) proto.RegisterEnum("P4wnP1_grpc.GPIOInPullUpDown", GPIOInPullUpDown_name, GPIOInPullUpDown_value) proto.RegisterEnum("P4wnP1_grpc.GPIOInEdge", GPIOInEdge_name, GPIOInEdge_value) - proto.RegisterEnum("P4wnP1_grpc.GPIONum", GPIONum_name, GPIONum_value) proto.RegisterEnum("P4wnP1_grpc.GPIOOutValue", GPIOOutValue_name, GPIOOutValue_value) proto.RegisterEnum("P4wnP1_grpc.WiFiWorkingMode", WiFiWorkingMode_name, WiFiWorkingMode_value) proto.RegisterEnum("P4wnP1_grpc.WiFiStateMode", WiFiStateMode_name, WiFiStateMode_value) @@ -3223,6 +3117,8 @@ type P4WNP1Client interface { ListStoredHIDScripts(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) ListStoredBashScripts(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) ListStoredDBBackups(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) + // GPIO + GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) } type p4WNP1Client struct { @@ -3949,6 +3845,15 @@ func (c *p4WNP1Client) ListStoredDBBackups(ctx context.Context, in *Empty, opts return out, nil } +func (c *p4WNP1Client) GetAvailableGpios(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) { + out := new(StringMessageArray) + err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/GetAvailableGpios", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Server API for P4WNP1 service type P4WNP1Server interface { @@ -4041,6 +3946,8 @@ type P4WNP1Server interface { ListStoredHIDScripts(context.Context, *Empty) (*StringMessageArray, error) ListStoredBashScripts(context.Context, *Empty) (*StringMessageArray, error) ListStoredDBBackups(context.Context, *Empty) (*StringMessageArray, error) + // GPIO + GetAvailableGpios(context.Context, *Empty) (*StringMessageArray, error) } func RegisterP4WNP1Server(s *grpc.Server, srv P4WNP1Server) { @@ -5436,6 +5343,24 @@ func _P4WNP1_ListStoredDBBackups_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _P4WNP1_GetAvailableGpios_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(P4WNP1Server).GetAvailableGpios(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/P4wnP1_grpc.P4WNP1/GetAvailableGpios", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(P4WNP1Server).GetAvailableGpios(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + var _P4WNP1_serviceDesc = grpc.ServiceDesc{ ServiceName: "P4wnP1_grpc.P4WNP1", HandlerType: (*P4WNP1Server)(nil), @@ -5744,6 +5669,10 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{ MethodName: "ListStoredDBBackups", Handler: _P4WNP1_ListStoredDBBackups_Handler, }, + { + MethodName: "GetAvailableGpios", + Handler: _P4WNP1_GetAvailableGpios_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -5758,319 +5687,310 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("grpc.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 5022 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x5c, 0x49, 0x73, 0x23, 0x47, - 0x76, 0xc6, 0xc2, 0x05, 0x78, 0x20, 0xc8, 0x62, 0x36, 0x17, 0x34, 0x7b, 0xaf, 0x69, 0x69, 0x5a, - 0x94, 0x44, 0xa9, 0xd9, 0xad, 0xee, 0x96, 0x46, 0xb2, 0x06, 0x1b, 0x01, 0x74, 0x83, 0x00, 0x54, - 0x05, 0x34, 0x35, 0x8b, 0x5d, 0x53, 0xa8, 0x4a, 0x82, 0xa5, 0x06, 0xaa, 0xe0, 0x5a, 0x48, 0xd1, - 0x8e, 0x98, 0x08, 0x4f, 0x84, 0x23, 0xe6, 0xe0, 0xbb, 0x0f, 0xfe, 0x0d, 0xf6, 0xcd, 0xe1, 0x5f, - 0xe4, 0x08, 0xfb, 0x32, 0x37, 0x5f, 0x7c, 0xb1, 0x23, 0x33, 0x6b, 0x05, 0xaa, 0xb8, 0xb5, 0x74, - 0xcb, 0x7c, 0xf9, 0xf2, 0xcb, 0xe5, 0x2d, 0xf9, 0xf2, 0x65, 0x01, 0x00, 0x23, 0x73, 0xaa, 0xec, - 0x4d, 0x4d, 0xc3, 0x36, 0x50, 0xa1, 0xf7, 0xfc, 0x4c, 0xef, 0x3d, 0x95, 0x08, 0x89, 0xff, 0x97, - 0x0c, 0xac, 0x1e, 0xca, 0x96, 0x8d, 0xcd, 0x3e, 0x9e, 0x4c, 0xc7, 0xb2, 0x8d, 0xd1, 0x0b, 0xd8, - 0xb6, 0xdd, 0xb2, 0xa4, 0xcb, 0x13, 0x2c, 0x0d, 0xc7, 0x0e, 0xb6, 0x0d, 0xc3, 0x3e, 0x29, 0xa5, - 0x1f, 0xa6, 0x9f, 0xe4, 0x85, 0x4d, 0xaf, 0xb9, 0x23, 0x4f, 0x70, 0xc5, 0x6b, 0x44, 0xbb, 0xb0, - 0x1e, 0xed, 0xe7, 0x58, 0xc3, 0x52, 0x86, 0xf6, 0x58, 0x0b, 0xf7, 0x18, 0x58, 0x43, 0xf4, 0x09, - 0xa0, 0x28, 0xef, 0x99, 0x76, 0xac, 0x95, 0xb2, 0x94, 0x99, 0x0b, 0x33, 0x1f, 0x69, 0xc7, 0x1a, - 0x2a, 0xc3, 0xbd, 0x28, 0xb7, 0x6d, 0x6a, 0xa3, 0x11, 0x36, 0x25, 0x59, 0xb1, 0x35, 0x43, 0xb7, - 0x4a, 0x0b, 0xb4, 0xe3, 0x4e, 0xb8, 0x63, 0x9f, 0xb1, 0x94, 0x19, 0x07, 0x7a, 0x0e, 0x5b, 0x11, - 0x08, 0x4b, 0xd2, 0xb1, 0x7d, 0x66, 0x98, 0xef, 0x4a, 0x8b, 0x0f, 0xb3, 0x4f, 0xf2, 0xc2, 0x46, - 0xb8, 0xaf, 0xd5, 0x61, 0x6d, 0xfc, 0xdf, 0xc3, 0x5d, 0x01, 0xff, 0xad, 0x83, 0x2d, 0x3b, 0xba, - 0x47, 0xa2, 0x6d, 0x98, 0xf2, 0x08, 0x23, 0x1e, 0x56, 0xfa, 0xa1, 0x7e, 0xee, 0xfe, 0x44, 0x68, - 0xe8, 0x25, 0xe4, 0x3c, 0x6c, 0xba, 0x1b, 0x85, 0xfd, 0x3b, 0x7b, 0x21, 0x09, 0xec, 0x45, 0x91, - 0x05, 0x9f, 0x99, 0xff, 0x87, 0x34, 0x3c, 0xf0, 0x77, 0xd7, 0x9d, 0x86, 0x88, 0x6d, 0x5b, 0xd3, - 0x47, 0xd6, 0x75, 0x26, 0xf0, 0x15, 0xe4, 0x2c, 0xb7, 0x9b, 0x3b, 0x81, 0xfb, 0x91, 0x09, 0xf8, - 0x63, 0x78, 0xe0, 0x82, 0xcf, 0xcf, 0xff, 0x63, 0x1a, 0xd6, 0xe7, 0xda, 0xd1, 0xaf, 0x20, 0xa3, - 0x68, 0x74, 0xac, 0xc2, 0xfe, 0xc7, 0xf1, 0x58, 0x55, 0x43, 0xb7, 0x4d, 0x63, 0x3c, 0xc6, 0x66, - 0x4b, 0x3f, 0x36, 0xcc, 0x89, 0x4c, 0xc4, 0x20, 0x64, 0x14, 0x0d, 0x3d, 0x83, 0x8c, 0xec, 0x4d, - 0xe4, 0x17, 0xf1, 0x9d, 0xcb, 0x23, 0xac, 0xfb, 0x4b, 0x15, 0x32, 0xb2, 0xc5, 0xef, 0xc2, 0x56, - 0x7c, 0x2b, 0xe2, 0x20, 0x3b, 0xd5, 0x74, 0x77, 0xe1, 0xa4, 0xc8, 0xff, 0x6f, 0x1a, 0xb6, 0x7d, - 0x66, 0x57, 0x92, 0x22, 0x36, 0x4f, 0x35, 0x05, 0x13, 0x35, 0x30, 0xf1, 0x48, 0x23, 0x3b, 0x2e, - 0x19, 0xa6, 0xe4, 0xe8, 0x5e, 0x8d, 0x02, 0xe4, 0x84, 0x0d, 0xaf, 0xde, 0x35, 0x07, 0x7e, 0x1b, - 0xd1, 0x6c, 0x0b, 0x9b, 0xa7, 0xac, 0x8f, 0x62, 0xe8, 0x3a, 0x56, 0x6c, 0xba, 0x82, 0x9c, 0xb0, - 0xc6, 0x1a, 0xba, 0x66, 0x95, 0x91, 0xd1, 0xd7, 0xb0, 0x60, 0x9f, 0x4f, 0x31, 0xd5, 0xe5, 0xd5, - 0xfd, 0x27, 0xf1, 0x0b, 0x8c, 0xce, 0xaa, 0x7f, 0x3e, 0xc5, 0x02, 0xed, 0x85, 0xee, 0x43, 0x61, - 0x22, 0x2b, 0x64, 0x18, 0xa2, 0xa4, 0xae, 0x5e, 0xe7, 0x27, 0xb2, 0xd2, 0x35, 0xa9, 0x2c, 0x1f, - 0x40, 0x61, 0x68, 0x6a, 0xea, 0x88, 0x29, 0x71, 0x69, 0x91, 0xb6, 0x03, 0x23, 0x11, 0x06, 0xfe, - 0xbf, 0x17, 0xe0, 0x4e, 0x8c, 0x10, 0xfc, 0xed, 0x2a, 0xc1, 0xf2, 0xd4, 0x38, 0xc3, 0x26, 0x56, - 0xdd, 0x15, 0x7b, 0x55, 0xf4, 0x10, 0x0a, 0xee, 0xd2, 0xe4, 0xe1, 0x18, 0xbb, 0xcb, 0x0b, 0x93, - 0xd0, 0x47, 0xc0, 0x1d, 0xcb, 0x96, 0x2d, 0x85, 0xd9, 0xb2, 0x6c, 0x17, 0x08, 0xbd, 0x1a, 0x62, - 0xe5, 0x61, 0x45, 0xd5, 0x2c, 0xc5, 0x38, 0xc5, 0x26, 0x65, 0x5b, 0xa0, 0x6c, 0x11, 0x1a, 0xda, - 0x81, 0xdc, 0xd0, 0xd0, 0x55, 0xda, 0xbe, 0x48, 0xdb, 0xfd, 0x3a, 0xda, 0x83, 0x5b, 0x63, 0x4d, - 0x7f, 0x27, 0x8d, 0xf1, 0x29, 0x1e, 0x4b, 0x16, 0x56, 0x1c, 0x53, 0xb3, 0xcf, 0x4b, 0x4b, 0x94, - 0x6d, 0x9d, 0x34, 0xb5, 0x49, 0x8b, 0xe8, 0x36, 0xa0, 0x7d, 0xd8, 0xa4, 0x4c, 0x58, 0xb2, 0xb4, - 0xc9, 0x74, 0x8c, 0xa5, 0xa9, 0xac, 0x99, 0x9a, 0x3e, 0x2a, 0x2d, 0xd3, 0x1e, 0xb7, 0x58, 0xa3, - 0x48, 0xdb, 0x7a, 0xac, 0x09, 0x6d, 0xc2, 0xd2, 0xd0, 0x94, 0xb0, 0x6a, 0x96, 0x72, 0x94, 0x69, - 0x71, 0x68, 0xd6, 0x55, 0x13, 0xdd, 0x03, 0x38, 0xd1, 0x46, 0x27, 0x92, 0x35, 0xc5, 0x58, 0x2d, - 0xe5, 0x69, 0x53, 0x9e, 0x50, 0x44, 0x42, 0x20, 0xcd, 0x63, 0xe3, 0x4c, 0xc2, 0x3a, 0x36, 0x47, - 0xe7, 0x25, 0x60, 0xcd, 0x63, 0xe3, 0xac, 0x4e, 0x09, 0x64, 0x17, 0x65, 0xf5, 0x14, 0x9b, 0xb6, - 0x66, 0x91, 0xe1, 0x0b, 0x6c, 0x17, 0x43, 0x24, 0xf4, 0x29, 0x20, 0x77, 0xaa, 0xee, 0x3e, 0x52, - 0x0f, 0xb6, 0xc2, 0x56, 0xc6, 0x5a, 0xaa, 0x41, 0x03, 0x19, 0x4f, 0xc5, 0x43, 0x67, 0x24, 0xbd, - 0xc3, 0xe7, 0x56, 0xa9, 0xc8, 0xc6, 0xa3, 0x94, 0x37, 0xf8, 0x9c, 0xc9, 0xd3, 0xd4, 0x4e, 0x65, - 0xe5, 0xbc, 0xb4, 0xea, 0xca, 0x93, 0x55, 0xd1, 0x97, 0x50, 0x52, 0x7c, 0xf9, 0x93, 0xb1, 0x8e, - 0xb5, 0x91, 0x63, 0x52, 0x3b, 0x2c, 0xad, 0x51, 0xd6, 0xed, 0xa0, 0xbd, 0x1a, 0x6e, 0x46, 0x1f, - 0xc0, 0xaa, 0x65, 0xcb, 0xb6, 0xa6, 0x48, 0xb2, 0xaa, 0x9a, 0xd8, 0xb2, 0x4a, 0x1c, 0xed, 0x50, - 0x64, 0xd4, 0x32, 0x23, 0xf2, 0x7f, 0x59, 0x80, 0xfb, 0x17, 0x1b, 0x3c, 0x99, 0x9e, 0x07, 0x41, - 0xd4, 0x6d, 0x45, 0xf0, 0xaa, 0xe8, 0x63, 0x58, 0xf7, 0xcf, 0x15, 0xe9, 0x14, 0x9b, 0x16, 0x99, - 0x17, 0x51, 0xba, 0xa2, 0xc0, 0xf9, 0x0d, 0x6f, 0x19, 0x9d, 0xa8, 0xd3, 0x44, 0xd6, 0x9d, 0x63, - 0x59, 0xb1, 0x1d, 0x13, 0x9b, 0x54, 0xeb, 0x8a, 0x42, 0x84, 0x86, 0x8e, 0x00, 0x59, 0xce, 0x74, - 0x6a, 0x98, 0x36, 0x56, 0x25, 0xdf, 0xe1, 0x2d, 0x50, 0x3f, 0xf3, 0xe4, 0x32, 0x27, 0xe5, 0x3b, - 0x9b, 0x75, 0x1f, 0xc3, 0x37, 0x19, 0x11, 0x38, 0xc5, 0x31, 0x4d, 0xac, 0xdb, 0x01, 0xec, 0xe2, - 0x35, 0x61, 0xd7, 0x5c, 0x04, 0x1f, 0xf4, 0x43, 0x58, 0x53, 0xc6, 0xb2, 0x65, 0x49, 0xc6, 0xb1, - 0xa4, 0x62, 0xe2, 0x05, 0xa8, 0x72, 0xaf, 0x08, 0x45, 0x4a, 0xee, 0x1e, 0xd7, 0x28, 0x11, 0x21, - 0x58, 0xa0, 0x96, 0xbe, 0x4c, 0x2d, 0x9d, 0x96, 0x89, 0x4a, 0x58, 0x27, 0x86, 0x69, 0x33, 0x1f, - 0x90, 0x63, 0x3e, 0x82, 0x52, 0xa8, 0x8f, 0x78, 0x04, 0x2b, 0x9a, 0x25, 0xc9, 0xa7, 0xb2, 0x36, - 0xa6, 0xb6, 0xc5, 0x54, 0xb8, 0xa0, 0x59, 0x65, 0x8f, 0x84, 0x7e, 0x05, 0x3b, 0x16, 0xf3, 0x3d, - 0xde, 0x31, 0x28, 0xb9, 0x0e, 0x4e, 0x97, 0xa7, 0xae, 0x52, 0x6f, 0xbb, 0x1c, 0x21, 0x5f, 0x85, - 0xcd, 0x8e, 0x3c, 0x45, 0xdf, 0xc0, 0x9d, 0x84, 0xce, 0x53, 0x59, 0x77, 0x5c, 0x95, 0x2f, 0xc5, - 0xf5, 0xee, 0xc9, 0xba, 0x83, 0xbe, 0x84, 0xdb, 0x09, 0xdd, 0x47, 0xba, 0x6b, 0x06, 0x5b, 0x71, - 0x9d, 0x1b, 0x3a, 0xff, 0x03, 0x70, 0x91, 0x63, 0x5d, 0xc4, 0x36, 0xaa, 0xc0, 0x6a, 0xf4, 0xa8, - 0x2f, 0xa5, 0x1f, 0x66, 0x9f, 0x14, 0xf6, 0x77, 0x22, 0xb2, 0x89, 0xb0, 0x08, 0x33, 0x3d, 0xc8, - 0x26, 0xd3, 0xd3, 0x93, 0x05, 0x2b, 0xb4, 0xcc, 0xff, 0x2b, 0x40, 0x31, 0xc2, 0x86, 0x56, 0x21, - 0xa3, 0x31, 0xaf, 0x59, 0x14, 0x32, 0x9a, 0x4a, 0x74, 0xdb, 0xd0, 0xb1, 0x78, 0x62, 0x78, 0x67, - 0x81, 0x57, 0x25, 0x9e, 0x4d, 0xb3, 0x48, 0xaf, 0x53, 0xcf, 0x41, 0xfa, 0x75, 0x74, 0x17, 0xf2, - 0xda, 0x64, 0xe2, 0xd8, 0x21, 0xb7, 0x18, 0x10, 0x50, 0x1b, 0x56, 0xdd, 0xb5, 0x8b, 0xb6, 0x4c, - 0xb4, 0xd0, 0xd5, 0x34, 0x3e, 0x6e, 0x35, 0x62, 0x84, 0xb3, 0x99, 0x12, 0x66, 0xfa, 0xa2, 0xef, - 0x01, 0x39, 0xd6, 0xb0, 0x21, 0xab, 0x23, 0xec, 0x79, 0x67, 0xac, 0x52, 0x3d, 0x2b, 0xec, 0x7f, - 0x18, 0x87, 0x38, 0x10, 0x2b, 0x33, 0xdc, 0xcd, 0x94, 0x10, 0x83, 0x81, 0x64, 0xd8, 0xf4, 0xa9, - 0x35, 0xe2, 0xd4, 0x3d, 0xf0, 0x65, 0x0a, 0xfe, 0xd1, 0x85, 0xe0, 0xe1, 0x0e, 0xcd, 0x94, 0x10, - 0x8f, 0x84, 0x5a, 0x50, 0x24, 0x41, 0x61, 0xb9, 0xe7, 0xed, 0x44, 0x8e, 0x42, 0x3f, 0x8a, 0x83, - 0x3e, 0x0a, 0x33, 0x36, 0x53, 0x42, 0xb4, 0x27, 0xd9, 0x07, 0x42, 0xf0, 0xa7, 0x5f, 0xb6, 0x44, - 0x5b, 0xa6, 0x76, 0x91, 0xb0, 0x0f, 0x47, 0x73, 0xdc, 0x64, 0x1f, 0xe6, 0x31, 0x68, 0x6c, 0x65, - 0x9d, 0xb4, 0x8d, 0x91, 0xa6, 0x53, 0xb3, 0x29, 0xec, 0xdf, 0x8d, 0x95, 0x94, 0xd8, 0xa4, 0x3c, - 0xcd, 0x94, 0xe0, 0xf3, 0x23, 0x01, 0x38, 0xf5, 0x44, 0x99, 0xb6, 0xb1, 0x6c, 0xe1, 0x86, 0x29, - 0xeb, 0x64, 0x8d, 0x05, 0x8a, 0xf1, 0x38, 0x0e, 0xa3, 0xd6, 0xac, 0xf6, 0xc2, 0xbc, 0xcd, 0x94, - 0x30, 0xd7, 0x1f, 0x1d, 0xc0, 0xca, 0xc8, 0x34, 0x9c, 0xa9, 0x80, 0x15, 0x4c, 0xb4, 0x6f, 0x85, - 0xe2, 0x3d, 0x8c, 0xc3, 0x6b, 0x84, 0xf8, 0x9a, 0x29, 0x21, 0xd2, 0x0f, 0x0d, 0x60, 0x3d, 0x5c, - 0x3f, 0x74, 0xc6, 0xb6, 0x46, 0x0f, 0x9f, 0xc2, 0xfe, 0x07, 0x97, 0x81, 0x51, 0xe6, 0x66, 0x4a, - 0x98, 0x47, 0x40, 0xcf, 0x61, 0x69, 0x34, 0xd5, 0x8c, 0x96, 0x4e, 0x0f, 0xab, 0x04, 0x23, 0x6d, - 0xf4, 0x5a, 0xdd, 0x16, 0xd9, 0x2a, 0x97, 0x17, 0xd5, 0x00, 0x86, 0xb2, 0x75, 0x22, 0x2a, 0xa6, - 0x36, 0xb5, 0xe9, 0xd9, 0x35, 0x6b, 0x10, 0xae, 0x3b, 0x20, 0xe2, 0xae, 0xf8, 0x9c, 0xcd, 0xb4, - 0x10, 0xea, 0x87, 0xca, 0x90, 0x3f, 0xd1, 0x54, 0x17, 0x84, 0x8b, 0xd1, 0xa5, 0x10, 0x48, 0xb3, - 0x55, 0xf3, 0x31, 0x82, 0x5e, 0x48, 0x81, 0x2d, 0x15, 0x4f, 0xc7, 0xc6, 0xb9, 0xe7, 0xc6, 0xbd, - 0x38, 0xbb, 0xb4, 0x1e, 0xa3, 0xf6, 0x0c, 0xaf, 0x16, 0xdb, 0xa1, 0x99, 0x16, 0x12, 0xa0, 0xd0, - 0x2e, 0x64, 0xc7, 0xc6, 0xa8, 0x84, 0x28, 0xe2, 0x56, 0x0c, 0x62, 0xdb, 0x18, 0x35, 0xd3, 0x02, - 0x61, 0x42, 0x2f, 0x60, 0x99, 0xec, 0x51, 0xd7, 0xb1, 0x4b, 0xb7, 0x62, 0x36, 0x94, 0xf1, 0x93, - 0xfd, 0xec, 0x3a, 0x64, 0x29, 0x1e, 0x33, 0xfa, 0x1a, 0xf2, 0x54, 0x38, 0x22, 0xd6, 0xd5, 0xd2, - 0x46, 0x8c, 0xde, 0xba, 0x3d, 0x3d, 0x1e, 0xb2, 0x0d, 0x7e, 0x87, 0x4a, 0x1e, 0x96, 0x5d, 0x51, - 0x55, 0x72, 0xb0, 0xc4, 0x58, 0xf9, 0x6d, 0xd8, 0x8c, 0x75, 0x4b, 0xfc, 0x1d, 0xb8, 0x9d, 0xe8, - 0x5d, 0xf8, 0xfb, 0x70, 0xf7, 0x22, 0xef, 0xc0, 0x6f, 0xc1, 0x46, 0x9c, 0x89, 0x87, 0x40, 0xe7, - 0x4d, 0x95, 0xff, 0x0c, 0xd6, 0x66, 0xec, 0x8e, 0x78, 0xdd, 0x31, 0x29, 0x0c, 0x2c, 0x37, 0xd4, - 0xcf, 0x0b, 0x01, 0x81, 0xbf, 0x0d, 0xdb, 0x09, 0x46, 0xc6, 0xb7, 0xe0, 0x56, 0x8c, 0x8a, 0x13, - 0x3c, 0xba, 0x1f, 0xa1, 0x4b, 0x57, 0x40, 0x40, 0x1b, 0xb0, 0x78, 0x2a, 0x8f, 0x1d, 0x76, 0xa0, - 0x2c, 0x0a, 0xac, 0xc2, 0xff, 0x39, 0x0d, 0xa5, 0x24, 0x73, 0xb9, 0x04, 0x70, 0x0b, 0x96, 0x28, - 0x86, 0x55, 0xca, 0x3e, 0xcc, 0x3e, 0x59, 0x14, 0xdc, 0x1a, 0x7a, 0xe1, 0x5e, 0x36, 0x16, 0xe8, - 0x65, 0x23, 0x6a, 0x13, 0x73, 0x63, 0x04, 0xd7, 0x0c, 0xfe, 0x3f, 0xd2, 0xfe, 0xe1, 0xc6, 0xac, - 0x0d, 0xed, 0x31, 0x4d, 0xea, 0x38, 0x13, 0x3a, 0xfa, 0xea, 0xfe, 0x46, 0x14, 0xac, 0xd7, 0xea, - 0x76, 0x9c, 0x89, 0xe0, 0x31, 0xa1, 0x6f, 0x00, 0xa6, 0xce, 0x78, 0x3c, 0x98, 0xd6, 0x8c, 0x33, - 0x16, 0xb7, 0xad, 0xee, 0xdf, 0x9b, 0xeb, 0xd2, 0xd2, 0x7b, 0x3e, 0x93, 0x10, 0xea, 0x80, 0x5e, - 0x02, 0x30, 0xe3, 0xae, 0xab, 0x23, 0xef, 0xae, 0xb4, 0x1d, 0xd3, 0x9d, 0x34, 0x0b, 0x21, 0x56, - 0xfe, 0x25, 0x6c, 0xc6, 0x1a, 0x3b, 0xba, 0x0f, 0x60, 0xd1, 0x52, 0x68, 0x07, 0x43, 0x14, 0xfe, - 0x05, 0x6c, 0xc4, 0x19, 0xf8, 0xa5, 0xfd, 0xfe, 0x27, 0x0d, 0x77, 0x2f, 0xb2, 0x64, 0x12, 0x9b, - 0xda, 0x31, 0x57, 0xf0, 0x30, 0x0d, 0xbd, 0x76, 0xe5, 0xc4, 0xf6, 0xe9, 0xc5, 0x95, 0xdd, 0xc4, - 0x9e, 0x57, 0x08, 0xc9, 0x0e, 0x07, 0x57, 0x7e, 0x42, 0x45, 0xeb, 0x50, 0x3c, 0x18, 0xb4, 0xdb, - 0x92, 0x58, 0xef, 0xf7, 0x5b, 0x9d, 0x86, 0xc8, 0xa5, 0x50, 0x01, 0x96, 0x3b, 0xf5, 0xfe, 0x51, - 0x57, 0x78, 0xc3, 0xa5, 0x51, 0x0e, 0x16, 0x8e, 0x5a, 0x07, 0x2d, 0x2e, 0x83, 0x96, 0x21, 0x3b, - 0x10, 0x2b, 0x5c, 0x16, 0x15, 0x21, 0x5f, 0x69, 0x0f, 0xea, 0xfd, 0x6e, 0xb7, 0xdf, 0xe4, 0x16, - 0xd0, 0x2d, 0x58, 0xeb, 0x0b, 0xad, 0x46, 0xa3, 0x2e, 0x48, 0xe5, 0x6a, 0xbf, 0xd5, 0xed, 0x88, - 0xdc, 0x22, 0x5f, 0x80, 0xbc, 0xef, 0x6e, 0xf8, 0x29, 0x14, 0x23, 0xbe, 0xe4, 0xda, 0xea, 0xf2, - 0x59, 0xd8, 0x22, 0x56, 0xf7, 0x6f, 0xcf, 0x71, 0x77, 0x1d, 0xfb, 0x2d, 0x61, 0xf0, 0x8c, 0xa5, - 0x0e, 0x6b, 0x33, 0x3e, 0xe8, 0x46, 0x36, 0x77, 0x06, 0x3b, 0xc4, 0x41, 0xbc, 0x47, 0xf6, 0xe4, - 0x8b, 0xb9, 0xec, 0x49, 0x74, 0xf2, 0x47, 0xda, 0x81, 0x16, 0x93, 0x38, 0xf9, 0xe7, 0x2c, 0xac, - 0x84, 0x9b, 0xfc, 0x40, 0x3e, 0x1d, 0x0a, 0xe4, 0x77, 0x20, 0xa7, 0x6a, 0x16, 0x09, 0xfc, 0x54, - 0x37, 0x84, 0xf4, 0xeb, 0x44, 0x2f, 0x4d, 0x3c, 0x72, 0xc6, 0xb2, 0x6d, 0x98, 0xe7, 0x6e, 0x66, - 0x2c, 0x44, 0x41, 0xdf, 0xc2, 0x0a, 0x89, 0x8d, 0x35, 0x7d, 0x24, 0x4d, 0x0c, 0xd5, 0x73, 0x01, - 0x77, 0xe7, 0xe6, 0x76, 0xc4, 0x98, 0x0e, 0x0d, 0x15, 0x0b, 0x85, 0xb3, 0xa0, 0x82, 0x5e, 0x40, - 0x5e, 0x76, 0xec, 0x13, 0xd6, 0x7b, 0x31, 0x46, 0x2c, 0xa4, 0x77, 0xd9, 0xb1, 0x4f, 0x68, 0xd7, - 0x9c, 0xec, 0x96, 0x48, 0xd8, 0xab, 0x9c, 0xc8, 0xba, 0x8e, 0xc7, 0x34, 0x92, 0x2c, 0x0a, 0x5e, - 0x15, 0xed, 0xc1, 0x92, 0x3c, 0x95, 0x2a, 0xa2, 0xe8, 0x46, 0x81, 0xdb, 0x73, 0x70, 0x15, 0x51, - 0xac, 0x1e, 0x8f, 0x84, 0x45, 0x79, 0x5a, 0x11, 0x45, 0xf4, 0x2d, 0xb9, 0x03, 0x69, 0xe4, 0x5e, - 0x55, 0x11, 0x45, 0x69, 0xac, 0x59, 0x76, 0x29, 0x47, 0x63, 0xf7, 0xc4, 0x8e, 0x45, 0xc6, 0x5f, - 0x11, 0xc5, 0xb6, 0x66, 0xd9, 0xe8, 0x0e, 0x3d, 0xd2, 0xb1, 0x64, 0x59, 0x9a, 0x77, 0x53, 0xcf, - 0x11, 0x82, 0x68, 0x69, 0x2a, 0xf1, 0x99, 0x3a, 0xfe, 0x71, 0x62, 0xe8, 0xee, 0xa5, 0xd9, 0xad, - 0xf1, 0xff, 0x96, 0x86, 0x3c, 0x95, 0x8c, 0x4d, 0xac, 0x77, 0x0f, 0x16, 0xe8, 0x06, 0x30, 0x2d, - 0xde, 0x99, 0x17, 0x2d, 0xe1, 0xa2, 0x3b, 0x40, 0xf9, 0xc2, 0xab, 0xcf, 0x44, 0x57, 0x8f, 0x60, - 0x81, 0xce, 0x83, 0x89, 0x8a, 0x96, 0x51, 0x15, 0x66, 0x2f, 0x7e, 0xee, 0x85, 0xf4, 0x02, 0x1d, - 0x9a, 0xed, 0xc1, 0xef, 0x03, 0x04, 0x5b, 0x40, 0x86, 0x11, 0xc5, 0x56, 0xcd, 0xd3, 0x23, 0x52, - 0x46, 0x1c, 0x64, 0x7b, 0xe2, 0x1b, 0xf7, 0xfa, 0x42, 0x8a, 0xfc, 0x23, 0x28, 0x8a, 0xb6, 0x49, - 0x44, 0x8d, 0x2d, 0x8b, 0xa8, 0x3a, 0x07, 0xd9, 0x89, 0x35, 0xf2, 0xd2, 0x64, 0x13, 0x6b, 0xc4, - 0x7f, 0x0e, 0x28, 0xc2, 0x52, 0x36, 0x4d, 0xf9, 0x9c, 0xa8, 0xe4, 0xc4, 0x1a, 0xd1, 0x32, 0xbd, - 0x48, 0xe5, 0x05, 0xbf, 0xce, 0xef, 0xc1, 0x4a, 0xfd, 0x14, 0xeb, 0xb6, 0x6b, 0x4d, 0x44, 0x45, - 0x89, 0xd0, 0xb0, 0x4e, 0xfc, 0x10, 0x85, 0xce, 0x0a, 0x21, 0x0a, 0x2f, 0x03, 0x50, 0x7e, 0x6a, - 0xd8, 0x68, 0x07, 0x96, 0x6d, 0x8b, 0x0e, 0xc8, 0x66, 0xd1, 0x4c, 0x09, 0x1e, 0x01, 0x6d, 0xc1, - 0xa2, 0x3d, 0x34, 0x0c, 0xb6, 0xa7, 0xb9, 0x66, 0x4a, 0x60, 0x55, 0x54, 0x82, 0x25, 0x5b, 0xd3, - 0xed, 0x17, 0xcf, 0xe9, 0xae, 0x66, 0x49, 0x4c, 0xc8, 0xea, 0x95, 0x45, 0xc8, 0x9e, 0xca, 0x63, - 0xbe, 0x0d, 0x8b, 0x74, 0x08, 0xb2, 0x2d, 0x76, 0x30, 0x0b, 0x96, 0x4c, 0xfb, 0xcc, 0x3f, 0x35, - 0x33, 0x31, 0x6a, 0x15, 0x4c, 0xcd, 0x3b, 0x4e, 0xf9, 0x3f, 0xc0, 0x06, 0xb1, 0xfd, 0x9a, 0x66, - 0x76, 0xcd, 0x03, 0x6d, 0x8c, 0xbd, 0x85, 0x72, 0x90, 0x55, 0x35, 0x2f, 0x6e, 0x20, 0x45, 0xa2, - 0x5c, 0x53, 0x13, 0x1f, 0x6b, 0x3f, 0xba, 0x9b, 0xee, 0xd6, 0xc8, 0x96, 0x18, 0xfa, 0xf8, 0xfc, - 0xc0, 0x18, 0xab, 0x6e, 0x9a, 0x22, 0x27, 0x84, 0x28, 0xe4, 0xf8, 0x9a, 0x19, 0xc1, 0x9a, 0x1a, - 0xba, 0x85, 0x99, 0xb9, 0x5b, 0xce, 0xd8, 0xee, 0xc9, 0x7e, 0x9e, 0x3d, 0x44, 0xe1, 0xff, 0x29, - 0x0d, 0x6b, 0x02, 0x96, 0xd5, 0xf0, 0xb4, 0xbe, 0x80, 0xa5, 0x63, 0x36, 0x50, 0x3a, 0xe6, 0xfc, - 0x2d, 0x2b, 0x0a, 0xb6, 0x2c, 0x6d, 0x38, 0xc6, 0x6c, 0x6c, 0xc1, 0x65, 0x26, 0x22, 0x3e, 0xd6, - 0xc6, 0x58, 0x0f, 0x6e, 0xbc, 0x7e, 0x9d, 0x78, 0x51, 0x8b, 0x9c, 0x8f, 0x6c, 0xbf, 0x05, 0x56, - 0x21, 0xeb, 0x1f, 0x63, 0x9d, 0xaa, 0x6e, 0x56, 0x20, 0x45, 0xbe, 0x06, 0x5c, 0x30, 0x1b, 0x77, - 0x09, 0x77, 0x21, 0x6f, 0x62, 0x59, 0xad, 0x1a, 0x8e, 0x6e, 0xbb, 0x72, 0x08, 0x08, 0x44, 0x40, - 0xaa, 0x6c, 0xcb, 0x74, 0xc4, 0x15, 0x81, 0x96, 0xf9, 0x7f, 0x4f, 0x03, 0x77, 0x64, 0x6a, 0x36, - 0xfe, 0x99, 0x57, 0xb5, 0x45, 0x1c, 0xd3, 0x94, 0xc4, 0xba, 0x4c, 0x22, 0x6e, 0x8d, 0xa6, 0x95, - 0x1c, 0xcb, 0xee, 0x18, 0x76, 0xfd, 0x47, 0xe2, 0x7d, 0xdc, 0x2c, 0x65, 0x98, 0xe6, 0xcf, 0x7b, - 0x31, 0x34, 0xef, 0x0f, 0x60, 0x8d, 0xcc, 0xb8, 0xa5, 0x1f, 0x1b, 0xde, 0xac, 0x11, 0x2c, 0x4c, - 0x03, 0xc9, 0xd1, 0x32, 0xff, 0x47, 0xe0, 0x02, 0x36, 0x77, 0x93, 0xe2, 0x8e, 0x01, 0xe2, 0x39, - 0xb4, 0xbf, 0x63, 0xd3, 0xce, 0x0a, 0xb4, 0x4c, 0x68, 0xd4, 0x2f, 0xb1, 0x4c, 0x97, 0xef, 0x7b, - 0x26, 0x86, 0xda, 0xd7, 0xdc, 0xc4, 0x70, 0x56, 0xf0, 0xaa, 0x44, 0x6c, 0x9a, 0x55, 0xd3, 0x4c, - 0x37, 0x8f, 0xca, 0x2a, 0xfc, 0x6f, 0x81, 0xf3, 0xe3, 0x9c, 0x90, 0xcd, 0xb2, 0xe0, 0x26, 0xac, - 0x67, 0x01, 0x05, 0x7d, 0x08, 0xab, 0xb6, 0x36, 0xc1, 0x86, 0x63, 0x8b, 0x58, 0x31, 0x74, 0xd5, - 0x72, 0xdd, 0xdc, 0x0c, 0x95, 0xbf, 0x0f, 0x2b, 0x3e, 0xf6, 0x6b, 0x63, 0x38, 0x9b, 0x1c, 0xe1, - 0x1f, 0x87, 0xc6, 0x7e, 0x6d, 0x0c, 0xa9, 0xbb, 0xe6, 0x20, 0xab, 0xa9, 0x2c, 0x3f, 0x53, 0x14, - 0x48, 0x91, 0x7f, 0x0b, 0xa5, 0x66, 0xab, 0x26, 0x38, 0xba, 0xae, 0xe9, 0xa3, 0xd7, 0xc6, 0x90, - 0x7a, 0x5b, 0x81, 0x6a, 0x7d, 0x08, 0x31, 0x4b, 0xd3, 0x2d, 0x08, 0x16, 0x4e, 0x27, 0x2d, 0xd5, - 0xdb, 0x25, 0x52, 0x26, 0x82, 0xb5, 0x0c, 0xc7, 0x54, 0xb0, 0xeb, 0x75, 0xdd, 0x1a, 0xff, 0x47, - 0x58, 0x0b, 0xad, 0x9c, 0xc2, 0x7d, 0x0c, 0xd9, 0x1f, 0x8c, 0xa1, 0xfb, 0x68, 0x11, 0x75, 0xbf, - 0xe1, 0x89, 0x0a, 0x84, 0x8b, 0xec, 0x92, 0x66, 0x1d, 0x68, 0xba, 0x66, 0x9d, 0xf8, 0x47, 0x73, - 0x88, 0x12, 0x58, 0xeb, 0x6b, 0xcb, 0xd0, 0x83, 0xc3, 0xd9, 0xa3, 0xf0, 0x7b, 0x50, 0x68, 0xd7, - 0x6b, 0xfe, 0xd9, 0xff, 0x00, 0x0a, 0x43, 0x9a, 0xce, 0x56, 0x7c, 0xdb, 0x28, 0x0a, 0x40, 0x49, - 0xd4, 0x38, 0xf8, 0x1f, 0xe1, 0xf6, 0x40, 0xac, 0xbc, 0x47, 0x94, 0xf2, 0x72, 0x2e, 0x4a, 0x89, - 0x3e, 0x32, 0xb1, 0xab, 0x55, 0x4c, 0x9c, 0xf2, 0x97, 0x45, 0x58, 0x8d, 0x36, 0x12, 0x35, 0xc3, - 0x3a, 0x0b, 0x4a, 0xdc, 0x27, 0x02, 0xb7, 0x4a, 0x04, 0x78, 0xaa, 0xa9, 0xde, 0x39, 0x73, 0xaa, - 0xa9, 0xec, 0xf5, 0xc5, 0x3b, 0xf3, 0x48, 0x71, 0x2e, 0x55, 0xcb, 0x9e, 0x30, 0xa2, 0xa9, 0x5a, - 0x9a, 0xb4, 0x36, 0x54, 0x47, 0xb1, 0xdd, 0x17, 0x0c, 0xaf, 0x4a, 0x05, 0x8a, 0x4d, 0x4d, 0x66, - 0xb1, 0x05, 0x11, 0x28, 0xad, 0xa1, 0xfb, 0x50, 0x70, 0x2c, 0x2c, 0x55, 0x6b, 0x55, 0xa9, 0x5e, - 0x3d, 0x74, 0xb3, 0xfa, 0x79, 0xc7, 0xc2, 0xd5, 0x5a, 0xb5, 0x5e, 0x3d, 0x24, 0x91, 0x00, 0x69, - 0x17, 0x3a, 0xb5, 0x96, 0xe8, 0xa6, 0xf3, 0x73, 0x8e, 0x85, 0x69, 0x1d, 0x3d, 0x01, 0x8e, 0x34, - 0x36, 0x5b, 0x35, 0xe9, 0x4d, 0xfd, 0x37, 0x95, 0x6e, 0x59, 0xa8, 0xb9, 0xd1, 0xc2, 0xaa, 0x63, - 0xe1, 0x66, 0xab, 0xe6, 0x51, 0x11, 0x0f, 0x45, 0x8f, 0xf3, 0xb0, 0x3b, 0x10, 0xeb, 0x6e, 0x2a, - 0xb4, 0xc0, 0xd8, 0x28, 0xc9, 0x9b, 0x0a, 0xe1, 0x11, 0xca, 0x47, 0x6e, 0xba, 0x33, 0xcf, 0x38, - 0x84, 0xf2, 0x11, 0xda, 0x86, 0x65, 0xd2, 0x3e, 0x38, 0x14, 0xdd, 0x6c, 0xe6, 0x92, 0x63, 0xe1, - 0xc1, 0xa1, 0x88, 0xee, 0x01, 0x90, 0x06, 0xb1, 0x2e, 0xb4, 0xca, 0x6d, 0x2f, 0x93, 0xef, 0x58, - 0x98, 0x11, 0xd0, 0x6b, 0x58, 0x35, 0x75, 0x55, 0xb3, 0x82, 0x24, 0xf3, 0x6a, 0xcc, 0x1b, 0x59, - 0x54, 0x56, 0x75, 0xfb, 0x04, 0x9b, 0x3a, 0xb6, 0x85, 0x22, 0xed, 0xea, 0x8b, 0xf0, 0x10, 0x38, - 0x45, 0x55, 0x24, 0xac, 0x4c, 0x02, 0xb4, 0xb5, 0xab, 0xa3, 0xad, 0x2a, 0xaa, 0x52, 0x57, 0x26, - 0x3e, 0x5c, 0x19, 0x56, 0x9c, 0x49, 0x68, 0x62, 0x5c, 0xcc, 0x2b, 0x62, 0x14, 0x6a, 0x70, 0x28, - 0x0a, 0x05, 0x67, 0x12, 0xcc, 0xe8, 0x29, 0x6c, 0xaa, 0xf8, 0x54, 0x22, 0x7e, 0x51, 0x3a, 0xd1, - 0x54, 0xe9, 0x1d, 0x3e, 0x1f, 0x1a, 0xb2, 0xa9, 0xd2, 0x3c, 0x47, 0x5e, 0x40, 0x2a, 0x3e, 0x25, - 0xfe, 0xa7, 0xa9, 0xa9, 0x6f, 0xdc, 0x16, 0xf4, 0x31, 0xa0, 0x48, 0x97, 0x89, 0xe1, 0x58, 0x98, - 0xe6, 0x39, 0xf2, 0xc2, 0x5a, 0xc0, 0x7f, 0x48, 0xc8, 0xe8, 0x97, 0xc0, 0x45, 0x98, 0x4d, 0xf9, - 0x8c, 0x26, 0x36, 0xf2, 0x42, 0x31, 0x60, 0x15, 0xe4, 0x33, 0xbe, 0x07, 0x5b, 0xf1, 0xab, 0xa6, - 0xd1, 0xa4, 0x61, 0xd9, 0xf4, 0xcd, 0xc3, 0x35, 0xb2, 0x1c, 0x21, 0x94, 0x55, 0xd5, 0x44, 0xb7, - 0x21, 0x47, 0xf0, 0x69, 0x1b, 0xd3, 0xff, 0x65, 0x15, 0x9f, 0x92, 0x26, 0xfe, 0x1b, 0x58, 0x9f, - 0x5b, 0x3c, 0xf1, 0xc8, 0x8a, 0x6a, 0x1a, 0x13, 0xd7, 0x84, 0x58, 0x85, 0xf8, 0x30, 0x72, 0x28, - 0x79, 0x89, 0x66, 0x52, 0xe6, 0xff, 0x9c, 0x86, 0xfb, 0xfe, 0xce, 0xdf, 0xdc, 0x03, 0x54, 0xe6, - 0x3c, 0x40, 0x34, 0xb3, 0xe9, 0x0d, 0xd1, 0xd2, 0x6d, 0x6c, 0x1e, 0xcb, 0x0a, 0x8e, 0x71, 0x06, - 0x12, 0x3c, 0x62, 0xf7, 0x50, 0xac, 0x26, 0xb2, 0xa3, 0xaf, 0x60, 0x81, 0x86, 0xea, 0x2c, 0xcd, - 0x7e, 0xd5, 0x41, 0x68, 0x1f, 0xfe, 0x4f, 0x59, 0xb8, 0x9d, 0x8c, 0x1c, 0x77, 0x36, 0x7e, 0xeb, - 0x9e, 0x83, 0xec, 0xde, 0xf8, 0xf1, 0xd5, 0x46, 0xdb, 0x0b, 0x05, 0xec, 0xc4, 0x95, 0x4f, 0xdd, - 0x17, 0xab, 0xe7, 0x9e, 0xab, 0x0e, 0x28, 0x24, 0x6e, 0xd0, 0xb1, 0x3d, 0x91, 0xad, 0x77, 0xcf, - 0x5d, 0x5f, 0xe5, 0xd7, 0xc3, 0x9e, 0x70, 0x31, 0xea, 0x09, 0xbb, 0x80, 0xd4, 0x13, 0x65, 0xca, - 0x5e, 0x26, 0xfc, 0xd8, 0x9e, 0x65, 0xd6, 0x1f, 0x44, 0x26, 0x59, 0x6b, 0x56, 0x7b, 0x51, 0x36, - 0x21, 0xa6, 0x2b, 0x7a, 0x0c, 0x45, 0x4f, 0x0c, 0x2d, 0x7d, 0x60, 0x61, 0xd7, 0xc5, 0x45, 0x89, - 0x7c, 0x15, 0x16, 0xe8, 0x1d, 0x0c, 0x60, 0xe9, 0xb0, 0xdc, 0x19, 0x94, 0xdb, 0x5c, 0x0a, 0xad, - 0x41, 0x81, 0x8c, 0x21, 0x55, 0xdb, 0xad, 0x7a, 0xa7, 0xcf, 0xa5, 0x7d, 0x82, 0x58, 0x17, 0xde, - 0xd6, 0x05, 0x2e, 0x43, 0xae, 0xfb, 0x83, 0xce, 0x61, 0xb9, 0x53, 0x6e, 0xd4, 0x6b, 0x5c, 0x96, - 0xff, 0xbf, 0x2c, 0xa0, 0xf9, 0x59, 0x05, 0xd1, 0x7c, 0xcf, 0x30, 0xfd, 0x33, 0x2a, 0xa0, 0xa0, - 0x27, 0xb0, 0xc6, 0x6a, 0xfe, 0x76, 0x7b, 0x1f, 0x77, 0xcc, 0x90, 0x69, 0xb2, 0x0d, 0xcb, 0x16, - 0x8d, 0xea, 0xdc, 0x1d, 0x0f, 0x08, 0x68, 0x17, 0x38, 0xdd, 0xb0, 0xc9, 0xc5, 0xd2, 0x30, 0x35, - 0x5b, 0xa6, 0x8f, 0x24, 0x2c, 0xf0, 0x9a, 0xa3, 0xa3, 0x3d, 0x40, 0xaa, 0xd1, 0x31, 0xec, 0x8a, - 0xa6, 0xab, 0xc1, 0xb0, 0x4c, 0x16, 0x31, 0x2d, 0x24, 0x7a, 0x51, 0xe4, 0xf1, 0x78, 0x28, 0x2b, - 0xef, 0xdc, 0x44, 0x2f, 0x3b, 0x46, 0x66, 0xa8, 0xe8, 0x39, 0x2c, 0x99, 0xb2, 0x3e, 0xc2, 0x56, - 0x69, 0x99, 0x6a, 0xf1, 0xdd, 0x04, 0x91, 0x09, 0x84, 0x49, 0x70, 0x79, 0xd1, 0x01, 0x2c, 0x1b, - 0x53, 0xf6, 0xc6, 0xc4, 0xee, 0xa9, 0x9f, 0x5c, 0x22, 0xe9, 0xbd, 0x2e, 0x63, 0xaf, 0xeb, 0xb6, - 0x79, 0x2e, 0x78, 0x9d, 0x51, 0x15, 0x0a, 0xec, 0x21, 0xb5, 0x69, 0x58, 0xb6, 0x55, 0xca, 0x53, - 0xac, 0x47, 0x49, 0x58, 0x3e, 0xa7, 0x10, 0xee, 0xb5, 0xf3, 0x15, 0xac, 0x84, 0xd1, 0xc9, 0x49, - 0xfc, 0x0e, 0x9f, 0xbb, 0x72, 0x23, 0xc5, 0x68, 0x46, 0x24, 0xef, 0x66, 0x44, 0xbe, 0xca, 0xbc, - 0x4a, 0xf3, 0x06, 0xac, 0xcd, 0xac, 0x91, 0x46, 0x34, 0xa4, 0xd0, 0x36, 0xce, 0xfc, 0x0c, 0x69, - 0x88, 0xe2, 0xb7, 0x0f, 0xa6, 0x53, 0xec, 0x79, 0xc0, 0x10, 0xc5, 0x97, 0x39, 0x8d, 0x4e, 0xc3, - 0x32, 0x27, 0x04, 0xfe, 0x15, 0x6c, 0xc4, 0xad, 0x88, 0xde, 0x4a, 0x65, 0xc5, 0xbf, 0x95, 0xca, - 0x0a, 0x8d, 0xfa, 0xa6, 0x2e, 0x7e, 0x46, 0x9b, 0xf2, 0xcb, 0xb0, 0x58, 0x9f, 0x4c, 0xed, 0xf3, - 0xdd, 0x57, 0xa1, 0xef, 0x1a, 0xe6, 0x3f, 0x9f, 0x40, 0xcb, 0x90, 0xed, 0x94, 0x7b, 0x5c, 0x0a, - 0xe5, 0x60, 0xa1, 0x57, 0xee, 0x0c, 0xb8, 0x34, 0x5a, 0x82, 0x4c, 0xa3, 0xc3, 0x65, 0x76, 0x5f, - 0xc3, 0x66, 0x6c, 0x2e, 0x14, 0xad, 0x40, 0x4e, 0xac, 0x7f, 0x37, 0xa8, 0x77, 0xaa, 0x75, 0x2e, - 0x45, 0x10, 0xca, 0x9d, 0x1a, 0xeb, 0xd7, 0x25, 0x66, 0x83, 0x60, 0xb5, 0xfe, 0x7d, 0xb9, 0xda, - 0x97, 0x7c, 0xa6, 0xec, 0xee, 0xa7, 0xc0, 0xcd, 0xe6, 0x35, 0x09, 0xff, 0xc0, 0x1d, 0xb9, 0xd6, - 0x3d, 0xea, 0x70, 0x69, 0x02, 0xd5, 0x3d, 0x38, 0xe0, 0x32, 0xbb, 0x9f, 0x01, 0x04, 0x79, 0x4c, - 0x62, 0xb5, 0x42, 0x4b, 0x6c, 0x75, 0x1a, 0x2c, 0x45, 0x77, 0x50, 0x6e, 0xb7, 0x49, 0x85, 0xa6, - 0xe8, 0x2a, 0xdd, 0x7e, 0x93, 0xcb, 0xec, 0xfe, 0x57, 0x06, 0x96, 0xdd, 0xe4, 0x19, 0xca, 0xc3, - 0x62, 0x67, 0x70, 0x28, 0x3d, 0xe5, 0x52, 0x5e, 0x71, 0x9f, 0x4b, 0x7b, 0xc5, 0x67, 0x5c, 0xc6, - 0x2b, 0x3e, 0xe7, 0xb2, 0x5e, 0xf1, 0x0b, 0x6e, 0xc1, 0x2b, 0xbe, 0xe0, 0x16, 0xbd, 0xe2, 0x4b, - 0x6e, 0xc9, 0x2b, 0xbe, 0xe2, 0x96, 0xbd, 0xe2, 0x97, 0x5c, 0x8e, 0xcc, 0x88, 0x0e, 0xf1, 0x39, - 0x97, 0xf7, 0xcb, 0x4f, 0x39, 0xf0, 0xcb, 0xfb, 0x5c, 0xc1, 0x2f, 0x3f, 0xe3, 0x56, 0xfc, 0xf2, - 0x73, 0xae, 0xe8, 0x97, 0xbf, 0xe0, 0x56, 0xfd, 0xf2, 0x0b, 0x6e, 0xcd, 0x2f, 0xbf, 0xe4, 0x38, - 0xbf, 0xfc, 0x8a, 0x5b, 0xf7, 0xcb, 0x5f, 0x72, 0xc8, 0x2b, 0xef, 0x7f, 0xce, 0xdd, 0xf2, 0xcb, - 0x4f, 0xb9, 0x0d, 0xbf, 0xbc, 0xcf, 0x6d, 0xfa, 0xe5, 0x67, 0xdc, 0x96, 0x5f, 0x7e, 0xce, 0x6d, - 0xfb, 0xe5, 0x2f, 0xb8, 0x92, 0x5f, 0x7e, 0xc1, 0xdd, 0xf6, 0xcb, 0x2f, 0xb9, 0x1d, 0xbf, 0xfc, - 0x8a, 0xbb, 0xe3, 0x97, 0xbf, 0xe4, 0xee, 0x7a, 0xe5, 0x67, 0x9f, 0x73, 0xf7, 0x76, 0x3f, 0x85, - 0x95, 0x70, 0xe2, 0x91, 0x08, 0xad, 0xdd, 0x3d, 0x62, 0x72, 0x6c, 0xb6, 0x1a, 0x4d, 0x2e, 0x4d, - 0xd8, 0xfb, 0xdd, 0x46, 0xa3, 0x5d, 0xe7, 0x32, 0xbb, 0x35, 0x58, 0x9b, 0x49, 0xa7, 0x11, 0x19, - 0x0e, 0x3a, 0x6f, 0x3a, 0x44, 0xe6, 0x29, 0xa2, 0x05, 0xe5, 0x1e, 0x93, 0xbd, 0xd8, 0x2f, 0x73, - 0x19, 0x74, 0x0b, 0xd6, 0xc4, 0x7e, 0x59, 0x3a, 0x28, 0xb7, 0xda, 0xdd, 0xb7, 0x75, 0x41, 0x2a, - 0xf7, 0xb8, 0xec, 0x6e, 0x0d, 0x8a, 0x91, 0xac, 0x12, 0xda, 0x84, 0x75, 0xc2, 0xd5, 0xe9, 0xf6, - 0xa5, 0x6a, 0xb7, 0xd3, 0xa9, 0x57, 0xfb, 0xf5, 0x1a, 0x13, 0x78, 0xb9, 0x27, 0x0d, 0x08, 0xe0, - 0x3a, 0x14, 0x09, 0x47, 0xd0, 0x9a, 0xd9, 0xfd, 0x90, 0xe5, 0x16, 0xbd, 0xe4, 0x1c, 0x51, 0xe4, - 0xa3, 0x5e, 0x79, 0x5f, 0xea, 0x89, 0x6f, 0xd8, 0xfc, 0xbb, 0xbd, 0x7a, 0x87, 0x4b, 0xef, 0xfe, - 0x15, 0x70, 0xb3, 0xf7, 0x65, 0x32, 0xbf, 0xfe, 0x21, 0x51, 0x57, 0x0e, 0x56, 0x2a, 0x65, 0xb1, - 0x29, 0x89, 0x55, 0xa1, 0xd5, 0xeb, 0x8b, 0xec, 0xe0, 0x20, 0x51, 0xad, 0x47, 0xc8, 0xec, 0xff, - 0xe7, 0x3e, 0x2c, 0xf5, 0x9e, 0x1f, 0x75, 0x7a, 0x4f, 0xd1, 0x31, 0x3c, 0x6a, 0x60, 0xfb, 0x92, - 0xaf, 0x3d, 0x50, 0xf4, 0x78, 0x26, 0x76, 0xbb, 0x73, 0x9d, 0xef, 0xc3, 0xf8, 0x14, 0xfa, 0x53, - 0x1a, 0x1e, 0xb3, 0x18, 0xe4, 0x92, 0xb1, 0xae, 0x83, 0x7b, 0xdd, 0x49, 0xbc, 0x85, 0xdb, 0xe1, - 0xc5, 0x46, 0x3f, 0x38, 0x8b, 0x5b, 0xe4, 0x55, 0xbe, 0x63, 0xe3, 0x53, 0xe8, 0x07, 0xb8, 0x3b, - 0xb3, 0xb6, 0x28, 0xf4, 0x55, 0x60, 0xae, 0x3a, 0xd6, 0xf7, 0xb0, 0x23, 0x86, 0xd6, 0x30, 0xf3, - 0x1d, 0xdc, 0xe3, 0xab, 0x7c, 0x97, 0xb6, 0x13, 0xb3, 0x54, 0x3e, 0x85, 0x7e, 0x07, 0xdb, 0x33, - 0xab, 0x08, 0x62, 0x88, 0x8b, 0x3f, 0x2c, 0xdc, 0xb9, 0xa4, 0x9d, 0x4f, 0xa1, 0xdf, 0xc3, 0x16, - 0x89, 0x7a, 0xf1, 0x3c, 0xf6, 0x27, 0xf1, 0x7d, 0xe3, 0x43, 0xe6, 0x84, 0xa9, 0xff, 0x16, 0x76, - 0x1a, 0xd8, 0xa6, 0x03, 0xa8, 0xf3, 0x23, 0x44, 0xb3, 0xbf, 0x91, 0xe4, 0xe8, 0x15, 0x66, 0xfe, - 0xd7, 0x70, 0xcf, 0x7d, 0xc4, 0xf9, 0x59, 0xe0, 0xbf, 0x23, 0xf0, 0x63, 0xcc, 0xbe, 0x3d, 0xbd, - 0x2e, 0x7c, 0xfc, 0x6e, 0x08, 0x70, 0x9f, 0x82, 0x79, 0x31, 0xff, 0x4f, 0x81, 0xd9, 0x87, 0x3b, - 0x6d, 0xcd, 0x4a, 0xdc, 0xe2, 0x38, 0xe3, 0x79, 0x90, 0x3c, 0x08, 0xcb, 0x3b, 0xa7, 0xd0, 0x21, - 0x94, 0x1a, 0xd8, 0xf6, 0xe6, 0x19, 0xb9, 0x6d, 0xc5, 0x42, 0x5e, 0x94, 0xfc, 0xe0, 0x53, 0xa8, - 0x09, 0xb7, 0x18, 0xd6, 0x7b, 0x23, 0x1d, 0xc0, 0x7a, 0x03, 0xdb, 0x33, 0x09, 0x94, 0x1b, 0xe0, - 0x74, 0x61, 0x5d, 0x9c, 0xc3, 0xb9, 0xa8, 0xcf, 0x65, 0x80, 0xbf, 0x86, 0xd5, 0x06, 0xb6, 0xc3, - 0x49, 0xa8, 0xb8, 0x59, 0x95, 0x22, 0xb4, 0x10, 0x37, 0x43, 0x10, 0xa3, 0x08, 0x89, 0xdc, 0x09, - 0xba, 0x50, 0x83, 0x95, 0x43, 0xc3, 0xd1, 0xed, 0xc1, 0xa1, 0x48, 0x23, 0xff, 0x4b, 0x12, 0x06, - 0x09, 0x28, 0x3d, 0xe0, 0xa8, 0x36, 0x0d, 0xc4, 0x4a, 0xf0, 0xf5, 0x5c, 0x84, 0x33, 0x31, 0x75, - 0x96, 0x80, 0xf8, 0x1d, 0x6c, 0xf8, 0x5e, 0x20, 0x8c, 0x7a, 0x91, 0xb6, 0x5f, 0xb2, 0xdd, 0x7d, - 0xcf, 0x27, 0xfe, 0xa4, 0xa8, 0x6f, 0x08, 0x6a, 0x60, 0xf3, 0x57, 0x45, 0x8d, 0x5f, 0x75, 0x1b, - 0x4a, 0x11, 0x6b, 0x7f, 0x3f, 0xb4, 0x0e, 0x6c, 0x06, 0x76, 0x1e, 0x86, 0xba, 0xb1, 0x85, 0xaf, - 0xb0, 0x4c, 0xb0, 0x7b, 0x43, 0xbb, 0x17, 0x9f, 0xa1, 0x75, 0xe5, 0xbc, 0x73, 0x37, 0xa9, 0xd9, - 0x72, 0xc6, 0x36, 0x85, 0x5b, 0x0b, 0xc3, 0xbd, 0x36, 0x86, 0x97, 0x21, 0x26, 0xa7, 0x84, 0xa9, - 0xa7, 0xdc, 0x6c, 0xb6, 0x6a, 0x44, 0x69, 0xfc, 0x3c, 0x31, 0xcb, 0x2a, 0x27, 0xf7, 0xba, 0x74, - 0x8a, 0x75, 0x40, 0xcd, 0x56, 0xad, 0x2a, 0xeb, 0x0a, 0x1e, 0x07, 0xb3, 0xbc, 0x00, 0x30, 0x49, - 0x10, 0xdb, 0x6c, 0x6a, 0x6e, 0x16, 0xdd, 0xe7, 0x8f, 0x17, 0xc5, 0xbd, 0x44, 0x7c, 0x22, 0x4e, - 0x3e, 0x85, 0x2a, 0xb0, 0xe5, 0x4f, 0xab, 0x3c, 0x1e, 0x5f, 0x02, 0x97, 0x14, 0x21, 0x6c, 0x46, - 0xe6, 0xe4, 0x65, 0xf6, 0x2f, 0x5a, 0xdd, 0x07, 0xb3, 0x4d, 0xb1, 0xaf, 0x02, 0x74, 0x82, 0x85, - 0x03, 0xd1, 0x7f, 0x35, 0x9a, 0x11, 0xeb, 0xec, 0x6b, 0x52, 0xc2, 0x04, 0xdf, 0x00, 0x1c, 0x88, - 0xde, 0x03, 0x16, 0x8a, 0x4a, 0x6a, 0xe6, 0x95, 0x6d, 0x66, 0xc7, 0x66, 0x5f, 0xbd, 0xa8, 0x04, - 0x8a, 0x07, 0x62, 0x03, 0xdb, 0xde, 0x5b, 0xcf, 0x0c, 0xde, 0xcc, 0x4b, 0xd1, 0x0c, 0xde, 0xec, - 0x03, 0x11, 0x9f, 0x42, 0x7f, 0x80, 0xcd, 0x03, 0xb1, 0x6a, 0x62, 0xd9, 0xc6, 0x91, 0xb7, 0x42, - 0x34, 0xf3, 0xe9, 0x63, 0xcc, 0x4b, 0xe5, 0x0e, 0x7f, 0x11, 0x8b, 0x3f, 0xc2, 0xaf, 0xa1, 0x40, - 0x5f, 0x3f, 0xdb, 0x34, 0x71, 0x33, 0x23, 0x95, 0xf0, 0x13, 0xef, 0xec, 0xf6, 0x91, 0x26, 0x3e, - 0xf5, 0x79, 0x1a, 0x35, 0xa0, 0x50, 0x57, 0x4e, 0xfc, 0xd7, 0xaf, 0x8b, 0xfc, 0xc7, 0x05, 0x6d, - 0x7c, 0x0a, 0xb5, 0x00, 0x31, 0x87, 0x14, 0xf9, 0x58, 0x22, 0xf9, 0x79, 0x7c, 0x67, 0x2b, 0xfe, - 0x89, 0x9e, 0x4f, 0xa1, 0xaf, 0x61, 0xa5, 0x81, 0xed, 0xe0, 0x69, 0x3f, 0x4e, 0x5f, 0x93, 0x7b, - 0x1f, 0xc0, 0x16, 0xdb, 0x0e, 0x9f, 0x58, 0x3d, 0x61, 0x69, 0x9f, 0xeb, 0xe1, 0x08, 0xb0, 0x4e, - 0x9d, 0xe2, 0x91, 0x76, 0x1c, 0xac, 0xe7, 0x97, 0x33, 0xec, 0x49, 0x5f, 0xa4, 0x24, 0x1e, 0x81, - 0x9b, 0xfe, 0x81, 0x15, 0xc1, 0xbd, 0x68, 0xdf, 0x93, 0xf7, 0x90, 0x22, 0x96, 0xc2, 0xe7, 0xd5, - 0x95, 0x41, 0x93, 0xd7, 0xdd, 0x26, 0x88, 0xc1, 0x59, 0x75, 0x65, 0xc4, 0xf8, 0x15, 0x1f, 0xc2, - 0xed, 0xc8, 0x61, 0xf5, 0x9e, 0x70, 0x5d, 0x26, 0xdc, 0x98, 0xa9, 0xdd, 0xf0, 0xb8, 0x92, 0xe0, - 0x01, 0x9b, 0x5a, 0x72, 0x36, 0xfb, 0x8a, 0x99, 0xf1, 0x84, 0x19, 0x1b, 0xf0, 0xcb, 0x06, 0xb6, - 0xcb, 0xe3, 0xf1, 0xe5, 0x09, 0xf9, 0xb8, 0x25, 0xec, 0x45, 0xb3, 0x89, 0x97, 0x61, 0xf0, 0x29, - 0x34, 0x86, 0xc7, 0xa1, 0x10, 0x3b, 0x79, 0xb4, 0x8b, 0x36, 0xff, 0x8a, 0x4b, 0xe6, 0x53, 0x48, - 0x71, 0xaf, 0x1e, 0xc9, 0xe3, 0xc4, 0xa7, 0xfa, 0xaf, 0x65, 0x36, 0x3f, 0x00, 0xef, 0x9b, 0xcd, - 0xcf, 0xbd, 0xa0, 0xdf, 0xc0, 0x07, 0x61, 0x83, 0xba, 0xd9, 0x70, 0xf1, 0xcb, 0xa0, 0xd0, 0x81, - 0x65, 0xfd, 0x94, 0xd0, 0xbf, 0x87, 0x5f, 0x04, 0x76, 0x71, 0x3d, 0x0d, 0xbb, 0x82, 0x91, 0x08, - 0x70, 0x27, 0xa4, 0x52, 0x73, 0xbf, 0xdc, 0xb8, 0x3c, 0x3c, 0x99, 0xed, 0x42, 0x0d, 0xcf, 0xbd, - 0x65, 0xcf, 0xb6, 0x09, 0x78, 0x3a, 0x96, 0x95, 0xd9, 0x78, 0x60, 0x96, 0xeb, 0xf2, 0x01, 0x7e, - 0x07, 0xb7, 0xe3, 0x07, 0x28, 0xab, 0xea, 0x7b, 0x83, 0xff, 0x8d, 0x97, 0x00, 0x9a, 0x9f, 0xfd, - 0xc4, 0x38, 0x7d, 0xff, 0xc9, 0x47, 0x6e, 0xdf, 0xb3, 0xed, 0x37, 0x96, 0x63, 0x1b, 0x36, 0x29, - 0xe2, 0x9c, 0x04, 0x2f, 0x99, 0x6e, 0xbc, 0xce, 0x0d, 0xe1, 0x17, 0x61, 0x4b, 0x49, 0x92, 0xe3, - 0x45, 0xca, 0x7c, 0x85, 0x7d, 0x7e, 0x70, 0xd1, 0x18, 0x44, 0x94, 0xef, 0x85, 0xdf, 0x23, 0x72, - 0x0c, 0x4c, 0x72, 0x6e, 0x63, 0xae, 0x6f, 0x89, 0xdf, 0xc1, 0xf6, 0x91, 0xac, 0xd9, 0x71, 0xdf, - 0x9a, 0x5f, 0xfa, 0xeb, 0x8d, 0x04, 0xc8, 0x16, 0xdc, 0x3a, 0xd0, 0x4c, 0x3c, 0xf7, 0x19, 0xed, - 0x45, 0x1f, 0xfa, 0x27, 0x42, 0x6d, 0xb0, 0xfd, 0x9c, 0xf9, 0xa9, 0xf8, 0x45, 0xbf, 0x64, 0x4e, - 0x80, 0x7a, 0x0b, 0xb7, 0xe8, 0xa6, 0xcd, 0x20, 0x7d, 0x34, 0x13, 0x65, 0x27, 0xff, 0xe8, 0x3a, - 0x31, 0xf1, 0xb4, 0xed, 0x3b, 0xfb, 0x19, 0xec, 0xab, 0xdf, 0xc0, 0xa3, 0x1d, 0xf9, 0x14, 0x3a, - 0x82, 0x9d, 0xb0, 0x22, 0xfd, 0x74, 0xc0, 0x1d, 0x02, 0x1c, 0x68, 0xd0, 0x35, 0x80, 0x93, 0xf4, - 0xa7, 0x14, 0x58, 0xfe, 0x0c, 0xda, 0x0d, 0xcd, 0xfe, 0x6b, 0xc8, 0xd5, 0x2a, 0x15, 0x59, 0x79, - 0xe7, 0x4c, 0x6f, 0x30, 0xa1, 0x6f, 0x20, 0x5f, 0xab, 0x08, 0xd8, 0x22, 0x13, 0xba, 0x51, 0x00, - 0xb8, 0x11, 0xac, 0xc7, 0xbf, 0x28, 0xde, 0xd8, 0x85, 0x45, 0xd2, 0x15, 0xc1, 0xaf, 0x06, 0xde, - 0xc3, 0x25, 0xde, 0x0a, 0xf0, 0xbc, 0x5d, 0xba, 0x29, 0xda, 0x70, 0x89, 0xfe, 0x31, 0xc3, 0xb3, - 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x96, 0xc4, 0xbb, 0x95, 0xa6, 0x41, 0x00, 0x00, + // 4874 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x7c, 0xc9, 0x73, 0x23, 0x47, + 0x76, 0x37, 0x16, 0x2e, 0xc0, 0x03, 0x41, 0x16, 0xb3, 0x9b, 0x24, 0x9a, 0xbd, 0xd7, 0xb4, 0x34, + 0x2d, 0x4a, 0xa2, 0x46, 0x54, 0x4f, 0x4b, 0xa3, 0x91, 0x3e, 0x0d, 0x36, 0x02, 0xe8, 0x06, 0x01, + 0xa8, 0x0a, 0x68, 0x6a, 0xb6, 0xaf, 0xa6, 0x50, 0x95, 0x04, 0x4b, 0x0d, 0x54, 0xc1, 0xb5, 0x90, + 0xa2, 0x1d, 0x31, 0x11, 0x9e, 0x08, 0x47, 0xf8, 0xe0, 0xbb, 0x0f, 0xbe, 0xfa, 0x6a, 0x47, 0xf8, + 0xe0, 0x3f, 0xca, 0x97, 0xb9, 0xf9, 0xe2, 0x8b, 0x1d, 0x99, 0x59, 0x3b, 0xaa, 0xb8, 0xb5, 0x74, + 0xab, 0x7c, 0xf9, 0xf2, 0x97, 0x2f, 0xdf, 0x96, 0x99, 0x2f, 0x41, 0x02, 0x4c, 0xcc, 0xb9, 0xb2, + 0x3f, 0x37, 0x0d, 0xdb, 0x40, 0xa5, 0xc1, 0x8b, 0x73, 0x7d, 0xf0, 0xa9, 0x44, 0x48, 0xfc, 0xbf, + 0xe4, 0x60, 0xfd, 0x48, 0xb6, 0x6c, 0x6c, 0x0e, 0xf1, 0x6c, 0x3e, 0x95, 0x6d, 0x8c, 0x5e, 0xc2, + 0x8e, 0xed, 0x7e, 0x4b, 0xba, 0x3c, 0xc3, 0xd2, 0x78, 0xea, 0x60, 0xdb, 0x30, 0xec, 0xd3, 0x4a, + 0xf6, 0x49, 0xf6, 0x79, 0x51, 0xd8, 0xf2, 0xba, 0x7b, 0xf2, 0x0c, 0xd7, 0xbc, 0x4e, 0xb4, 0x07, + 0x9b, 0xd1, 0x71, 0x8e, 0x35, 0xae, 0xe4, 0xe8, 0x88, 0x8d, 0xf0, 0x88, 0x91, 0x35, 0x46, 0x1f, + 0x01, 0x8a, 0xf2, 0x9e, 0x6b, 0x27, 0x5a, 0x25, 0x4f, 0x99, 0xb9, 0x30, 0xf3, 0xb1, 0x76, 0xa2, + 0xa1, 0x2a, 0x3c, 0x8c, 0x72, 0xdb, 0xa6, 0x36, 0x99, 0x60, 0x53, 0x92, 0x15, 0x5b, 0x33, 0x74, + 0xab, 0xb2, 0x44, 0x07, 0xee, 0x86, 0x07, 0x0e, 0x19, 0x4b, 0x95, 0x71, 0xa0, 0x17, 0xb0, 0x1d, + 0x81, 0xb0, 0x24, 0x1d, 0xdb, 0xe7, 0x86, 0xf9, 0xb6, 0xb2, 0xfc, 0x24, 0xff, 0xbc, 0x28, 0xdc, + 0x0d, 0x8f, 0xb5, 0x7a, 0xac, 0x8f, 0xff, 0x3b, 0x78, 0x20, 0xe0, 0xbf, 0x71, 0xb0, 0x65, 0x47, + 0x75, 0x24, 0xda, 0x86, 0x29, 0x4f, 0x30, 0xe2, 0x61, 0x6d, 0x18, 0x1a, 0xe7, 0xea, 0x27, 0x42, + 0x43, 0x9f, 0x43, 0xc1, 0xc3, 0xa6, 0xda, 0x28, 0x1d, 0xdc, 0xdf, 0x0f, 0x59, 0x60, 0x3f, 0x8a, + 0x2c, 0xf8, 0xcc, 0xfc, 0xdf, 0x67, 0xe1, 0xb1, 0xaf, 0x5d, 0x57, 0x0c, 0x11, 0xdb, 0xb6, 0xa6, + 0x4f, 0xac, 0x9b, 0x08, 0xf0, 0x25, 0x14, 0x2c, 0x77, 0x98, 0x2b, 0xc0, 0xa3, 0x88, 0x00, 0xfe, + 0x1c, 0x1e, 0xb8, 0xe0, 0xf3, 0xf3, 0xff, 0x90, 0x85, 0xcd, 0x85, 0x7e, 0xf4, 0x6b, 0xc8, 0x29, + 0x1a, 0x9d, 0xab, 0x74, 0xf0, 0x61, 0x32, 0x56, 0xdd, 0xd0, 0x6d, 0xd3, 0x98, 0x4e, 0xb1, 0xd9, + 0xd1, 0x4f, 0x0c, 0x73, 0x26, 0x13, 0x33, 0x08, 0x39, 0x45, 0x43, 0x9f, 0x41, 0x4e, 0xf6, 0x04, + 0xf9, 0x59, 0xf2, 0xe0, 0xea, 0x04, 0xeb, 0xfe, 0x52, 0x85, 0x9c, 0x6c, 0xf1, 0x7b, 0xb0, 0x9d, + 0xdc, 0x8b, 0x38, 0xc8, 0xcf, 0x35, 0xdd, 0x5d, 0x38, 0xf9, 0xe4, 0xff, 0x27, 0x0b, 0x3b, 0x3e, + 0xb3, 0x6b, 0x49, 0x11, 0x9b, 0x67, 0x9a, 0x82, 0x89, 0x1b, 0x98, 0x78, 0xa2, 0x11, 0x8d, 0x4b, + 0x86, 0x29, 0x39, 0xba, 0xd7, 0xa2, 0x00, 0x05, 0xe1, 0xae, 0xd7, 0xee, 0x9b, 0x23, 0xbf, 0x8f, + 0x78, 0xb6, 0x85, 0xcd, 0x33, 0x36, 0x46, 0x31, 0x74, 0x1d, 0x2b, 0x36, 0x5d, 0x41, 0x41, 0xd8, + 0x60, 0x1d, 0x7d, 0xb3, 0xce, 0xc8, 0xe8, 0x2b, 0x58, 0xb2, 0x2f, 0xe6, 0x98, 0xfa, 0xf2, 0xfa, + 0xc1, 0xf3, 0xe4, 0x05, 0x46, 0xa5, 0x1a, 0x5e, 0xcc, 0xb1, 0x40, 0x47, 0xa1, 0x47, 0x50, 0x9a, + 0xc9, 0x0a, 0x99, 0x86, 0x38, 0xa9, 0xeb, 0xd7, 0xc5, 0x99, 0xac, 0xf4, 0x4d, 0x6a, 0xcb, 0xc7, + 0x50, 0x1a, 0x9b, 0x9a, 0x3a, 0x61, 0x4e, 0x5c, 0x59, 0xa6, 0xfd, 0xc0, 0x48, 0x84, 0x81, 0xff, + 0xaf, 0x25, 0xb8, 0x9f, 0x60, 0x04, 0x5f, 0x5d, 0x15, 0x58, 0x9d, 0x1b, 0xe7, 0xd8, 0xc4, 0xaa, + 0xbb, 0x62, 0xaf, 0x89, 0x9e, 0x40, 0xc9, 0x5d, 0x9a, 0x3c, 0x9e, 0x62, 0x77, 0x79, 0x61, 0x12, + 0xfa, 0x00, 0xb8, 0x13, 0xd9, 0xb2, 0xa5, 0x30, 0x5b, 0x9e, 0x69, 0x81, 0xd0, 0xeb, 0x21, 0x56, + 0x1e, 0xd6, 0x54, 0xcd, 0x52, 0x8c, 0x33, 0x6c, 0x52, 0xb6, 0x25, 0xca, 0x16, 0xa1, 0xa1, 0x5d, + 0x28, 0x8c, 0x0d, 0x5d, 0xa5, 0xfd, 0xcb, 0xb4, 0xdf, 0x6f, 0xa3, 0x7d, 0xb8, 0x33, 0xd5, 0xf4, + 0xb7, 0xd2, 0x14, 0x9f, 0xe1, 0xa9, 0x64, 0x61, 0xc5, 0x31, 0x35, 0xfb, 0xa2, 0xb2, 0x42, 0xd9, + 0x36, 0x49, 0x57, 0x97, 0xf4, 0x88, 0x6e, 0x07, 0x3a, 0x80, 0x2d, 0xca, 0x84, 0x25, 0x4b, 0x9b, + 0xcd, 0xa7, 0x58, 0x9a, 0xcb, 0x9a, 0xa9, 0xe9, 0x93, 0xca, 0x2a, 0x1d, 0x71, 0x87, 0x75, 0x8a, + 0xb4, 0x6f, 0xc0, 0xba, 0xd0, 0x16, 0xac, 0x8c, 0x4d, 0x09, 0xab, 0x66, 0xa5, 0x40, 0x99, 0x96, + 0xc7, 0x66, 0x53, 0x35, 0xd1, 0x43, 0x80, 0x53, 0x6d, 0x72, 0x2a, 0x59, 0x73, 0x8c, 0xd5, 0x4a, + 0x91, 0x76, 0x15, 0x09, 0x45, 0x24, 0x04, 0xd2, 0x3d, 0x35, 0xce, 0x25, 0xac, 0x63, 0x73, 0x72, + 0x51, 0x01, 0xd6, 0x3d, 0x35, 0xce, 0x9b, 0x94, 0x40, 0xb4, 0x28, 0xab, 0x67, 0xd8, 0xb4, 0x35, + 0x8b, 0x4c, 0x5f, 0x62, 0x5a, 0x0c, 0x91, 0xd0, 0xc7, 0x80, 0x5c, 0x51, 0x5d, 0x3d, 0xd2, 0x0c, + 0xb6, 0xc6, 0x56, 0xc6, 0x7a, 0xea, 0x41, 0x07, 0x99, 0x4f, 0xc5, 0x63, 0x67, 0x22, 0xbd, 0xc5, + 0x17, 0x56, 0xa5, 0xcc, 0xe6, 0xa3, 0x94, 0xd7, 0xf8, 0x82, 0xd9, 0xd3, 0xd4, 0xce, 0x64, 0xe5, + 0xa2, 0xb2, 0xee, 0xda, 0x93, 0x35, 0xd1, 0xaf, 0xa0, 0xa2, 0xf8, 0xf6, 0x27, 0x73, 0x9d, 0x68, + 0x13, 0xc7, 0xa4, 0x71, 0x58, 0xd9, 0xa0, 0xac, 0x3b, 0x41, 0x7f, 0x3d, 0xdc, 0x8d, 0xde, 0x83, + 0x75, 0xcb, 0x96, 0x6d, 0x4d, 0x91, 0x64, 0x55, 0x35, 0xb1, 0x65, 0x55, 0x38, 0x3a, 0xa0, 0xcc, + 0xa8, 0x55, 0x46, 0xe4, 0xff, 0xba, 0x04, 0x8f, 0x2e, 0x0f, 0x78, 0x22, 0x9e, 0x07, 0x41, 0xdc, + 0x6d, 0x4d, 0xf0, 0x9a, 0xe8, 0x43, 0xd8, 0xf4, 0xf7, 0x15, 0xe9, 0x0c, 0x9b, 0x16, 0x91, 0x8b, + 0x38, 0x5d, 0x59, 0xe0, 0xfc, 0x8e, 0x37, 0x8c, 0x4e, 0xdc, 0x69, 0x26, 0xeb, 0xce, 0x89, 0xac, + 0xd8, 0x8e, 0x89, 0x4d, 0xea, 0x75, 0x65, 0x21, 0x42, 0x43, 0xc7, 0x80, 0x2c, 0x67, 0x3e, 0x37, + 0x4c, 0x1b, 0xab, 0x92, 0x9f, 0xf0, 0x96, 0x68, 0x9e, 0x79, 0x7e, 0x55, 0x92, 0xf2, 0x93, 0xcd, + 0xa6, 0x8f, 0xe1, 0x87, 0x8c, 0x08, 0x9c, 0xe2, 0x98, 0x26, 0xd6, 0xed, 0x00, 0x76, 0xf9, 0x86, + 0xb0, 0x1b, 0x2e, 0x82, 0x0f, 0xfa, 0x3e, 0x6c, 0x28, 0x53, 0xd9, 0xb2, 0x24, 0xe3, 0x44, 0x52, + 0x31, 0xc9, 0x02, 0xd4, 0xb9, 0xd7, 0x84, 0x32, 0x25, 0xf7, 0x4f, 0x1a, 0x94, 0x88, 0x10, 0x2c, + 0xd1, 0x48, 0x5f, 0xa5, 0x91, 0x4e, 0xbf, 0x89, 0x4b, 0x58, 0xa7, 0x86, 0x69, 0xb3, 0x1c, 0x50, + 0x60, 0x39, 0x82, 0x52, 0x68, 0x8e, 0x78, 0x0a, 0x6b, 0x9a, 0x25, 0xc9, 0x67, 0xb2, 0x36, 0xa5, + 0xb1, 0xc5, 0x5c, 0xb8, 0xa4, 0x59, 0x55, 0x8f, 0x84, 0x7e, 0x0d, 0xbb, 0x16, 0xcb, 0x3d, 0xde, + 0x36, 0x28, 0xb9, 0x09, 0x4e, 0x97, 0xe7, 0xae, 0x53, 0xef, 0xb8, 0x1c, 0xa1, 0x5c, 0x85, 0xcd, + 0x9e, 0x3c, 0x47, 0x5f, 0xc3, 0xfd, 0x94, 0xc1, 0x73, 0x59, 0x77, 0x5c, 0x97, 0xaf, 0x24, 0x8d, + 0x1e, 0xc8, 0xba, 0x83, 0x7e, 0x05, 0xf7, 0x52, 0x86, 0x4f, 0x74, 0x37, 0x0c, 0xb6, 0x93, 0x06, + 0xb7, 0x74, 0xfe, 0x7b, 0xe0, 0x22, 0xdb, 0xba, 0x88, 0x6d, 0x54, 0x83, 0xf5, 0xe8, 0x56, 0x5f, + 0xc9, 0x3e, 0xc9, 0x3f, 0x2f, 0x1d, 0xec, 0x46, 0x6c, 0x13, 0x61, 0x11, 0x62, 0x23, 0x88, 0x92, + 0xe9, 0xee, 0xc9, 0x0e, 0x2b, 0xf4, 0x9b, 0xff, 0x37, 0x80, 0x72, 0x84, 0x0d, 0xad, 0x43, 0x4e, + 0x63, 0x59, 0xb3, 0x2c, 0xe4, 0x34, 0x95, 0xf8, 0xb6, 0xa1, 0x63, 0xf1, 0xd4, 0xf0, 0xf6, 0x02, + 0xaf, 0x49, 0x32, 0x9b, 0x66, 0x91, 0x51, 0x67, 0x5e, 0x82, 0xf4, 0xdb, 0xe8, 0x01, 0x14, 0xb5, + 0xd9, 0xcc, 0xb1, 0x43, 0x69, 0x31, 0x20, 0xa0, 0x2e, 0xac, 0xbb, 0x6b, 0x17, 0x6d, 0x99, 0x78, + 0xa1, 0xeb, 0x69, 0x7c, 0xd2, 0x6a, 0xc4, 0x08, 0x67, 0x3b, 0x23, 0xc4, 0xc6, 0xa2, 0xef, 0x00, + 0x39, 0xd6, 0xb8, 0x25, 0xab, 0x13, 0xec, 0x65, 0x67, 0xac, 0x52, 0x3f, 0x2b, 0x1d, 0xbc, 0x9f, + 0x84, 0x38, 0x12, 0x6b, 0x31, 0xee, 0x76, 0x46, 0x48, 0xc0, 0x40, 0x32, 0x6c, 0xf9, 0xd4, 0x06, + 0x49, 0xea, 0x1e, 0xf8, 0x2a, 0x05, 0xff, 0xe0, 0x52, 0xf0, 0xf0, 0x80, 0x76, 0x46, 0x48, 0x46, + 0x42, 0x1d, 0x28, 0x93, 0x43, 0x61, 0x75, 0xe0, 0x69, 0xa2, 0x40, 0xa1, 0x9f, 0x26, 0x41, 0x1f, + 0x87, 0x19, 0xdb, 0x19, 0x21, 0x3a, 0x92, 0xe8, 0x81, 0x10, 0x7c, 0xf1, 0xab, 0x96, 0x68, 0xcb, + 0x34, 0x2e, 0x52, 0xf4, 0x70, 0xbc, 0xc0, 0x4d, 0xf4, 0xb0, 0x88, 0x41, 0xcf, 0x56, 0xd6, 0x69, + 0xd7, 0x98, 0x68, 0x3a, 0x0d, 0x9b, 0xd2, 0xc1, 0x83, 0x44, 0x4b, 0x89, 0x6d, 0xca, 0xd3, 0xce, + 0x08, 0x3e, 0x3f, 0x12, 0x80, 0x53, 0x4f, 0x95, 0x79, 0x17, 0xcb, 0x16, 0x6e, 0x99, 0xb2, 0x4e, + 0xd6, 0x58, 0xa2, 0x18, 0xcf, 0x92, 0x30, 0x1a, 0xed, 0xfa, 0x20, 0xcc, 0xdb, 0xce, 0x08, 0x0b, + 0xe3, 0xd1, 0x21, 0xac, 0x4d, 0x4c, 0xc3, 0x99, 0x0b, 0x58, 0xc1, 0xc4, 0xfb, 0xd6, 0x28, 0xde, + 0x93, 0x24, 0xbc, 0x56, 0x88, 0xaf, 0x9d, 0x11, 0x22, 0xe3, 0xd0, 0x08, 0x36, 0xc3, 0xed, 0x23, + 0x67, 0x6a, 0x6b, 0x74, 0xf3, 0x29, 0x1d, 0xbc, 0x77, 0x15, 0x18, 0x65, 0x6e, 0x67, 0x84, 0x45, + 0x04, 0xf4, 0x02, 0x56, 0x26, 0x73, 0xcd, 0xe8, 0xe8, 0x74, 0xb3, 0x4a, 0x09, 0xd2, 0xd6, 0xa0, + 0xd3, 0xef, 0x10, 0x55, 0xb9, 0xbc, 0xa8, 0x01, 0x30, 0x96, 0xad, 0x53, 0x51, 0x31, 0xb5, 0xb9, + 0x4d, 0xf7, 0xae, 0x78, 0x40, 0xb8, 0xe9, 0x80, 0x98, 0xbb, 0xe6, 0x73, 0xb6, 0xb3, 0x42, 0x68, + 0x1c, 0xaa, 0x42, 0xf1, 0x54, 0x53, 0x5d, 0x10, 0x2e, 0xc1, 0x97, 0x42, 0x20, 0xed, 0x4e, 0xc3, + 0xc7, 0x08, 0x46, 0x21, 0x05, 0xb6, 0x55, 0x3c, 0x9f, 0x1a, 0x17, 0x5e, 0x1a, 0xf7, 0xce, 0xd9, + 0x95, 0xcd, 0x04, 0xb7, 0x67, 0x78, 0x8d, 0xc4, 0x01, 0xed, 0xac, 0x90, 0x02, 0x85, 0xf6, 0x20, + 0x3f, 0x35, 0x26, 0x15, 0x44, 0x11, 0xb7, 0x13, 0x10, 0xbb, 0xc6, 0xa4, 0x9d, 0x15, 0x08, 0x13, + 0x7a, 0x09, 0xab, 0x44, 0x47, 0x7d, 0xc7, 0xae, 0xdc, 0x49, 0x50, 0x28, 0xe3, 0x27, 0xfa, 0xec, + 0x3b, 0x64, 0x29, 0x1e, 0x33, 0xfa, 0x0a, 0x8a, 0xd4, 0x38, 0x22, 0xd6, 0xd5, 0xca, 0xdd, 0x04, + 0xbf, 0x75, 0x47, 0x7a, 0x3c, 0x44, 0x0d, 0xfe, 0x80, 0x5a, 0x11, 0x56, 0x5d, 0x53, 0xd5, 0x0a, + 0xb0, 0xc2, 0x58, 0xf9, 0x1d, 0xd8, 0x4a, 0x4c, 0x4b, 0xfc, 0x7d, 0xb8, 0x97, 0x9a, 0x5d, 0xf8, + 0x47, 0xf0, 0xe0, 0xb2, 0xec, 0xc0, 0x6f, 0xc3, 0xdd, 0xa4, 0x10, 0x0f, 0x81, 0x2e, 0x86, 0x2a, + 0xff, 0x09, 0x6c, 0xc4, 0xe2, 0x8e, 0x64, 0xdd, 0x29, 0xf9, 0x18, 0x59, 0xee, 0x51, 0xbf, 0x28, + 0x04, 0x04, 0xfe, 0x1e, 0xec, 0xa4, 0x04, 0x19, 0xdf, 0x81, 0x3b, 0x09, 0x2e, 0x4e, 0xf0, 0xa8, + 0x3e, 0x42, 0x97, 0xae, 0x80, 0x80, 0xee, 0xc2, 0xf2, 0x99, 0x3c, 0x75, 0xd8, 0x86, 0xb2, 0x2c, + 0xb0, 0x06, 0xff, 0x8f, 0x59, 0xa8, 0xa4, 0x85, 0xcb, 0x15, 0x80, 0xdb, 0xb0, 0x42, 0x31, 0xac, + 0x4a, 0xfe, 0x49, 0xfe, 0xf9, 0xb2, 0xe0, 0xb6, 0xd0, 0x4b, 0xf7, 0xb2, 0xb1, 0x44, 0x2f, 0x1b, + 0xd1, 0x98, 0x58, 0x98, 0x23, 0xb8, 0x66, 0xf0, 0xff, 0x9a, 0xf5, 0x37, 0x37, 0x16, 0x6d, 0xe8, + 0x3e, 0x14, 0x89, 0x73, 0xb0, 0x23, 0x05, 0x9b, 0xbf, 0x40, 0x08, 0x74, 0xfa, 0xaf, 0x01, 0xe6, + 0xce, 0x74, 0x3a, 0x9a, 0x37, 0x8c, 0x73, 0x76, 0x48, 0x5b, 0x3f, 0x78, 0x18, 0x9d, 0x8c, 0xa2, + 0x0c, 0x7c, 0x26, 0x21, 0x34, 0x00, 0x7d, 0x0e, 0xc0, 0x22, 0xb9, 0xa9, 0x4e, 0xbc, 0x8b, 0xd1, + 0x4e, 0xc2, 0x70, 0xd2, 0x2d, 0x84, 0x58, 0xf9, 0xcf, 0x61, 0x2b, 0x31, 0xb2, 0xd1, 0x23, 0x00, + 0x8b, 0x7e, 0x85, 0xd4, 0x15, 0xa2, 0xf0, 0x2f, 0xe1, 0x6e, 0x52, 0x34, 0x5f, 0x39, 0xee, 0xbf, + 0xb3, 0xf0, 0xe0, 0xb2, 0xb0, 0x25, 0x07, 0x51, 0x3b, 0xe1, 0xbe, 0x1d, 0xa6, 0xa1, 0x57, 0xae, + 0x51, 0x98, 0x9e, 0x5e, 0x5e, 0x3b, 0x27, 0xec, 0x7b, 0x1f, 0x21, 0x43, 0xe1, 0xe0, 0x7e, 0x4f, + 0xa8, 0x68, 0x13, 0xca, 0x87, 0xa3, 0x6e, 0x57, 0x12, 0x9b, 0xc3, 0x61, 0xa7, 0xd7, 0x12, 0xb9, + 0x0c, 0x2a, 0xc1, 0x6a, 0xaf, 0x39, 0x3c, 0xee, 0x0b, 0xaf, 0xb9, 0x2c, 0x2a, 0xc0, 0xd2, 0x71, + 0xe7, 0xb0, 0xc3, 0xe5, 0xd0, 0x2a, 0xe4, 0x47, 0x62, 0x8d, 0xcb, 0xa3, 0x32, 0x14, 0x6b, 0xdd, + 0x51, 0x73, 0xd8, 0xef, 0x0f, 0xdb, 0xdc, 0x12, 0xba, 0x03, 0x1b, 0x43, 0xa1, 0xd3, 0x6a, 0x35, + 0x05, 0xa9, 0x5a, 0x1f, 0x76, 0xfa, 0x3d, 0x91, 0x5b, 0xe6, 0x4b, 0x50, 0xf4, 0x73, 0x0b, 0xff, + 0x47, 0x28, 0x47, 0x12, 0xc7, 0xe5, 0xbe, 0xf1, 0x49, 0xd8, 0xd7, 0xd7, 0x0f, 0xee, 0x2d, 0xd8, + 0xb5, 0xef, 0xd8, 0x6f, 0x08, 0x83, 0x17, 0x06, 0x4d, 0xd8, 0x88, 0x65, 0x97, 0x5b, 0x45, 0xd3, + 0x39, 0xec, 0x92, 0xd0, 0x7f, 0x87, 0xba, 0xc8, 0x2f, 0x17, 0xea, 0x22, 0x51, 0xe1, 0x8f, 0xb5, + 0x43, 0x2d, 0xa1, 0x24, 0xf2, 0xcf, 0x79, 0x58, 0x0b, 0x77, 0xf9, 0x47, 0xf4, 0x6c, 0xe8, 0x88, + 0xbe, 0x0b, 0x05, 0x55, 0xb3, 0xc8, 0x91, 0x4e, 0x75, 0x0f, 0x87, 0x7e, 0x9b, 0x38, 0xa1, 0x89, + 0x27, 0xce, 0x54, 0xb6, 0x0d, 0xf3, 0xc2, 0xad, 0x79, 0x85, 0x28, 0xe8, 0x1b, 0x58, 0x23, 0xa7, + 0x5e, 0x4d, 0x9f, 0x48, 0x33, 0x43, 0xf5, 0x82, 0xfb, 0xc1, 0x82, 0x6c, 0xc7, 0x8c, 0xe9, 0xc8, + 0x50, 0xb1, 0x50, 0x3a, 0x0f, 0x1a, 0xe8, 0x25, 0x14, 0x65, 0xc7, 0x3e, 0x65, 0xa3, 0x97, 0x13, + 0xcc, 0x42, 0x46, 0x57, 0x1d, 0xfb, 0x94, 0x0e, 0x2d, 0xc8, 0xee, 0x17, 0x39, 0xd0, 0x2a, 0xa7, + 0xb2, 0xae, 0xe3, 0x29, 0x3d, 0x23, 0x96, 0x05, 0xaf, 0x89, 0xf6, 0x61, 0x45, 0x9e, 0x4b, 0x35, + 0x51, 0x74, 0xcf, 0x77, 0x3b, 0x0b, 0x70, 0x35, 0x51, 0xac, 0x9f, 0x4c, 0x84, 0x65, 0x79, 0x5e, + 0x13, 0x45, 0xf4, 0x0d, 0xb9, 0xdd, 0x68, 0xe4, 0xc6, 0x54, 0x13, 0x45, 0x69, 0xaa, 0x59, 0x76, + 0xa5, 0x40, 0x4f, 0xe5, 0xa9, 0x03, 0xcb, 0x8c, 0xbf, 0x26, 0x8a, 0x5d, 0xcd, 0xa2, 0x2e, 0x77, + 0xaa, 0xa9, 0x58, 0xb2, 0x2c, 0xcd, 0xbb, 0x83, 0x17, 0x08, 0x41, 0xb4, 0x34, 0x95, 0x64, 0x43, + 0x1d, 0xff, 0x30, 0x33, 0x74, 0xf7, 0x3a, 0xec, 0xb6, 0xf8, 0x7f, 0xcf, 0x42, 0x91, 0x5a, 0xc6, + 0x26, 0xa1, 0xba, 0x0f, 0x4b, 0x54, 0x01, 0x59, 0xaa, 0x80, 0xdd, 0x45, 0xd3, 0x12, 0x2e, 0xaa, + 0x01, 0xca, 0x17, 0x5e, 0x7d, 0x2e, 0xba, 0x7a, 0x04, 0x4b, 0x54, 0x0e, 0x66, 0x2a, 0xfa, 0x8d, + 0xea, 0x10, 0xbf, 0xd2, 0xb9, 0x57, 0xcd, 0x4b, 0x7c, 0x28, 0x3e, 0x82, 0x3f, 0x00, 0x08, 0x54, + 0x40, 0xa6, 0x11, 0xc5, 0x4e, 0xc3, 0xf3, 0x23, 0xf2, 0x8d, 0x38, 0xc8, 0x0f, 0xc4, 0xd7, 0xee, + 0xc5, 0x84, 0x7c, 0xf2, 0x4f, 0xa1, 0x2c, 0xda, 0x26, 0x31, 0x35, 0xb6, 0x2c, 0xe2, 0xea, 0x1c, + 0xe4, 0x67, 0xd6, 0xc4, 0x2b, 0x80, 0xcd, 0xac, 0x09, 0xff, 0x0b, 0x40, 0x11, 0x96, 0xaa, 0x69, + 0xca, 0x17, 0xc4, 0x25, 0x67, 0xd6, 0x84, 0x7e, 0xd3, 0x2b, 0x52, 0x51, 0xf0, 0xdb, 0xfc, 0x3e, + 0xac, 0x35, 0xcf, 0xb0, 0x6e, 0xbb, 0xd1, 0x44, 0x5c, 0x94, 0x18, 0x0d, 0xeb, 0x24, 0xe9, 0x50, + 0xe8, 0xbc, 0x10, 0xa2, 0xf0, 0x32, 0x00, 0xe5, 0xa7, 0x81, 0x8d, 0x76, 0x61, 0xd5, 0xb6, 0xe8, + 0x84, 0x4c, 0x8a, 0x76, 0x46, 0xf0, 0x08, 0x68, 0x1b, 0x96, 0xed, 0xb1, 0x61, 0x30, 0x9d, 0x16, + 0xda, 0x19, 0x81, 0x35, 0x51, 0x05, 0x56, 0x6c, 0x4d, 0xb7, 0x5f, 0xbe, 0xa0, 0x5a, 0xcd, 0x93, + 0xd3, 0x1e, 0x6b, 0xd7, 0x96, 0x21, 0x7f, 0x26, 0x4f, 0xf9, 0x2e, 0x2c, 0xd3, 0x29, 0x88, 0x5a, + 0xec, 0x40, 0x0a, 0x56, 0x26, 0xfb, 0xc4, 0xdf, 0x0f, 0x73, 0x09, 0x6e, 0x15, 0x88, 0xe6, 0x6d, + 0x94, 0xfc, 0x9f, 0xe0, 0x2e, 0x89, 0xfd, 0x86, 0x66, 0xf6, 0xcd, 0x43, 0x6d, 0x8a, 0xbd, 0x85, + 0x72, 0x90, 0x57, 0x35, 0xef, 0x44, 0x40, 0x3e, 0x89, 0x73, 0xcd, 0x4d, 0x7c, 0xa2, 0xfd, 0xe0, + 0x2a, 0xdd, 0x6d, 0x11, 0x95, 0x18, 0xfa, 0xf4, 0xe2, 0xd0, 0x98, 0xaa, 0x6e, 0x01, 0xa2, 0x20, + 0x84, 0x28, 0x64, 0xaf, 0x8a, 0xcd, 0x60, 0xcd, 0x0d, 0xdd, 0xc2, 0x2c, 0xdc, 0x2d, 0x67, 0x6a, + 0x0f, 0x64, 0xbf, 0x82, 0x1e, 0xa2, 0xf0, 0xff, 0x94, 0x85, 0x0d, 0x01, 0xcb, 0x6a, 0x58, 0xac, + 0x5f, 0xc2, 0xca, 0x09, 0x9b, 0x28, 0x9b, 0xb0, 0xd9, 0x56, 0x15, 0x05, 0x5b, 0x96, 0x36, 0x9e, + 0x62, 0x36, 0xb7, 0xe0, 0x32, 0x13, 0x13, 0x9f, 0x68, 0x53, 0xac, 0x07, 0x77, 0x59, 0xbf, 0x4d, + 0xb2, 0xa8, 0x45, 0x36, 0x43, 0xa6, 0x6f, 0x81, 0x35, 0xc8, 0xfa, 0xa7, 0x58, 0xa7, 0xae, 0x9b, + 0x17, 0xc8, 0x27, 0xdf, 0x00, 0x2e, 0x90, 0xc6, 0x5d, 0xc2, 0x03, 0x28, 0x9a, 0x58, 0x56, 0xeb, + 0x86, 0xa3, 0xdb, 0xae, 0x1d, 0x02, 0x02, 0x31, 0x90, 0x2a, 0xdb, 0x32, 0x9d, 0x71, 0x4d, 0xa0, + 0xdf, 0xfc, 0x7f, 0x66, 0x81, 0x3b, 0x36, 0x35, 0x1b, 0xff, 0xc4, 0xab, 0xda, 0x26, 0x89, 0x69, + 0x4e, 0x4e, 0xb1, 0xcc, 0x22, 0x6e, 0x8b, 0x16, 0x8c, 0x1c, 0xcb, 0xee, 0x19, 0x76, 0xf3, 0x07, + 0x92, 0x7d, 0xdc, 0xfa, 0x63, 0x98, 0xe6, 0xcb, 0xbd, 0x1c, 0x92, 0xfb, 0x3d, 0xd8, 0x20, 0x12, + 0x77, 0xf4, 0x13, 0xc3, 0x93, 0x1a, 0xc1, 0xd2, 0x3c, 0xb0, 0x1c, 0xfd, 0xe6, 0xff, 0x0c, 0x5c, + 0xc0, 0xe6, 0x2a, 0x29, 0x69, 0x1b, 0x20, 0x99, 0x43, 0xfb, 0x5b, 0x26, 0x76, 0x5e, 0xa0, 0xdf, + 0x84, 0x46, 0xf3, 0x12, 0xab, 0x61, 0xf9, 0xb9, 0x67, 0x66, 0xa8, 0x43, 0xcd, 0x2d, 0xf9, 0xe6, + 0x05, 0xaf, 0x49, 0xcc, 0xa6, 0x59, 0x0d, 0xcd, 0x74, 0x2b, 0xa4, 0xac, 0xc1, 0xff, 0x0e, 0x38, + 0xff, 0x50, 0x13, 0x8a, 0x59, 0x76, 0x92, 0x09, 0xfb, 0x59, 0x40, 0x41, 0xef, 0xc3, 0xba, 0xad, + 0xcd, 0xb0, 0xe1, 0xd8, 0x22, 0x56, 0x0c, 0x5d, 0xb5, 0xdc, 0x34, 0x17, 0xa3, 0xf2, 0x8f, 0x60, + 0xcd, 0xc7, 0x7e, 0x65, 0x8c, 0xe3, 0x65, 0x0f, 0xfe, 0x59, 0x68, 0xee, 0x57, 0xc6, 0x98, 0xa6, + 0x6b, 0x0e, 0xf2, 0x9a, 0xca, 0x2a, 0x2f, 0x65, 0x81, 0x7c, 0xf2, 0x6f, 0xa0, 0xd2, 0xee, 0x34, + 0x04, 0x47, 0xd7, 0x35, 0x7d, 0xf2, 0xca, 0x18, 0xd3, 0x6c, 0x2b, 0x50, 0xaf, 0x0f, 0x21, 0xe6, + 0x69, 0x21, 0x05, 0xc1, 0xd2, 0xd9, 0xac, 0xa3, 0x7a, 0x5a, 0x22, 0xdf, 0xc4, 0xb0, 0x96, 0xe1, + 0x98, 0x0a, 0x76, 0xb3, 0xae, 0xdb, 0xe2, 0xff, 0x0c, 0x1b, 0xa1, 0x95, 0x53, 0xb8, 0x0f, 0x21, + 0xff, 0xbd, 0x31, 0x76, 0x9f, 0x23, 0xa2, 0xe9, 0x37, 0x2c, 0xa8, 0x40, 0xb8, 0x88, 0x96, 0x34, + 0xeb, 0x50, 0xd3, 0x35, 0xeb, 0xd4, 0xdf, 0x9a, 0x43, 0x94, 0x20, 0x5a, 0x5f, 0x59, 0x86, 0x1e, + 0x6c, 0xce, 0x1e, 0x85, 0xdf, 0x87, 0x52, 0xb7, 0xd9, 0xf0, 0xf7, 0xfe, 0xc7, 0x50, 0x1a, 0xd3, + 0x42, 0xb5, 0xe2, 0xc7, 0x46, 0x59, 0x00, 0x4a, 0xa2, 0xc1, 0xc1, 0xff, 0x00, 0xf7, 0x46, 0x62, + 0xed, 0x1d, 0x4e, 0x29, 0x9f, 0x2f, 0x9c, 0x52, 0xa2, 0xcf, 0x47, 0xec, 0xd2, 0x94, 0x70, 0x4e, + 0xf9, 0xeb, 0x32, 0xac, 0x47, 0x3b, 0x89, 0x9b, 0x61, 0x9d, 0x1d, 0x4a, 0xdc, 0xe2, 0xbf, 0xdb, + 0x24, 0x06, 0x3c, 0xd3, 0x54, 0x6f, 0x9f, 0x39, 0xd3, 0x54, 0xf6, 0xae, 0xe2, 0xed, 0x79, 0xe4, + 0x73, 0xa1, 0x08, 0xcb, 0x1e, 0x27, 0xa2, 0x45, 0x58, 0x5a, 0x8e, 0x36, 0x54, 0x47, 0xb1, 0xdd, + 0xb7, 0x09, 0xaf, 0x49, 0x0d, 0x8a, 0x4d, 0x4d, 0x66, 0x67, 0x0b, 0x62, 0x50, 0xda, 0x42, 0x8f, + 0xa0, 0xe4, 0x58, 0x58, 0xaa, 0x37, 0xea, 0x52, 0xb3, 0x7e, 0xe4, 0xd6, 0xeb, 0x8b, 0x8e, 0x85, + 0xeb, 0x8d, 0x7a, 0xb3, 0x7e, 0x44, 0x4e, 0x02, 0xa4, 0x5f, 0xe8, 0x35, 0x3a, 0xa2, 0x5b, 0xa8, + 0x2f, 0x38, 0x16, 0xa6, 0x6d, 0xf4, 0x1c, 0x38, 0xd2, 0xd9, 0xee, 0x34, 0xa4, 0xd7, 0xcd, 0xdf, + 0xd6, 0xfa, 0x55, 0xa1, 0xe1, 0x9e, 0x16, 0xd6, 0x1d, 0x0b, 0xb7, 0x3b, 0x0d, 0x8f, 0x8a, 0x78, + 0x28, 0x7b, 0x9c, 0x47, 0xfd, 0x91, 0xd8, 0x74, 0x8b, 0x9c, 0x25, 0xc6, 0x46, 0x49, 0x9e, 0x28, + 0x84, 0x47, 0xa8, 0x1e, 0xbb, 0x85, 0xcc, 0x22, 0xe3, 0x10, 0xaa, 0xc7, 0x68, 0x07, 0x56, 0x49, + 0xff, 0xe8, 0x48, 0x74, 0xeb, 0x94, 0x2b, 0x8e, 0x85, 0x47, 0x47, 0x22, 0x7a, 0x08, 0x40, 0x3a, + 0xc4, 0xa6, 0xd0, 0xa9, 0x76, 0xbd, 0x1a, 0xbd, 0x63, 0x61, 0x46, 0x40, 0xaf, 0x60, 0xdd, 0xd4, + 0x55, 0xcd, 0x0a, 0xca, 0xc7, 0xeb, 0x09, 0xaf, 0x5f, 0x51, 0x5b, 0x35, 0xed, 0x53, 0x6c, 0xea, + 0xd8, 0x16, 0xca, 0x74, 0xa8, 0x6f, 0xc2, 0x23, 0xe0, 0x14, 0x55, 0x91, 0xb0, 0x32, 0x0b, 0xd0, + 0x36, 0xae, 0x8f, 0xb6, 0xae, 0xa8, 0x4a, 0x53, 0x99, 0xf9, 0x70, 0x55, 0x58, 0x73, 0x66, 0x21, + 0xc1, 0xb8, 0x84, 0xf7, 0xc1, 0x28, 0xd4, 0xe8, 0x48, 0x14, 0x4a, 0xce, 0x2c, 0x90, 0xe8, 0x53, + 0xd8, 0x52, 0xf1, 0x99, 0x44, 0xf2, 0xa2, 0x74, 0xaa, 0xa9, 0xd2, 0x5b, 0x7c, 0x31, 0x36, 0x64, + 0x53, 0xa5, 0x15, 0x8c, 0xa2, 0x80, 0x54, 0x7c, 0x46, 0xf2, 0x4f, 0x5b, 0x53, 0x5f, 0xbb, 0x3d, + 0xe8, 0x43, 0x40, 0x91, 0x21, 0x33, 0xc3, 0xb1, 0x30, 0xad, 0x60, 0x14, 0x85, 0x8d, 0x80, 0xff, + 0x88, 0x90, 0xd1, 0xcf, 0x81, 0x8b, 0x30, 0x9b, 0xf2, 0x39, 0x2d, 0x59, 0x14, 0x85, 0x72, 0xc0, + 0x2a, 0xc8, 0xe7, 0xfc, 0x00, 0xb6, 0x93, 0x57, 0x4d, 0x4f, 0x93, 0x86, 0x65, 0xd3, 0xd7, 0x0c, + 0xef, 0x02, 0x43, 0x08, 0x55, 0x55, 0x35, 0xd1, 0x3d, 0x28, 0x10, 0x7c, 0xda, 0xc7, 0xfc, 0x7f, + 0x55, 0xc5, 0x67, 0xa4, 0x8b, 0xff, 0x1a, 0x36, 0x17, 0x16, 0x4f, 0x32, 0xb2, 0xa2, 0x9a, 0xc6, + 0xcc, 0x0d, 0x21, 0xd6, 0x20, 0x39, 0x8c, 0x6c, 0x4a, 0x5e, 0x09, 0x99, 0x7c, 0x93, 0x0b, 0xff, + 0x23, 0x5f, 0xf3, 0xb7, 0xcf, 0x00, 0xb5, 0x85, 0x0c, 0x10, 0xad, 0x59, 0x7a, 0x53, 0x74, 0x74, + 0x1b, 0x9b, 0x27, 0xb2, 0x82, 0x13, 0x92, 0x81, 0x04, 0x4f, 0xd9, 0xa5, 0x13, 0xab, 0xa9, 0xec, + 0xe8, 0x4b, 0x58, 0xa2, 0x47, 0x75, 0x56, 0x40, 0xbf, 0xee, 0x24, 0x74, 0x0c, 0xff, 0x97, 0x3c, + 0xdc, 0x4b, 0x47, 0x4e, 0xda, 0x1b, 0xbf, 0x71, 0xf7, 0x41, 0x76, 0x6f, 0xfc, 0xf0, 0x7a, 0xb3, + 0xed, 0x87, 0x0e, 0xec, 0x24, 0x95, 0xcf, 0xdd, 0xb7, 0xa8, 0x17, 0x5e, 0xaa, 0x0e, 0x28, 0xe4, + 0xdc, 0xa0, 0x63, 0x7b, 0x26, 0x5b, 0x6f, 0x5f, 0xb8, 0xb9, 0xca, 0x6f, 0x87, 0x33, 0xe1, 0x72, + 0x34, 0x13, 0xf6, 0x01, 0xa9, 0xa7, 0xca, 0x9c, 0xbd, 0x39, 0xf8, 0x67, 0x7b, 0x56, 0x33, 0x7f, + 0x1c, 0x11, 0xb2, 0xd1, 0xae, 0x0f, 0xa2, 0x6c, 0x42, 0xc2, 0x50, 0xf4, 0x0c, 0xca, 0x9e, 0x19, + 0x3a, 0xfa, 0xc8, 0xc2, 0x6e, 0x8a, 0x8b, 0x12, 0xf9, 0x3a, 0x2c, 0xd1, 0x3b, 0x18, 0xc0, 0xca, + 0x51, 0xb5, 0x37, 0xaa, 0x76, 0xb9, 0x0c, 0xda, 0x80, 0x12, 0x99, 0x43, 0xaa, 0x77, 0x3b, 0xcd, + 0xde, 0x90, 0xcb, 0xfa, 0x04, 0xb1, 0x29, 0xbc, 0x69, 0x0a, 0x5c, 0x8e, 0xdc, 0xed, 0x47, 0xbd, + 0xa3, 0x6a, 0xaf, 0xda, 0x6a, 0x36, 0xb8, 0x3c, 0xff, 0xbf, 0x79, 0x40, 0x8b, 0x52, 0x05, 0xa7, + 0xf9, 0x81, 0x61, 0xfa, 0x7b, 0x54, 0x40, 0x41, 0xcf, 0x61, 0x83, 0xb5, 0x7c, 0x75, 0x7b, 0x3f, + 0xdb, 0x88, 0x91, 0x69, 0x19, 0x0d, 0xcb, 0x16, 0x3d, 0xd5, 0xb9, 0x1a, 0x0f, 0x08, 0x68, 0x0f, + 0x38, 0xdd, 0xb0, 0xc9, 0xc5, 0xd2, 0x30, 0x35, 0x5b, 0xa6, 0xcf, 0x1f, 0xec, 0xe0, 0xb5, 0x40, + 0x47, 0xfb, 0x80, 0x54, 0xa3, 0x67, 0xd8, 0x35, 0x4d, 0x57, 0x83, 0x69, 0x99, 0x2d, 0x12, 0x7a, + 0xc8, 0xe9, 0x45, 0x91, 0xa7, 0xd3, 0xb1, 0xac, 0xbc, 0x75, 0x4b, 0xb8, 0x6c, 0x1b, 0x89, 0x51, + 0xd1, 0x0b, 0x58, 0x31, 0x65, 0x7d, 0x82, 0xad, 0xca, 0x2a, 0xf5, 0xe2, 0x07, 0x29, 0x26, 0x13, + 0x08, 0x93, 0xe0, 0xf2, 0xa2, 0x43, 0x58, 0x35, 0xe6, 0xec, 0xf5, 0x88, 0xdd, 0x53, 0x3f, 0xba, + 0xc2, 0xd2, 0xfb, 0x7d, 0xc6, 0xde, 0xd4, 0x6d, 0xf3, 0x42, 0xf0, 0x06, 0xa3, 0x3a, 0x94, 0xd8, + 0x13, 0x69, 0xdb, 0xb0, 0x6c, 0xab, 0x52, 0xa4, 0x58, 0x4f, 0xd3, 0xb0, 0x7c, 0x4e, 0x21, 0x3c, + 0x6a, 0xf7, 0x4b, 0x58, 0x0b, 0xa3, 0x93, 0x9d, 0xf8, 0x2d, 0xbe, 0x70, 0xed, 0x46, 0x3e, 0xa3, + 0x15, 0x91, 0xa2, 0x5b, 0x11, 0xf9, 0x32, 0xf7, 0x45, 0x96, 0x37, 0x60, 0x23, 0xb6, 0x46, 0x7a, + 0xa2, 0x21, 0x1f, 0x5d, 0xe3, 0xdc, 0xaf, 0x7d, 0x86, 0x28, 0x7e, 0xff, 0x68, 0x3e, 0xc7, 0x5e, + 0x06, 0x0c, 0x51, 0x7c, 0x9b, 0xd3, 0xd3, 0x69, 0xd8, 0xe6, 0x84, 0xc0, 0x7f, 0x01, 0x77, 0x93, + 0x56, 0x44, 0x6f, 0xa5, 0xb2, 0xe2, 0xdf, 0x4a, 0x65, 0x85, 0x9e, 0xfa, 0xe6, 0x2e, 0x7e, 0x4e, + 0x9b, 0xf3, 0xab, 0xb0, 0xdc, 0x9c, 0xcd, 0xed, 0x8b, 0xbd, 0x2f, 0x42, 0xbf, 0x58, 0x58, 0xfc, + 0x61, 0x04, 0x5a, 0x85, 0x7c, 0xaf, 0x3a, 0xe0, 0x32, 0xa8, 0x00, 0x4b, 0x83, 0x6a, 0x6f, 0xc4, + 0x65, 0xd1, 0x0a, 0xe4, 0x5a, 0x3d, 0x2e, 0xb7, 0xf7, 0x0a, 0xb6, 0x12, 0xab, 0x9c, 0x68, 0x0d, + 0x0a, 0x62, 0xf3, 0xdb, 0x51, 0xb3, 0x57, 0x6f, 0x72, 0x19, 0x82, 0x50, 0xed, 0x35, 0xd8, 0xb8, + 0x3e, 0x09, 0x1b, 0x04, 0xeb, 0xcd, 0xef, 0xaa, 0xf5, 0xa1, 0xe4, 0x33, 0xe5, 0xf7, 0x3e, 0x06, + 0x2e, 0x5e, 0xc4, 0x24, 0xfc, 0x23, 0x77, 0xe6, 0x46, 0xff, 0xb8, 0xc7, 0x65, 0x09, 0x54, 0xff, + 0xf0, 0x90, 0xcb, 0xed, 0x7d, 0x02, 0x10, 0x14, 0x2d, 0x49, 0xd4, 0x0a, 0x1d, 0xb1, 0xd3, 0x6b, + 0xb1, 0x7a, 0xdc, 0x61, 0xb5, 0xdb, 0x25, 0x0d, 0x5a, 0x8f, 0xab, 0xf5, 0x87, 0x6d, 0x2e, 0xb7, + 0xf7, 0x31, 0xac, 0x85, 0xab, 0x61, 0x04, 0xa9, 0xdb, 0x3f, 0x66, 0xe0, 0xed, 0x4e, 0xab, 0xcd, + 0x65, 0x09, 0xca, 0xb0, 0xdf, 0x6a, 0x75, 0x9b, 0x5c, 0x6e, 0xaf, 0x01, 0x1b, 0xb1, 0x1a, 0x0f, + 0x01, 0x1e, 0xf5, 0x5e, 0xf7, 0x88, 0x20, 0x19, 0x22, 0x5a, 0x75, 0xc0, 0x04, 0x12, 0x87, 0x55, + 0x2e, 0x87, 0xee, 0xc0, 0x86, 0x38, 0xac, 0x4a, 0x87, 0xd5, 0x4e, 0xb7, 0xff, 0xa6, 0x29, 0x48, + 0xd5, 0x01, 0x97, 0xdf, 0x6b, 0x40, 0x39, 0x52, 0xea, 0x40, 0x5b, 0xb0, 0x49, 0xb8, 0x7a, 0xfd, + 0xa1, 0x54, 0xef, 0xf7, 0x7a, 0xcd, 0xfa, 0xb0, 0xd9, 0xe0, 0x32, 0xa8, 0x08, 0xcb, 0xd5, 0x81, + 0x34, 0x22, 0x80, 0x9b, 0x50, 0x26, 0x1c, 0x41, 0x6f, 0x6e, 0xef, 0x7d, 0x56, 0xf0, 0xf2, 0x2a, + 0x46, 0x44, 0xbb, 0xc7, 0x83, 0xea, 0x81, 0x34, 0x10, 0x5f, 0x33, 0xf9, 0xfb, 0x83, 0x66, 0x8f, + 0xcb, 0xee, 0xfd, 0x3f, 0xe0, 0xe2, 0x97, 0x38, 0x22, 0xdf, 0xf0, 0x88, 0xe8, 0x90, 0x83, 0xb5, + 0x5a, 0x55, 0x6c, 0x4b, 0x62, 0x5d, 0xe8, 0x0c, 0x86, 0x22, 0xcb, 0x66, 0xe4, 0xa8, 0xe5, 0x11, + 0x72, 0x07, 0xff, 0xf1, 0x19, 0xac, 0x0c, 0x5e, 0x1c, 0xf7, 0x06, 0x9f, 0xa2, 0x13, 0x78, 0xda, + 0xc2, 0xf6, 0x15, 0x3f, 0x2e, 0x40, 0xd1, 0x3d, 0x83, 0x38, 0xd3, 0xee, 0x4d, 0x7e, 0x8e, 0xc4, + 0x67, 0xd0, 0x5f, 0xb2, 0xf0, 0x8c, 0x6d, 0x8c, 0x57, 0xcc, 0x75, 0x13, 0xdc, 0x9b, 0x0a, 0xf1, + 0x06, 0xee, 0x85, 0x17, 0x1b, 0xfd, 0x7d, 0x53, 0xd2, 0x22, 0xaf, 0xf3, 0xb3, 0x29, 0x3e, 0x83, + 0xbe, 0x87, 0x07, 0xb1, 0xb5, 0x45, 0xa1, 0xaf, 0x03, 0x73, 0xdd, 0xb9, 0xbe, 0x83, 0x5d, 0x31, + 0xb4, 0x86, 0xd8, 0xcf, 0xae, 0x9e, 0x5d, 0xe7, 0x67, 0x50, 0xbb, 0x09, 0x4b, 0xe5, 0x33, 0xe8, + 0xf7, 0xb0, 0x13, 0x5b, 0x45, 0xb0, 0xb1, 0x5d, 0xfe, 0x3b, 0xb6, 0xdd, 0x2b, 0xfa, 0xf9, 0x0c, + 0xfa, 0x03, 0x6c, 0x93, 0xa3, 0x18, 0x5e, 0xc4, 0xfe, 0x28, 0x79, 0x6c, 0xf2, 0x39, 0x2e, 0x45, + 0xf4, 0xdf, 0xc1, 0x6e, 0x0b, 0xdb, 0x74, 0x02, 0x75, 0x71, 0x86, 0x68, 0x49, 0x32, 0x52, 0xb1, + 0xbb, 0x86, 0xe4, 0x7f, 0x84, 0x87, 0xee, 0x33, 0xc2, 0x4f, 0x02, 0xff, 0x2d, 0x81, 0x9f, 0x62, + 0xf6, 0x53, 0xc7, 0x9b, 0xc2, 0x27, 0x6b, 0x43, 0x80, 0x47, 0x14, 0xcc, 0x3b, 0x88, 0xfe, 0x18, + 0x98, 0x43, 0xb8, 0xdf, 0xd5, 0xac, 0x54, 0x15, 0x27, 0x05, 0xcf, 0xe3, 0xf4, 0x49, 0x58, 0x31, + 0x34, 0x83, 0x8e, 0xa0, 0xd2, 0xc2, 0xb6, 0x27, 0x67, 0xe4, 0x0a, 0x90, 0x08, 0x79, 0xd9, 0x8d, + 0x9c, 0xcf, 0xa0, 0x36, 0xdc, 0x61, 0x58, 0xef, 0x8c, 0x74, 0x08, 0x9b, 0x2d, 0x6c, 0xc7, 0x6e, + 0xf5, 0xb7, 0xc0, 0xe9, 0xc3, 0xa6, 0xb8, 0x80, 0x73, 0xd9, 0x98, 0xab, 0x00, 0x7f, 0x03, 0xeb, + 0x2d, 0x6c, 0x87, 0x2b, 0x23, 0x49, 0x52, 0x55, 0x22, 0xb4, 0x10, 0x37, 0x43, 0x10, 0xa3, 0x08, + 0xa9, 0xdc, 0x29, 0xbe, 0xd0, 0x80, 0xb5, 0x23, 0xc3, 0xd1, 0xed, 0xd1, 0x91, 0x48, 0x8f, 0xa3, + 0x57, 0xdc, 0x62, 0x53, 0x50, 0x06, 0xc0, 0x51, 0x6f, 0x1a, 0x89, 0xb5, 0xe0, 0xc7, 0x5a, 0x11, + 0xce, 0xd4, 0x7a, 0x4e, 0x0a, 0xe2, 0xb7, 0x70, 0xd7, 0xcf, 0x02, 0x61, 0xd4, 0xcb, 0xbc, 0xfd, + 0x0a, 0x75, 0x0f, 0xbd, 0x9c, 0xf8, 0xa3, 0xa2, 0xbe, 0x26, 0xa8, 0x41, 0xcc, 0x5f, 0x17, 0x35, + 0x79, 0xd5, 0x5d, 0xa8, 0x44, 0xa2, 0xfd, 0xdd, 0xd0, 0x7a, 0xb0, 0x15, 0xc4, 0x79, 0x18, 0xea, + 0xd6, 0x11, 0xbe, 0xc6, 0xca, 0x93, 0xee, 0xb5, 0xe1, 0x61, 0x72, 0xd9, 0xd0, 0xb5, 0xf3, 0xee, + 0x83, 0xb4, 0x6e, 0xcb, 0x99, 0xda, 0x14, 0x6e, 0x23, 0x0c, 0xf7, 0xca, 0x18, 0x5f, 0x85, 0x98, + 0x5e, 0xa7, 0xa4, 0x99, 0x72, 0xab, 0xdd, 0x69, 0x10, 0xa7, 0xf1, 0x8b, 0x97, 0xac, 0xd4, 0x99, + 0x3e, 0xea, 0x4a, 0x11, 0x9b, 0x80, 0xda, 0x9d, 0x46, 0x5d, 0xd6, 0x15, 0x3c, 0x0d, 0xa4, 0xbc, + 0x04, 0x30, 0xcd, 0x10, 0x3b, 0x4c, 0x34, 0xb7, 0xb4, 0xeb, 0xf3, 0x27, 0x9b, 0xe2, 0x61, 0x2a, + 0x3e, 0x31, 0x27, 0x9f, 0x41, 0x35, 0xd8, 0xf6, 0xc5, 0xaa, 0x4e, 0xa7, 0x57, 0xc0, 0xa5, 0x9d, + 0x10, 0xb6, 0x22, 0x32, 0x79, 0xe5, 0xe6, 0xcb, 0x56, 0xf7, 0x5e, 0xbc, 0x2b, 0xb1, 0x54, 0x4d, + 0x05, 0x2c, 0x1d, 0x8a, 0xfe, 0x53, 0x46, 0xcc, 0xac, 0xf1, 0x27, 0x8e, 0x14, 0x01, 0x5f, 0x03, + 0x1c, 0x8a, 0xde, 0xab, 0x0a, 0x8a, 0x5a, 0x2a, 0xf6, 0xf4, 0x13, 0xd3, 0x58, 0xfc, 0x29, 0x86, + 0x5a, 0xa0, 0x7c, 0x28, 0xb6, 0xb0, 0xed, 0x3d, 0x40, 0xc4, 0xf0, 0x62, 0xcf, 0x17, 0x31, 0xbc, + 0xf8, 0xab, 0x05, 0x9f, 0x41, 0x7f, 0x82, 0xad, 0x43, 0xb1, 0x6e, 0x62, 0xd9, 0xc6, 0x91, 0x07, + 0x2c, 0x14, 0xfb, 0xa5, 0x5d, 0xc2, 0xf3, 0xd9, 0x2e, 0x7f, 0x19, 0x8b, 0x3f, 0xc3, 0x6f, 0xa0, + 0x44, 0x9f, 0xe4, 0xba, 0xb4, 0x9a, 0x10, 0xb3, 0x4a, 0xf8, 0xdd, 0x31, 0xae, 0x3e, 0xd2, 0xc5, + 0x67, 0x7e, 0x91, 0x45, 0x2d, 0x28, 0x35, 0x95, 0x53, 0xff, 0x49, 0xe6, 0xb2, 0xfc, 0x71, 0x49, + 0x1f, 0x9f, 0x41, 0x1d, 0x40, 0x2c, 0x21, 0x45, 0x5e, 0xf0, 0xd3, 0xdf, 0x6c, 0x77, 0xb7, 0x93, + 0xdf, 0x8d, 0xf9, 0x0c, 0xfa, 0x0a, 0xd6, 0x5a, 0xd8, 0x0e, 0xde, 0x9b, 0x93, 0xfc, 0x35, 0x7d, + 0xf4, 0x21, 0x6c, 0x33, 0x75, 0xf8, 0xc4, 0xfa, 0x29, 0xab, 0x45, 0xdc, 0x0c, 0x47, 0x80, 0x4d, + 0x9a, 0x14, 0x8f, 0xb5, 0x93, 0x60, 0x3d, 0x3f, 0x8f, 0xb1, 0xa7, 0xfd, 0x4c, 0x22, 0x75, 0x0b, + 0xdc, 0xf2, 0x37, 0xac, 0x08, 0xee, 0x65, 0x7a, 0x4f, 0xd7, 0x21, 0x45, 0xac, 0x84, 0xf7, 0xab, + 0x6b, 0x83, 0xa6, 0xaf, 0xbb, 0x4b, 0x10, 0x83, 0xbd, 0xea, 0xda, 0x88, 0xc9, 0x2b, 0x3e, 0x82, + 0x7b, 0x91, 0xcd, 0xea, 0x1d, 0xe1, 0xfa, 0xcc, 0xb8, 0x09, 0xa2, 0xdd, 0x72, 0xbb, 0x92, 0xe0, + 0x31, 0x13, 0x2d, 0xbd, 0xc4, 0x7a, 0xcd, 0x72, 0x6d, 0x8a, 0xc4, 0x06, 0xfc, 0xbc, 0x85, 0xed, + 0xea, 0x74, 0x7a, 0x75, 0x95, 0x38, 0x69, 0x09, 0xfb, 0xd1, 0x12, 0xd7, 0x55, 0x18, 0x7c, 0x06, + 0x4d, 0xe1, 0x59, 0xe8, 0x88, 0x9d, 0x3e, 0xdb, 0x65, 0xca, 0xbf, 0xe6, 0x92, 0xf9, 0x0c, 0x52, + 0xdc, 0xab, 0x47, 0xfa, 0x3c, 0xc9, 0xf5, 0xe7, 0x1b, 0x85, 0xcd, 0xf7, 0xc0, 0xfb, 0x61, 0xf3, + 0x53, 0x2f, 0xe8, 0xb7, 0xf0, 0x5e, 0x38, 0xa0, 0x6e, 0x37, 0x5d, 0xf2, 0x32, 0x28, 0x74, 0x10, + 0x59, 0x3f, 0x26, 0xf4, 0x1f, 0xe0, 0x67, 0x41, 0x5c, 0xdc, 0xcc, 0xc3, 0xae, 0x11, 0x24, 0x02, + 0xdc, 0x0f, 0xb9, 0xd4, 0xc2, 0x1f, 0x0a, 0x5c, 0x7d, 0x3c, 0x89, 0x0f, 0xa1, 0x81, 0xe7, 0xde, + 0xb2, 0xe3, 0x7d, 0x02, 0x9e, 0x4f, 0x65, 0x25, 0x7e, 0x1e, 0x88, 0x73, 0x5d, 0x3d, 0xc1, 0xef, + 0xe1, 0x5e, 0xf2, 0x04, 0x55, 0x55, 0x7d, 0x67, 0xf0, 0xff, 0xef, 0x15, 0x80, 0x16, 0xa5, 0x9f, + 0x19, 0x67, 0xef, 0x2e, 0x7c, 0xe4, 0xf6, 0x1d, 0xef, 0xbf, 0xb5, 0x1d, 0xbb, 0xb0, 0x45, 0x11, + 0x17, 0x2c, 0x78, 0x85, 0xb8, 0xc9, 0x3e, 0x37, 0x86, 0x9f, 0x85, 0x23, 0x25, 0xcd, 0x8e, 0x97, + 0x39, 0xf3, 0x35, 0xf4, 0xfc, 0xf8, 0xb2, 0x39, 0x88, 0x29, 0xdf, 0x09, 0x7f, 0x40, 0xec, 0x18, + 0x84, 0xe4, 0x82, 0x62, 0x6e, 0x1e, 0x89, 0xdf, 0xc2, 0xce, 0xb1, 0xac, 0xd9, 0x49, 0x3f, 0x6d, + 0xbe, 0xf2, 0x8f, 0x05, 0x52, 0x20, 0x3b, 0x70, 0xe7, 0x50, 0x33, 0xf1, 0xc2, 0x6f, 0x3b, 0x2f, + 0xfb, 0x5d, 0x79, 0x2a, 0xd4, 0x5d, 0xa6, 0xcf, 0xd8, 0x5f, 0x26, 0x5f, 0xf6, 0x87, 0xb3, 0x29, + 0x50, 0x6f, 0xe0, 0x0e, 0x55, 0x5a, 0x0c, 0xe9, 0x83, 0xd8, 0x29, 0x3b, 0xfd, 0x6f, 0x7c, 0x53, + 0x0b, 0x4f, 0x3b, 0x7e, 0xb2, 0x8f, 0x61, 0x5f, 0xff, 0x06, 0x1e, 0x1d, 0xc8, 0x67, 0xd0, 0x31, + 0xec, 0x86, 0x1d, 0xe9, 0xc7, 0x03, 0xee, 0x11, 0xe0, 0xc0, 0x83, 0x6e, 0x00, 0x9c, 0xe6, 0x3f, + 0x95, 0x20, 0xf2, 0x63, 0x68, 0xb7, 0x0c, 0xfb, 0xaf, 0xa0, 0xd0, 0xa8, 0xd5, 0x64, 0xe5, 0xad, + 0x33, 0xbf, 0x85, 0x40, 0x5f, 0x43, 0xb1, 0x51, 0x13, 0xb0, 0x45, 0x04, 0xba, 0xd5, 0x01, 0xf0, + 0x6e, 0xb0, 0x1e, 0xff, 0xa2, 0x78, 0xeb, 0x14, 0x16, 0x29, 0x57, 0x04, 0xbf, 0x5b, 0x7f, 0x87, + 0x94, 0x78, 0x27, 0xc0, 0xf3, 0xb4, 0x74, 0x6b, 0xb4, 0x57, 0xb4, 0x8a, 0xe8, 0xff, 0x35, 0x60, + 0x6b, 0xae, 0x19, 0xb7, 0xc5, 0x1a, 0xaf, 0xd0, 0xff, 0x29, 0xf0, 0xd9, 0xff, 0x05, 0x00, 0x00, + 0xff, 0xff, 0x64, 0x81, 0xd3, 0x75, 0x61, 0x40, 0x00, 0x00, } diff --git a/proto/grpc.proto b/proto/grpc.proto index ede83c7..c033caf 100644 --- a/proto/grpc.proto +++ b/proto/grpc.proto @@ -117,6 +117,9 @@ service P4WNP1 { rpc ListStoredHIDScripts(Empty) returns (StringMessageArray) {} rpc ListStoredBashScripts(Empty) returns (StringMessageArray) {} rpc ListStoredDBBackups(Empty) returns (StringMessageArray) {} + + /* GPIO */ + rpc GetAvailableGpios(Empty) returns (StringMessageArray) {} } /* MasterTemplates */ @@ -271,40 +274,8 @@ enum GPIOInEdge { FALLING = 1; BOTH = 2; } -enum GPIONum { - NUM_1 = 0; - NUM_2 = 1; - NUM_3 = 2; - NUM_4 = 3; - NUM_5 = 4; - NUM_6 = 5; - NUM_7 = 6; - NUM_8 = 7; - NUM_9 = 8; - NUM_10 = 9; - NUM_11 = 10; - NUM_12 = 11; - NUM_13 = 12; - NUM_14 = 13; - NUM_15 = 14; - NUM_16 = 15; - NUM_17 = 16; - NUM_18 = 17; - NUM_19 = 18; - NUM_20 = 19; - NUM_21 = 20; - NUM_22 = 21; - NUM_23 = 22; - NUM_24 = 23; - NUM_25 = 24; - NUM_26 = 25; - NUM_27 = 26; - NUM_28 = 27; - NUM_29 = 28; - NUM_30 = 29; -} message TriggerGPIOIn { - GPIONum gpioNum = 1; + string gpio_name = 1; GPIOInPullUpDown pullUpDown = 2; GPIOInEdge gpioInEdge = 3; } @@ -337,7 +308,7 @@ enum GPIOOutValue { } message ActionGPIOOut { - GPIONum gpioNum = 1; + string gpio_name = 1; GPIOOutValue value = 2; } message ActionGroupSend { diff --git a/service/Event.go b/service/Event.go index 0b27e80..e221865 100644 --- a/service/Event.go +++ b/service/Event.go @@ -254,6 +254,39 @@ func ConstructEventTriggerGroupReceive(groupName string, value int32) *pb.Event } } +func ConstructEventTriggerGpioIn(gpioName string, level bool) *pb.Event { + return &pb.Event{ + Type: common_web.EVT_TRIGGER, + Values: []*pb.EventValue{ + {Val: &pb.EventValue_Tint64{Tint64: int64(common_web.TRIGGER_EVT_TYPE_GPIO_IN)}}, + {Val: &pb.EventValue_Tstring{Tstring: gpioName}}, + {Val: &pb.EventValue_Tbool{Tbool: level}}, + }, + } +} + +func DeconstructEventTriggerGpioIn(evt *pb.Event) (gpioName string, level bool, err error) { + e := errors.New("Malformed GpioEvent") + if evt.Type != common_web.EVT_TRIGGER { + err = e + return + } + if evTypeInt64,match := evt.Values[0].Val.(*pb.EventValue_Tint64); !match { + err = e + return + } else { + evType := common_web.EvtTriggerType(evTypeInt64.Tint64) + if evType != common_web.TRIGGER_EVT_TYPE_GPIO_IN { + err = e + return + } + } + + gpioName = evt.Values[1].GetTstring() + level = evt.Values[2].GetTbool() + return +} + func DeconstructEventTriggerGroupReceive(evt *pb.Event) (groupName string, value int32, err error) { e := errors.New("Malformed GroupReceiveEvent") if evt.Type != common_web.EVT_TRIGGER { diff --git a/service/SubSysGpio.go b/service/SubSysGpio.go index ee70ec8..891ad7d 100644 --- a/service/SubSysGpio.go +++ b/service/SubSysGpio.go @@ -1,86 +1,216 @@ package service import ( + "errors" + "fmt" + "periph.io/x/periph" + "periph.io/x/periph/conn/gpio" + "periph.io/x/periph/conn/gpio/gpioreg" + "periph.io/x/periph/conn/pin/pinreg" + "periph.io/x/periph/host" + "periph.io/x/periph/host/rpi" "sync" + pb "github.com/mame82/P4wnP1_go/proto" ) -type GpioPinState byte -const ( - GPIO_PIN_STATE_DISABLED GpioPinState = iota - GPIO_PIN_STATE_INPUT - GPIO_PIN_STATE_OUTPUT - //GPIO_PIN_STATE_PWM - //GPIO_PIN_STATE_CLOCK +/* +ToDo: Entprellen + StopAllEdgeDetecting (when new TriggerActionSet is deployed) +ToDo: If a single item of the trigger action set changes, all GPIOTriggers have to be re-enumearted, to assure that there's no edge detection running for a trigger which doesn't exist anymore + */ + +var ( + EGpioNotAvailable = errors.New("sub system GPIO not available") + EGpioPinInvalid = errors.New("invalid GPIO pin") ) -type GpioPin struct { - *sync.Mutex - Number pb.GPIONum - InUse bool - State GpioPinState - EdgeDetectState pb.GPIOInEdge - PullUpDown pb.GPIOInPullUpDown +type GpioManager struct { + availableGpioPins []gpio.PinIO + availableGpioNames []string + + rootSvc *Service + + edgeDetectingMutex *sync.Mutex + edgeDetecting map[gpio.PinIO]bool + + IsUsable bool + + *periph.State } -var PI_GPIO_NUMS = []pb.GPIONum{ - pb.GPIONum_NUM_2, //SDA1 - pb.GPIONum_NUM_3, //SCL1 - pb.GPIONum_NUM_4, - pb.GPIONum_NUM_5, - pb.GPIONum_NUM_6, - pb.GPIONum_NUM_7, //CE1 - pb.GPIONum_NUM_8, //CE0 - pb.GPIONum_NUM_9, //MISO - pb.GPIONum_NUM_10, //MOSI - pb.GPIONum_NUM_11, //SCLK - pb.GPIONum_NUM_12, - pb.GPIONum_NUM_13, - pb.GPIONum_NUM_14, //TXD0 - pb.GPIONum_NUM_15, //RXD0 - pb.GPIONum_NUM_16, - pb.GPIONum_NUM_17, - pb.GPIONum_NUM_18, - pb.GPIONum_NUM_19, - pb.GPIONum_NUM_20, - pb.GPIONum_NUM_21, - pb.GPIONum_NUM_22, - pb.GPIONum_NUM_23, - pb.GPIONum_NUM_24, - pb.GPIONum_NUM_25, - pb.GPIONum_NUM_26, - pb.GPIONum_NUM_27, +func (gm *GpioManager) Start() { + } -/* -var PI_GPIO_NUMS = []pb.GPIONum{ - pb.GPIONum_NUM_2, //SDA1 - pb.GPIONum_NUM_3, //SCL1 - pb.GPIONum_NUM_4, - pb.GPIONum_NUM_17, - pb.GPIONum_NUM_27, - pb.GPIONum_NUM_22, - pb.GPIONum_NUM_10, //MOSI - pb.GPIONum_NUM_9, //MISO - pb.GPIONum_NUM_11, //SCLK - pb.GPIONum_NUM_5, - pb.GPIONum_NUM_6, - pb.GPIONum_NUM_13, - pb.GPIONum_NUM_19, - pb.GPIONum_NUM_26, - pb.GPIONum_NUM_14, //TXD0 - pb.GPIONum_NUM_15, //RXD0 - pb.GPIONum_NUM_18, - pb.GPIONum_NUM_23, - pb.GPIONum_NUM_24, - pb.GPIONum_NUM_25, - pb.GPIONum_NUM_8, //CE0 - pb.GPIONum_NUM_7, //CE1 - pb.GPIONum_NUM_12, - pb.GPIONum_NUM_16, - pb.GPIONum_NUM_20, - pb.GPIONum_NUM_21, + +func (gm *GpioManager) Stop() { } -*/ -type GpioManager struct { - availableGpioPins []byte + + +func NewGpioManager(rootSvc *Service) (res *GpioManager) { + gm := &GpioManager{ + rootSvc: rootSvc, + } + state,err := host.Init() + if err != nil { + gm.IsUsable = false + return + } + + gm.State = state + gm.IsUsable = rpi.Present() + + gpios := gpioreg.All() + for _,g := range gpios { + if pinreg.IsConnected(g) { + gm.availableGpioPins = append(gm.availableGpioPins,g) + gm.availableGpioNames = append(gm.availableGpioNames, g.Name()) + } + } + + gm.edgeDetecting = make(map[gpio.PinIO]bool) + gm.edgeDetectingMutex = &sync.Mutex{} + + return gm } + +func (gm GpioManager) GetAvailableGpios() (res []gpio.PinIO, err error) { + if gm.IsUsable { + return gm.availableGpioPins,nil + } + return res,EGpioNotAvailable +} + +func (gm GpioManager) GetAvailableGpioNames() (res []string, err error) { + if gm.IsUsable { + return gm.availableGpioNames,nil + } + return res,EGpioNotAvailable +} + +func (gm *GpioManager) DeployGpioTrigger(in *pb.TriggerGPIOIn) (err error) { + if !gm.IsUsable { + return EGpioNotAvailable + } + + p := gpioreg.ByName(in.GpioName) + if p == nil { + return EGpioPinInvalid + } + + pull := gpio.Float + switch in.PullUpDown { + case pb.GPIOInPullUpDown_DOWN: + pull = gpio.PullDown + case pb.GPIOInPullUpDown_UP: + pull = gpio.PullUp + } + + edge := gpio.BothEdges + switch in.GpioInEdge { + case pb.GPIOInEdge_FALLING: + edge = gpio.FallingEdge + case pb.GPIOInEdge_RISING: + edge = gpio.RisingEdge + } + + // If edge detection is already running, stop it + if gm.isEdgeDetecting(p) { + gm.stopEdgeDetectionForPin(p) + } + + p.In(pull,edge) + + gm.edgeDetectingMutex.Lock() + gm.edgeDetecting[p] = true + gm.edgeDetectingMutex.Unlock() + + go func() { + for gm.isEdgeDetecting(p) { + p.WaitForEdge(-1) + + //Edge detected, check if still edge detecting before consuming + if gm.isEdgeDetecting(p) { + switch p.Read() { + case gpio.High: + fmt.Println("Gpio " + p.Name() + " changed to high") + gm.rootSvc.SubSysEvent.Emit(ConstructEventTriggerGpioIn(p.Name(), bool(gpio.High))) + case gpio.Low: + fmt.Println("Gpio " + p.Name() + " changed to low") + gm.rootSvc.SubSysEvent.Emit(ConstructEventTriggerGpioIn(p.Name(), bool(gpio.Low))) + } + + } else { + //exit for loop + break + } + } + gm.edgeDetectingMutex.Lock() + delete(gm.edgeDetecting, p) + gm.edgeDetectingMutex.Unlock() + }() + + + return nil +} + +func (gm *GpioManager) FireGpioAction(out *pb.ActionGPIOOut) (err error) { + if !gm.IsUsable { + return EGpioNotAvailable + } + + p := gpioreg.ByName(out.GpioName) + if p == nil { + return EGpioPinInvalid + } + + // If edge detection is already running, stop it + if gm.isEdgeDetecting(p) { + gm.stopEdgeDetectionForPin(p) + } + + + level := gpio.Low + switch out.Value { + case pb.GPIOOutValue_HIGH: + level = gpio.High + case pb.GPIOOutValue_TOGGLE: + if p.Read() == gpio.Low { + level = gpio.High + } + } + + p.Out(level) + + return nil +} + + + +func (gm *GpioManager) isEdgeDetecting(p gpio.PinIO) bool { + fmt.Println("Check edge detection for " + p.Name()) + gm.edgeDetectingMutex.Lock() + defer gm.edgeDetectingMutex.Unlock() + if _,exists := gm.edgeDetecting[p]; exists && gm.edgeDetecting[p] { + fmt.Println("Edge detection for " + p.Name() + " running") + return true + } + fmt.Println("Edge detection for " + p.Name() + " not running") + return false +} + +func (gm *GpioManager) stopEdgeDetectionForPin(p gpio.PinIO) { + gm.edgeDetectingMutex.Lock() + if _,exists := gm.edgeDetecting[p]; exists { + gm.edgeDetecting[p] = false + } + gm.edgeDetectingMutex.Unlock() + + //write high/low till gpio is deleted from map, to assure pending edge detection ended + for gm.isEdgeDetecting(p) { + p.Out(gpio.High) + if gm.isEdgeDetecting(p) { + p.Out(gpio.Low) + } + } + +} \ No newline at end of file diff --git a/service/SubSysTriggerAction.go b/service/SubSysTriggerAction.go index 2af0a80..f3d55ed 100644 --- a/service/SubSysTriggerAction.go +++ b/service/SubSysTriggerAction.go @@ -252,8 +252,18 @@ func (tam *TriggerActionManager) onUsbGadgetDisconnected(evt *pb.Event, ta *pb.T } func (tam *TriggerActionManager) onGpioIn(evt *pb.Event, ta *pb.TriggerAction, tt triggerType, at actionType) error { - //ToDo: only trigger if PIN matches, important: Enum values have to be parsed for matching (0 != PIN0) + evtGpioName, evtGpioLevel,err := DeconstructEventTriggerGpioIn(evt) + if err != nil { return err } + + taGpioName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName + + if taGpioName != evtGpioName { + return nil // ignore + } + tam.executeAction(evt, ta, tt, at) + fmt.Printf("Gpio in trigger '%s' new state: %v\n", evtGpioName, evtGpioLevel) + return nil } @@ -380,10 +390,10 @@ func (tam *TriggerActionManager) executeActionGPIOOut(evt *pb.Event, ta *pb.Trig triggerName := triggerTypeString[tt] actionName := actionTypeString[at] - gpioNumName := pb.GPIONum_name[int32(action.GpioNum)] + gpioNumName := action.GpioName fmt.Printf("Trigger '%s' fired -> executing action '%s' ('%s')\n", triggerName, actionName, gpioNumName) - // ToDo: Implement + tam.rootSvc.SubSysGpio.FireGpioAction(action) } func (tam *TriggerActionManager) executeActionGroupSend(evt *pb.Event, ta *pb.TriggerAction, tt triggerType, at actionType, action *pb.ActionGroupSend) { @@ -408,9 +418,14 @@ func (tam *TriggerActionManager) executeActionStartHidScript(evt *pb.Event, ta * switch tt { case triggerTypeGpioIn: - gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum - gpioPinName := pb.GPIONum_name[int32(gpioPin)] + gpioPinName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName preScript += fmt.Sprintf("var GPIO_PIN='%s';\n", gpioPinName) + _,level,_ := DeconstructEventTriggerGpioIn(evt) + if level { + preScript += fmt.Sprintf("var GPIO_LEVEL=true;\n") + } else { + preScript += fmt.Sprintf("var GPIO_LEVEL=false;\n") + } case triggerTypeGroupReceiveMulti: groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.GroupName values := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.Values @@ -479,9 +494,14 @@ func (tam *TriggerActionManager) executeActionBashScript(evt *pb.Event, ta *pb.T switch tt { case triggerTypeGpioIn: - gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum - gpioPinName := pb.GPIONum_name[int32(gpioPin)] + gpioPinName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName env = append(env, fmt.Sprintf("GPIO_PIN=%s", gpioPinName)) + _,level,_ := DeconstructEventTriggerGpioIn(evt) + if level { + env = append(env, fmt.Sprintf("GPIO_LEVEL='HIGH'")) + } else { + env = append(env, fmt.Sprintf("GPIO_LEVEL='LOW'")) + } case triggerTypeGroupReceiveMulti: groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.GroupName values := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.Values @@ -533,9 +553,9 @@ func (tam *TriggerActionManager) executeActionLog(evt *pb.Event, ta *pb.TriggerA switch tt { case triggerTypeGpioIn: - gpioPin := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioNum - gpioPinName := pb.GPIONum_name[int32(gpioPin)] - logMessage += fmt.Sprintf(" (GPIO_PIN=%s)", gpioPinName) + gpioPinName := ta.Trigger.(*pb.TriggerAction_GpioIn).GpioIn.GpioName + _,level,_ := DeconstructEventTriggerGpioIn(evt) + logMessage += fmt.Sprintf(" (GPIO_PIN=%s GPIO_HIGH=%v)", gpioPinName, level) case triggerTypeGroupReceiveMulti: groupName := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.GroupName values := ta.Trigger.(*pb.TriggerAction_GroupReceiveMulti).GroupReceiveMulti.Values @@ -636,6 +656,11 @@ func (tam *TriggerActionManager) AddTriggerAction(ta *pb.TriggerAction) (taAdded tam.groupReceiveSequenceCheckersMutex.Unlock() } + //if trigger is GpioIn, configure GPIO + if triggerGpioIn,match := ta.Trigger.(*pb.TriggerAction_GpioIn); match { + tam.rootSvc.SubSysGpio.DeployGpioTrigger(triggerGpioIn.GpioIn) + } + return taAdded,nil } diff --git a/service/rpc_server.go b/service/rpc_server.go index 24c38cb..2f793da 100644 --- a/service/rpc_server.go +++ b/service/rpc_server.go @@ -51,6 +51,12 @@ type server struct { listenAddrWeb string } +func (s *server) GetAvailableGpios(context.Context, *pb.Empty) (res *pb.StringMessageArray, err error) { + res = &pb.StringMessageArray{} + res.MsgArray,err = s.rootSvc.SubSysGpio.GetAvailableGpioNames() + return +} + func (s *server) DeployMasterTemplate(ctx context.Context, mt *pb.MasterTemplate) (e *pb.Empty, err error) { e = &pb.Empty{} diff --git a/service/service.go b/service/service.go index 4d26728..48dc315 100644 --- a/service/service.go +++ b/service/service.go @@ -121,6 +121,7 @@ type Service struct { SubSysBluetooth *BtService SubSysRPC *server SubSysTriggerActions *TriggerActionManager + SubSysGpio *GpioManager SubSysDwc2ConnectWatcher *Dwc2ConnectWatcher } @@ -148,12 +149,16 @@ func NewService() (svc *Service, err error) { svc.SubSysWifi = NewWifiService(svc) //Depends on NetworkSubSys - svc.SubSysTriggerActions = NewTriggerActionManager(svc) //Depends on EventManager, UsbGadgetManager (to trigger HID scripts) + svc.SubSysGpio = NewGpioManager(svc) //Depends on event subsys + + svc.SubSysTriggerActions = NewTriggerActionManager(svc) //Depends on EventManager, UsbGadgetManager (to trigger HID scripts) and GpioManager svc.SubSysDwc2ConnectWatcher = NewDwc2ConnectWatcher(svc) // Depends on EventManager, should be started before USB gadget settings are deployed (to avoid missing initial state change) svc.SubSysBluetooth = NewBtService(svc, time.Second * 120) //Depends on NetworkSubSys (try to bring up bluetooth for up to 120s in background) + + svc.SubSysRPC = NewRpcServerService(svc) //Depends on all other return } @@ -163,6 +168,7 @@ func (s *Service) Start() { s.SubSysEvent.Start() s.SubSysDwc2ConnectWatcher.Start() + s.SubSysGpio.Start() s.SubSysLed.Start() s.SubSysRPC.StartRpcServerAndWeb("0.0.0.0", "50051", "8000", PATH_WEBROOT) //start gRPC service log.Println("Starting TriggerAction event listener ...") @@ -192,7 +198,7 @@ func (s *Service) Start() { func (s *Service) Stop() { s.SubSysTriggerActions.Stop() s.SubSysLed.Stop() - + s.SubSysGpio.Stop() s.SubSysBluetooth.Stop() s.SubSysDwc2ConnectWatcher.Stop() s.SubSysEvent.Stop() diff --git a/web_client/hvueComponentsTriggerActions.go b/web_client/hvueComponentsTriggerActions.go index 3e98f08..feb6cd1 100644 --- a/web_client/hvueComponentsTriggerActions.go +++ b/web_client/hvueComponentsTriggerActions.go @@ -78,19 +78,20 @@ func generateSelectOptionsGPIOOutValue() *js.Object { return tts } -func generateSelectOptionsGPIONum() *js.Object { +func generateSelectOptionsGPIONames(vm *hvue.VM) *js.Object { tts := js.Global.Get("Array").New() type option struct { *js.Object Label string `js:"label"` - Value GPIONum `js:"value"` + Value string `js:"value"` } - for _, value := range availableGPIONums { - label := gpioNumNames[value] + gpioNames := vm.Store.Get("state").Get("GpioNamesList") + for i := 0; i < gpioNames.Length(); i++ { + gpioName := gpioNames.Index(i).String() o := option{Object:O()} - o.Value = value - o.Label = label + o.Value = gpioName + o.Label = gpioName tts.Call("push", o) } return tts @@ -283,7 +284,7 @@ func InitComponentsTriggerActions() { case ta.IsTriggerGPIOIn(): t := jsTriggerGPIOIn{Object: ta.TriggerData} strTrigger += " (" - strTrigger += gpioNumNames[t.GpioNum] + strTrigger += t.GpioName strTrigger += ": " + gpioInEdgeNames[t.Edge] strTrigger += ", resistor: " + gpioInPullUpDownNames[t.PullUpDown] strTrigger += ")" @@ -304,7 +305,7 @@ func InitComponentsTriggerActions() { case ta.IsActionGPIOOut(): a := jsActionGPIOOut{Object: ta.ActionData} strAction += " (" - strAction += gpioNumNames[a.GpioNum] + strAction += a.GpioName strAction += ": " + gpioOutValueNames[a.Value] strAction += ")" case ta.IsActionBashScript(): @@ -392,8 +393,8 @@ func InitComponentsTriggerActions() { hvue.Computed("edge", func(vm *hvue.VM) interface{} { return generateSelectOptionsGPIOInEdges() }), - hvue.Computed("gpionum", func(vm *hvue.VM) interface{} { - return generateSelectOptionsGPIONum() + hvue.Computed("gpioname", func(vm *hvue.VM) interface{} { + return generateSelectOptionsGPIONames(vm) }), hvue.ComputedWithGetSet( "triggerType", @@ -554,8 +555,8 @@ func InitComponentsTriggerActions() { hvue.Computed("gpiooutvalues", func(vm *hvue.VM) interface{} { return generateSelectOptionsGPIOOutValue() }), - hvue.Computed("gpionum", func(vm *hvue.VM) interface{} { - return generateSelectOptionsGPIONum() + hvue.Computed("gpioname", func(vm *hvue.VM) interface{} { + return generateSelectOptionsGPIONames(vm) }), hvue.Computed("templatetypes", func(vm *hvue.VM) interface{} { return generateSelectOptionsTemplateTypes() @@ -742,7 +743,7 @@ const templateTrigger = ` GPIO Number The number of the GPIO to monitor - + @@ -810,7 +811,7 @@ const templateAction = ` GPIO Number The number of the GPIO to output on - + diff --git a/web_client/jsDataTriggerAction.go b/web_client/jsDataTriggerAction.go index 3746b03..5ffb43c 100644 --- a/web_client/jsDataTriggerAction.go +++ b/web_client/jsDataTriggerAction.go @@ -114,7 +114,7 @@ func (dst *jsTriggerAction) fromGo(src *pb.TriggerAction) { dst.ChangeActionType(ActionGPIOOut) dstAction := &jsActionGPIOOut{Object: dst.ActionData} dstAction.Value = GPIOOutValue(srcAction.GpioOut.Value) - dstAction.GpioNum = GPIONum(srcAction.GpioOut.GpioNum) + dstAction.GpioName = srcAction.GpioOut.GpioName case *pb.TriggerAction_GroupSend: dst.ChangeActionType(ActionGroupSend) dstAction := &jsActionGroupSend{Object: dst.ActionData} @@ -146,7 +146,7 @@ func (dst *jsTriggerAction) fromGo(src *pb.TriggerAction) { case *pb.TriggerAction_GpioIn: dst.ChangeTriggerType(TriggerGPIOIn) dstTrigger := &jsTriggerGPIOIn{Object: dst.TriggerData} - dstTrigger.GpioNum = GPIONum(srcTrigger.GpioIn.GpioNum) + dstTrigger.GpioName = srcTrigger.GpioIn.GpioName dstTrigger.Edge = GPIOInEdge(srcTrigger.GpioIn.GpioInEdge) dstTrigger.PullUpDown = GPIOInPullUpDown(srcTrigger.GpioIn.PullUpDown) case *pb.TriggerAction_GroupReceive: @@ -206,7 +206,7 @@ func (ta *jsTriggerAction) toGo() (res *pb.TriggerAction) { actionData := &jsActionGPIOOut{Object: ta.ActionData} res.Action = &pb.TriggerAction_GpioOut{ GpioOut: &pb.ActionGPIOOut{ - GpioNum: pb.GPIONum(actionData.GpioNum), + GpioName: actionData.GpioName, Value: pb.GPIOOutValue(actionData.Value), }, } @@ -261,7 +261,7 @@ func (ta *jsTriggerAction) toGo() (res *pb.TriggerAction) { triggerData := &jsTriggerGPIOIn{Object: ta.TriggerData} res.Trigger = &pb.TriggerAction_GpioIn{ GpioIn: &pb.TriggerGPIOIn{ - GpioNum: pb.GPIONum(triggerData.GpioNum), + GpioName: triggerData.GpioName, PullUpDown: pb.GPIOInPullUpDown(triggerData.PullUpDown), GpioInEdge: pb.GPIOInEdge(triggerData.Edge), }, @@ -314,7 +314,7 @@ func (ta *jsTriggerAction) ChangeActionType(newAt actionType) { data = d.Object case ActionGPIOOut: d := &jsActionGPIOOut{Object:O()} - d.GpioNum = 1 + d.GpioName = "" d.Value = GPIOOutValueHigh data = d.Object case ActionGroupSend: @@ -381,7 +381,7 @@ func (ta *jsTriggerAction) ChangeTriggerType(newTt triggerType) { case TriggerGPIOIn: d := &jsTriggerGPIOIn{Object:O()} d.Edge = GPIOInEdgeRising - d.GpioNum = 2 + d.GpioName = "" d.PullUpDown = GPIOInPullUp data = d.Object case TriggerGroupReceive: @@ -505,7 +505,7 @@ var availableGroupReceiveMulti = []GroupReceiveMultiType{GroupReceiveMultiType_S type jsTriggerGPIOIn struct { *js.Object - GpioNum GPIONum `js:"GpioNum"` + GpioName string `js:"GpioName"` PullUpDown GPIOInPullUpDown `js:"PullUpDown"` //PullUp resistor, pull down otherwise Edge GPIOInEdge `js:"Edge"` // 0 == GPIO.RISING, 1 == GPIO.FALLING, every value > 1 == GPIO.BOTH } @@ -546,7 +546,7 @@ type jsActionDeploySettingsTemplate struct { } type jsActionGPIOOut struct { *js.Object - GpioNum GPIONum `js:"GpioNum"` + GpioName string `js:"GpioName"` Value GPIOOutValue `js:"Value"` //PullUp resistor, pull down otherwise } type GPIOOutValue int @@ -570,53 +570,6 @@ type jsActionLog struct { *js.Object } -type GPIONum int -const GPIO_NUM_1 = GPIONum(pb.GPIONum_NUM_1) -const GPIO_NUM_2 = GPIONum(pb.GPIONum_NUM_2) -const GPIO_NUM_3 = GPIONum(pb.GPIONum_NUM_3) -const GPIO_NUM_4 = GPIONum(pb.GPIONum_NUM_4) -const GPIO_NUM_5 = GPIONum(pb.GPIONum_NUM_5) -const GPIO_NUM_6 = GPIONum(pb.GPIONum_NUM_6) -const GPIO_NUM_7 = GPIONum(pb.GPIONum_NUM_7) -const GPIO_NUM_8 = GPIONum(pb.GPIONum_NUM_8) -const GPIO_NUM_9 = GPIONum(pb.GPIONum_NUM_9) -const GPIO_NUM_10 = GPIONum(pb.GPIONum_NUM_10) -const GPIO_NUM_11 = GPIONum(pb.GPIONum_NUM_11) -const GPIO_NUM_12 = GPIONum(pb.GPIONum_NUM_12) -const GPIO_NUM_13 = GPIONum(pb.GPIONum_NUM_13) -const GPIO_NUM_14 = GPIONum(pb.GPIONum_NUM_14) -const GPIO_NUM_15 = GPIONum(pb.GPIONum_NUM_15) -const GPIO_NUM_16 = GPIONum(pb.GPIONum_NUM_16) -const GPIO_NUM_17 = GPIONum(pb.GPIONum_NUM_17) -const GPIO_NUM_18 = GPIONum(pb.GPIONum_NUM_18) -const GPIO_NUM_19 = GPIONum(pb.GPIONum_NUM_19) -const GPIO_NUM_20 = GPIONum(pb.GPIONum_NUM_20) -var gpioNumNames = map[GPIONum]string{ - GPIO_NUM_1: "GPIO 1", - GPIO_NUM_2: "GPIO 2", - GPIO_NUM_3: "GPIO 3", - GPIO_NUM_4: "GPIO 4", - GPIO_NUM_5: "GPIO 5", - GPIO_NUM_6: "GPIO 6", - GPIO_NUM_7: "GPIO 7", - GPIO_NUM_8: "GPIO 8", - GPIO_NUM_9: "GPIO 9", - GPIO_NUM_10: "GPIO 10", - GPIO_NUM_11: "GPIO 11", - GPIO_NUM_12: "GPIO 12", - GPIO_NUM_13: "GPIO 13", - GPIO_NUM_14: "GPIO 14", - GPIO_NUM_15: "GPIO 15", - GPIO_NUM_16: "GPIO 16", - GPIO_NUM_17: "GPIO 17", - GPIO_NUM_18: "GPIO 18", - GPIO_NUM_19: "GPIO 19", - GPIO_NUM_20: "GPIO 20", -} -var availableGPIONums = []GPIONum{ - GPIO_NUM_1, GPIO_NUM_2, GPIO_NUM_3, GPIO_NUM_4, GPIO_NUM_5, GPIO_NUM_6, GPIO_NUM_7, GPIO_NUM_8, GPIO_NUM_9, GPIO_NUM_10, - GPIO_NUM_11, GPIO_NUM_12, GPIO_NUM_13, GPIO_NUM_14, GPIO_NUM_15, GPIO_NUM_16, GPIO_NUM_17, GPIO_NUM_18, GPIO_NUM_19, GPIO_NUM_20, -} type TemplateType int const TemplateTypeFullSettings = TemplateType(pb.ActionDeploySettingsTemplate_FULL_SETTINGS) diff --git a/web_client/mvuexGlobalState.go b/web_client/mvuexGlobalState.go index 01eeebc..9985693 100644 --- a/web_client/mvuexGlobalState.go +++ b/web_client/mvuexGlobalState.go @@ -123,6 +123,9 @@ const ( VUEX_MUTATION_SET_STORED_MASTER_TEMPLATE_LIST = "setStoredMasterTemplateList" + //GPIO + VUEX_ACTION_UPDATE_GPIO_NAMES_LIST = "updateGpioNamesList" + VUEX_MUTATION_SET_GPIO_NAMES_LIST = "setStoredGpioNamesList" //Bash scripts (used by TriggerActions) VUEX_ACTION_UPDATE_STORED_BASH_SCRIPTS_LIST = "updateStoredBashScriptsList" @@ -161,6 +164,7 @@ type GlobalState struct { StoredUSBSettingsList []string `js:"StoredUSBSettingsList"` StoredBluetoothSettingsList []string `js:"StoredBluetoothSettingsList"` StoredMasterTemplateList []string `js:"StoredMasterTemplateList"` + GpioNamesList []string `js:"GpioNamesList"` ConnectRetryCount int `js:"ConnectRetryCount"` EventListenerRunning bool `js:"EventListenerRunning"` @@ -191,6 +195,7 @@ func createGlobalStateStruct() GlobalState { state.StoredUSBSettingsList = []string{} state.StoredBluetoothSettingsList = []string{} state.StoredMasterTemplateList = []string{} + state.GpioNamesList = []string{} //Retrieve Interface settings state.InterfaceSettings = NewEthernetSettingsList() @@ -277,6 +282,26 @@ func actionUpdateAllStates(store *mvuex.Store, context *mvuex.ActionContext, sta } +func actionUpdateGpioNamesList(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState) { + go func() { + println("Trying to fetch GPIO names list") + //fetch deployed gadget settings + gpioList, err := RpcClient.GetGpioNamesList(defaultTimeout) + if err != nil { + println("Couldn't retrieve GPIO names list") + return + } + + //commit to current + + context.Commit(VUEX_MUTATION_SET_GPIO_NAMES_LIST, gpioList) + }() + + return +} + + + func actionDeployMasterTemplate(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState, mt *jsMasterTemplate) { go func() { println("Vuex dispatch " + VUEX_ACTION_DEPLOY_MASTER_TEMPLATE) @@ -1364,8 +1389,13 @@ func initMVuex() *mvuex.Store { mvuex.Mutation(VUEX_MUTATION_SET_STORED_MASTER_TEMPLATE_LIST, func(store *mvuex.Store, state *GlobalState, mtList []interface{}) { hvue.Set(state, "StoredMasterTemplateList", mtList) }), + mvuex.Mutation(VUEX_MUTATION_SET_GPIO_NAMES_LIST, func(store *mvuex.Store, state *GlobalState, mtList []interface{}) { + hvue.Set(state, "GpioNamesList", mtList) + }), + mvuex.Action(VUEX_ACTION_UPDATE_GPIO_NAMES_LIST, actionUpdateGpioNamesList), + mvuex.Action(VUEX_ACTION_DEPLOY_MASTER_TEMPLATE, actionDeployMasterTemplate), mvuex.Action(VUEX_ACTION_UPDATE_STORED_MASTER_TEMPLATE_LIST, actionUpdateStoredMasterTemplateList), mvuex.Action(VUEX_ACTION_STORE_MASTER_TEMPLATE, actionStoreMasterTemplate), @@ -1498,6 +1528,7 @@ func initMVuex() *mvuex.Store { store.Dispatch(VUEX_ACTION_START_EVENT_LISTEN) + store.Dispatch(VUEX_ACTION_UPDATE_GPIO_NAMES_LIST) //Should be done one time at store start (not intended to change) /* // fetch deployed gadget settings store.Dispatch(VUEX_ACTION_UPDATE_CURRENT_USB_SETTINGS) diff --git a/web_client/rpcClient.go b/web_client/rpcClient.go index 9aee68f..986ded4 100644 --- a/web_client/rpcClient.go +++ b/web_client/rpcClient.go @@ -29,6 +29,17 @@ func NewRpcClient(addr string) Rpc { return rcl } +func (rpc *Rpc) GetGpioNamesList(timeout time.Duration) (ws []string, err error) { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + ma, err := rpc.Client.GetAvailableGpios(ctx, &pb.Empty{}) + if err != nil { return ws, err } + return ma.MsgArray, err +} + + + func (rpc *Rpc) DeployMasterTemplate(timeout time.Duration, mt *pb.MasterTemplate) (err error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel()