From cff7d2f6936fdc677cf86892cb07dbab15341f80 Mon Sep 17 00:00:00 2001 From: Sale Djenic Date: Mon, 5 Jun 2023 13:10:26 +0200 Subject: [PATCH] fix: profile social links updated --- VERSION | 2 +- appdatabase/migrations/bindata.go | 503 ++++++++++-------- ...73_add_profile_links_settings_table.up.sql | 30 ++ .../settings_social_links/database.go | 156 +++--- .../settings_social_links/database_test.go | 258 ++++++--- protocol/identity/social_links.go | 69 ++- protocol/identity/social_links_test.go | 4 +- protocol/messenger.go | 106 ++-- protocol/messenger_backup.go | 18 +- protocol/messenger_backup_handler.go | 14 +- protocol/messenger_backup_test.go | 45 +- protocol/messenger_handler.go | 4 +- protocol/messenger_identity.go | 50 +- .../messenger_identity_social_links_test.go | 217 ++++++++ protocol/messenger_response.go | 27 +- protocol/messenger_sync_raw_messages.go | 8 +- protocol/persistence.go | 2 +- .../application_metadata_message.pb.go | 120 ++--- .../application_metadata_message.proto | 2 +- protocol/protobuf/pairing.pb.go | 451 ++++++++-------- protocol/protobuf/pairing.proto | 12 +- protocol/v1/status_message.go | 4 +- protocol/wakusync/profile_response.go | 4 +- server/pairing/sync_device_test.go | 18 +- services/accounts/settings.go | 14 +- 25 files changed, 1324 insertions(+), 814 deletions(-) create mode 100644 appdatabase/migrations/sql/1685880973_add_profile_links_settings_table.up.sql create mode 100644 protocol/messenger_identity_social_links_test.go diff --git a/VERSION b/VERSION index 0ad5d4cba..25fa6c046 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.154.5 +0.154.7 \ No newline at end of file diff --git a/appdatabase/migrations/bindata.go b/appdatabase/migrations/bindata.go index 5e26ef505..47f7a40de 100644 --- a/appdatabase/migrations/bindata.go +++ b/appdatabase/migrations/bindata.go @@ -65,6 +65,7 @@ // 1685041348_settings_table_add_latest_derived_path_column.up.sql (115B) // 1685440989_update_color_id_accounts.up.sql (918B) // 1685463947_add_to_asset_to_multitransaction.up.sql (61B) +// 1685880973_add_profile_links_settings_table.up.sql (1.254kB) // doc.go (74B) package migrations @@ -75,6 +76,7 @@ import ( "crypto/sha256" "fmt" "io" + "io/ioutil" "os" "path/filepath" "strings" @@ -84,7 +86,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } var buf bytes.Buffer @@ -92,7 +94,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("read %q: %w", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } if clErr != nil { return nil, err @@ -148,7 +150,7 @@ func _1640111208_dummyUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1640111208_dummy.up.sql", size: 258, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1640111208_dummy.up.sql", size: 258, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xf0, 0xae, 0x20, 0x6e, 0x75, 0xd1, 0x36, 0x14, 0xf2, 0x40, 0xe5, 0xd6, 0x7a, 0xc4, 0xa5, 0x72, 0xaa, 0xb5, 0x4d, 0x71, 0x97, 0xb8, 0xe8, 0x95, 0x22, 0x95, 0xa2, 0xac, 0xaf, 0x48, 0x58}} return a, nil } @@ -168,7 +170,7 @@ func _1642666031_add_removed_clock_to_bookmarksUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1642666031_add_removed_clock_to_bookmarks.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1642666031_add_removed_clock_to_bookmarks.up.sql", size: 117, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x84, 0x4e, 0x38, 0x99, 0x7a, 0xc, 0x90, 0x13, 0xec, 0xfe, 0x2f, 0x55, 0xff, 0xb7, 0xb6, 0xaa, 0x96, 0xc6, 0x92, 0x79, 0xcc, 0xee, 0x4e, 0x99, 0x53, 0xfe, 0x1c, 0xbb, 0x32, 0x2, 0xa4, 0x27}} return a, nil } @@ -188,7 +190,7 @@ func _1643644541_gif_api_key_settingUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1643644541_gif_api_key_setting.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1643644541_gif_api_key_setting.up.sql", size: 108, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1b, 0x94, 0x28, 0xfb, 0x66, 0xd1, 0x7c, 0xb8, 0x89, 0xe2, 0xb4, 0x71, 0x65, 0x24, 0x57, 0x22, 0x95, 0x38, 0x97, 0x3, 0x9b, 0xc6, 0xa4, 0x41, 0x7b, 0xba, 0xf7, 0xdb, 0x70, 0xf7, 0x20, 0x3a}} return a, nil } @@ -208,7 +210,7 @@ func _1644188994_recent_stickersUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1644188994_recent_stickers.up.sql", size: 79, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1644188994_recent_stickers.up.sql", size: 79, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1e, 0xad, 0xaa, 0x30, 0xbf, 0x4, 0x7, 0xf8, 0xc3, 0x3, 0xb8, 0x97, 0x23, 0x2b, 0xbd, 0x1c, 0x60, 0x69, 0xb0, 0x42, 0x5e, 0x6b, 0xd, 0xa7, 0xa3, 0x6b, 0x2e, 0xdc, 0x70, 0x13, 0x72, 0x7}} return a, nil } @@ -228,7 +230,7 @@ func _1646659233_add_address_to_dapp_permisssionUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1646659233_add_address_to_dapp_permisssion.up.sql", size: 700, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1646659233_add_address_to_dapp_permisssion.up.sql", size: 700, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xed, 0xb0, 0x35, 0xcc, 0x2e, 0x16, 0xe6, 0x15, 0x86, 0x2c, 0x37, 0x80, 0xae, 0xa3, 0xc5, 0x31, 0x78, 0x5, 0x9d, 0xcd, 0x7b, 0xeb, 0x5f, 0xf2, 0xb3, 0x74, 0x72, 0xdf, 0xcf, 0x88, 0xb, 0x40}} return a, nil } @@ -248,7 +250,7 @@ func _1646841105_add_emoji_accountUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1646841105_add_emoji_account.up.sql", size: 96, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1646841105_add_emoji_account.up.sql", size: 96, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe6, 0x77, 0x29, 0x95, 0x18, 0x64, 0x82, 0x63, 0xe7, 0xaf, 0x6c, 0xa9, 0x15, 0x7d, 0x46, 0xa6, 0xbc, 0xdf, 0xa7, 0xd, 0x2b, 0xd2, 0x2d, 0x97, 0x4d, 0xa, 0x6b, 0xd, 0x6e, 0x90, 0x42, 0x5c}} return a, nil } @@ -268,7 +270,7 @@ func _1647278782_display_nameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1647278782_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1647278782_display_name.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xa1, 0x1f, 0x3e, 0x61, 0x65, 0x8d, 0xff, 0xee, 0xde, 0xc5, 0x91, 0xd9, 0x5c, 0xb5, 0xe2, 0xf0, 0xb7, 0xe7, 0x5c, 0x5c, 0x16, 0x25, 0x89, 0xee, 0x78, 0x12, 0xea, 0x3e, 0x48, 0x41, 0xa6}} return a, nil } @@ -288,7 +290,7 @@ func _1647862838_reset_last_backupUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1647862838_reset_last_backup.up.sql", size: 37, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1647862838_reset_last_backup.up.sql", size: 37, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0xe3, 0xd5, 0xf6, 0x5f, 0xfe, 0x65, 0xfa, 0x1d, 0x88, 0xf8, 0x5f, 0x24, 0x71, 0x34, 0x68, 0x96, 0x2a, 0x60, 0x87, 0x15, 0x82, 0x4d, 0x8a, 0x59, 0x3d, 0x1f, 0xd8, 0x56, 0xd4, 0xfb, 0xda}} return a, nil } @@ -308,7 +310,7 @@ func _1647871652_add_settings_sync_clock_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1647871652_add_settings_sync_clock_table.up.sql", size: 1044, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1647871652_add_settings_sync_clock_table.up.sql", size: 1044, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0x58, 0xec, 0x85, 0x90, 0xfa, 0x30, 0x98, 0x98, 0x9a, 0xa6, 0xa8, 0x96, 0x2b, 0x38, 0x93, 0xf3, 0xae, 0x46, 0x74, 0xa4, 0x41, 0x62, 0x9b, 0x2, 0x86, 0xbf, 0xe5, 0x2a, 0xce, 0xe2, 0xc0}} return a, nil } @@ -328,7 +330,7 @@ func _1647880168_add_torrent_configUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1647880168_add_torrent_config.up.sql", size: 211, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1647880168_add_torrent_config.up.sql", size: 211, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1, 0x92, 0x22, 0x37, 0x96, 0xf3, 0xb5, 0x5b, 0x27, 0xd0, 0x7d, 0x43, 0x5, 0x4e, 0x9d, 0xe2, 0x49, 0xbe, 0x86, 0x31, 0xa1, 0x89, 0xff, 0xd6, 0x51, 0xe0, 0x9c, 0xb, 0xda, 0xfc, 0xf2, 0x93}} return a, nil } @@ -348,7 +350,7 @@ func _1647882837_add_communities_settings_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1647882837_add_communities_settings_table.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1647882837_add_communities_settings_table.up.sql", size: 206, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbd, 0x87, 0x78, 0x99, 0xd9, 0x5d, 0xbd, 0xf7, 0x57, 0x9c, 0xca, 0x97, 0xbd, 0xb3, 0xe9, 0xb5, 0x89, 0x31, 0x3f, 0xf6, 0x5c, 0x13, 0xb, 0xc3, 0x54, 0x93, 0x18, 0x40, 0x7, 0x82, 0xfe, 0x7e}} return a, nil } @@ -368,7 +370,7 @@ func _1647956635_add_waku_messages_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1647956635_add_waku_messages_table.up.sql", size: 266, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1647956635_add_waku_messages_table.up.sql", size: 266, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0xe, 0xe1, 0xdc, 0xda, 0x2e, 0x89, 0x8d, 0xdc, 0x2a, 0x1c, 0x13, 0xa1, 0xfc, 0xfe, 0xf, 0xb2, 0xb9, 0x85, 0xc8, 0x45, 0xd6, 0xd1, 0x7, 0x5c, 0xa3, 0x8, 0x47, 0x44, 0x6d, 0x96, 0xe0}} return a, nil } @@ -388,7 +390,7 @@ func _1648554928_network_testUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1648554928_network_test.up.sql", size: 132, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1648554928_network_test.up.sql", size: 132, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9a, 0xc5, 0x7f, 0x87, 0xf3, 0x2c, 0xf7, 0xbb, 0xd3, 0x3a, 0x4e, 0x76, 0x88, 0xca, 0xaf, 0x73, 0xce, 0x8f, 0xa1, 0xf6, 0x3d, 0x4d, 0xed, 0x6f, 0x49, 0xf2, 0xfe, 0x56, 0x2a, 0x60, 0x68, 0xca}} return a, nil } @@ -408,7 +410,7 @@ func _1649174829_add_visitble_tokenUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1649174829_add_visitble_token.up.sql", size: 84, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1649174829_add_visitble_token.up.sql", size: 84, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa3, 0x22, 0xc0, 0x2b, 0x3f, 0x4f, 0x3d, 0x5e, 0x4c, 0x68, 0x7c, 0xd0, 0x15, 0x36, 0x9f, 0xec, 0xa1, 0x2a, 0x7b, 0xb4, 0xe3, 0xc6, 0xc9, 0xb4, 0x81, 0x50, 0x4a, 0x11, 0x3b, 0x35, 0x7, 0xcf}} return a, nil } @@ -428,7 +430,7 @@ func _1649882262_add_derived_from_accountsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1649882262_add_derived_from_accounts.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1649882262_add_derived_from_accounts.up.sql", size: 110, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x11, 0xb9, 0x44, 0x4d, 0x85, 0x8d, 0x7f, 0xb4, 0xae, 0x4f, 0x5c, 0x66, 0x64, 0xb6, 0xe2, 0xe, 0x3d, 0xad, 0x9d, 0x8, 0x4f, 0xab, 0x6e, 0xa8, 0x7d, 0x76, 0x3, 0xad, 0x96, 0x1, 0xee, 0x5c}} return a, nil } @@ -448,7 +450,7 @@ func _1650612625_add_community_message_archive_hashes_tableUpSql() (*asset, erro return nil, err } - info := bindataFileInfo{name: "1650612625_add_community_message_archive_hashes_table.up.sql", size: 130, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1650612625_add_community_message_archive_hashes_table.up.sql", size: 130, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0x31, 0xb3, 0x75, 0x23, 0xe2, 0x45, 0xe, 0x47, 0x1b, 0x35, 0xa5, 0x6e, 0x83, 0x4e, 0x64, 0x7d, 0xd7, 0xa2, 0xda, 0xe9, 0x53, 0xf1, 0x16, 0x86, 0x2c, 0x57, 0xad, 0xfa, 0xca, 0x39, 0xde}} return a, nil } @@ -468,7 +470,7 @@ func _1650616788_add_communities_archives_info_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1650616788_add_communities_archives_info_table.up.sql", size: 208, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1650616788_add_communities_archives_info_table.up.sql", size: 208, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd1, 0x4f, 0x80, 0x45, 0xb9, 0xd9, 0x15, 0xe2, 0x78, 0xd0, 0xcb, 0x71, 0xc1, 0x1b, 0xb7, 0x1b, 0x1b, 0x97, 0xfe, 0x47, 0x53, 0x3c, 0x62, 0xbc, 0xdd, 0x3a, 0x94, 0x1a, 0xc, 0x48, 0x76, 0xe}} return a, nil } @@ -488,7 +490,7 @@ func _1652715604_add_clock_accountsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1652715604_add_clock_accounts.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1652715604_add_clock_accounts.up.sql", size: 62, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb6, 0xd9, 0x8d, 0x73, 0xc9, 0xef, 0xfa, 0xb1, 0x4b, 0xa5, 0xf3, 0x5, 0x19, 0x26, 0x46, 0xf8, 0x47, 0x93, 0xdb, 0xac, 0x2, 0xef, 0xf9, 0x71, 0x56, 0x83, 0xe6, 0x2d, 0xb0, 0xd7, 0x83, 0x5c}} return a, nil } @@ -508,7 +510,7 @@ func _1653037334_add_notifications_settings_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1653037334_add_notifications_settings_table.up.sql", size: 1276, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1653037334_add_notifications_settings_table.up.sql", size: 1276, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4b, 0xc4, 0x65, 0xac, 0xa, 0xf2, 0xef, 0xb6, 0x39, 0x3c, 0xc5, 0xb1, 0xb2, 0x9c, 0x86, 0x58, 0xe0, 0x38, 0xcb, 0x57, 0x3c, 0x76, 0x73, 0x87, 0x79, 0x4e, 0xf6, 0xed, 0xb0, 0x8e, 0x9e, 0xa}} return a, nil } @@ -528,7 +530,7 @@ func _1654702119_add_mutual_contact_settingsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1654702119_add_mutual_contact_settings.up.sql", size: 78, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1654702119_add_mutual_contact_settings.up.sql", size: 78, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x26, 0x66, 0x67, 0x50, 0xfe, 0xd7, 0xe3, 0x29, 0x8b, 0xff, 0x9d, 0x5a, 0x87, 0xa7, 0x99, 0x6e, 0xd6, 0xcd, 0x2e, 0xbb, 0x17, 0xdf, 0x7f, 0xf7, 0xa3, 0xfa, 0x32, 0x7c, 0x2d, 0x92, 0xc8, 0x74}} return a, nil } @@ -548,7 +550,7 @@ func _1655375270_add_clock_field_to_communities_settings_tableUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1655375270_add_clock_field_to_communities_settings_table.up.sql", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1655375270_add_clock_field_to_communities_settings_table.up.sql", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x19, 0xc5, 0xc0, 0xf9, 0x84, 0x53, 0xdf, 0x83, 0xcf, 0xb6, 0x40, 0x6d, 0xf5, 0xdc, 0x77, 0x37, 0xb7, 0xe3, 0xa, 0x75, 0xe7, 0x6, 0x11, 0xca, 0x2b, 0x51, 0x92, 0xdd, 0x7d, 0xdb, 0xc3, 0xf5}} return a, nil } @@ -568,7 +570,7 @@ func _1655385721_drop_networks_configUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1655385721_drop_networks_config.up.sql", size: 27, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1655385721_drop_networks_config.up.sql", size: 27, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfc, 0xa7, 0x20, 0xbb, 0x67, 0x21, 0xe, 0xc6, 0xc8, 0x21, 0x74, 0xe0, 0xce, 0xc8, 0xe2, 0x2, 0xb4, 0xea, 0xf0, 0xe5, 0xc4, 0x4d, 0xdd, 0xd4, 0x52, 0x31, 0xa9, 0x3d, 0xcd, 0xd8, 0x9b, 0xab}} return a, nil } @@ -588,7 +590,7 @@ func _1655385724_networks_chaincolor_shortnameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1655385724_networks_chainColor_shortName.up.sql", size: 220, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1655385724_networks_chainColor_shortName.up.sql", size: 220, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd9, 0xe7, 0x84, 0xbb, 0x5f, 0xd2, 0x2c, 0x42, 0x88, 0x62, 0x52, 0xb6, 0x58, 0x31, 0xac, 0xc, 0x96, 0x2b, 0x1b, 0xe5, 0x4e, 0x9a, 0x3a, 0xf6, 0xf6, 0xfc, 0xa9, 0x1a, 0x35, 0x62, 0x28, 0x88}} return a, nil } @@ -608,7 +610,7 @@ func _1655456688_add_deleted_at_field_to_bookmarks_tableUpSql() (*asset, error) return nil, err } - info := bindataFileInfo{name: "1655456688_add_deleted_at_field_to_bookmarks_table.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1655456688_add_deleted_at_field_to_bookmarks_table.up.sql", size: 69, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe7, 0x9a, 0xbd, 0x9a, 0xc9, 0xf, 0xdf, 0x90, 0x0, 0x5d, 0xea, 0x6e, 0x7d, 0x51, 0x95, 0xcd, 0x90, 0xd3, 0x1a, 0x36, 0x6c, 0xf4, 0xbd, 0xa7, 0x6b, 0xbf, 0xe5, 0xdb, 0xa3, 0x88, 0xe3, 0x50}} return a, nil } @@ -628,7 +630,7 @@ func _1655462032_create_bookmarks_deleted_at_indexUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1655462032_create_bookmarks_deleted_at_index.up.sql", size: 81, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1655462032_create_bookmarks_deleted_at_index.up.sql", size: 81, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x8e, 0x20, 0x6b, 0x14, 0x9e, 0xcd, 0x97, 0xd3, 0xfe, 0x62, 0x3, 0x26, 0x59, 0x1, 0x6c, 0x99, 0xef, 0x6d, 0x21, 0xd4, 0xb5, 0xa3, 0xf4, 0x39, 0x40, 0x54, 0x6, 0xd, 0x60, 0x13, 0x38}} return a, nil } @@ -648,7 +650,7 @@ func _1657617291_add_multi_transactions_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1657617291_add_multi_transactions_table.up.sql", size: 412, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1657617291_add_multi_transactions_table.up.sql", size: 412, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x86, 0xb0, 0x4e, 0x8c, 0x4, 0x82, 0xb4, 0x43, 0xaa, 0xd0, 0x16, 0xdd, 0xcb, 0x88, 0x81, 0xac, 0x4, 0x34, 0x1a, 0x8f, 0x2e, 0xc5, 0x69, 0xb, 0xf0, 0x17, 0xf7, 0xe3, 0x9, 0xe, 0x54, 0xe0}} return a, nil } @@ -668,7 +670,7 @@ func _1660134042_add_social_links_settings_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660134042_add_social_links_settings_table.up.sql", size: 334, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1660134042_add_social_links_settings_table.up.sql", size: 334, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x84, 0x73, 0xb6, 0xe7, 0x3f, 0xaa, 0x39, 0x9a, 0x56, 0x56, 0x31, 0xf1, 0x8e, 0x26, 0x23, 0x1, 0xe4, 0xfa, 0x98, 0xfe, 0x78, 0x87, 0x20, 0xcb, 0x52, 0xf4, 0x38, 0x7f, 0xc4, 0x1c, 0x4, 0x22}} return a, nil } @@ -688,7 +690,7 @@ func _1660134060_settings_bioUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660134060_settings_bio.up.sql", size: 91, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1660134060_settings_bio.up.sql", size: 91, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x46, 0x25, 0xa0, 0xa6, 0x47, 0xff, 0xbc, 0x2a, 0x0, 0xff, 0x59, 0x4b, 0xb0, 0xc9, 0x4e, 0x15, 0xe4, 0xd9, 0xda, 0xeb, 0xfe, 0x55, 0x98, 0xc3, 0x9d, 0x96, 0xe7, 0xf, 0xd1, 0x5c, 0x93, 0x73}} return a, nil } @@ -708,7 +710,7 @@ func _1660134070_add_wakuv2_storeUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660134070_add_wakuv2_store.up.sql", size: 269, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1660134070_add_wakuv2_store.up.sql", size: 269, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1d, 0xe6, 0xc3, 0x9, 0xef, 0xdc, 0xae, 0x49, 0x30, 0x78, 0x54, 0xd6, 0xdb, 0xbf, 0xc0, 0x8e, 0x25, 0x8f, 0xfc, 0x67, 0x80, 0x39, 0x37, 0xd4, 0x86, 0xc1, 0x85, 0xc8, 0x99, 0xc4, 0x59, 0xd4}} return a, nil } @@ -728,7 +730,7 @@ func _1660134072_waku2_store_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1660134072_waku2_store_messages.up.sql", size: 497, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1660134072_waku2_store_messages.up.sql", size: 497, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xeb, 0xb4, 0xa0, 0xa1, 0x2b, 0xcb, 0x4c, 0x3c, 0xc6, 0xd0, 0xe8, 0x96, 0xe3, 0x96, 0xf1, 0x4f, 0x1f, 0xe0, 0xe7, 0x1f, 0x85, 0xa3, 0xe, 0xf7, 0x52, 0x56, 0x63, 0x2b, 0xb0, 0x87, 0x7b}} return a, nil } @@ -748,7 +750,7 @@ func _1662365868_add_key_uid_accountsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662365868_add_key_uid_accounts.up.sql", size: 68, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1662365868_add_key_uid_accounts.up.sql", size: 68, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc6, 0xd8, 0x2f, 0x2f, 0x3b, 0xa8, 0xbd, 0x6d, 0xf6, 0x87, 0x7e, 0xd2, 0xf1, 0xa2, 0xf7, 0x81, 0x6a, 0x23, 0x10, 0xbc, 0xbf, 0x5b, 0xe7, 0x2b, 0x9c, 0xa9, 0x8a, 0x18, 0xbb, 0xd0, 0x86, 0x91}} return a, nil } @@ -768,7 +770,7 @@ func _1662447680_add_keypairs_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662447680_add_keypairs_table.up.sql", size: 218, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1662447680_add_keypairs_table.up.sql", size: 218, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0x25, 0xa9, 0xc7, 0x63, 0x27, 0x97, 0x35, 0x5f, 0x6b, 0xab, 0x26, 0xcb, 0xf9, 0xbd, 0x5e, 0xac, 0x3, 0xa0, 0x5e, 0xb9, 0x71, 0xa3, 0x1f, 0xb3, 0x4f, 0x7f, 0x79, 0x28, 0x48, 0xbe, 0xc}} return a, nil } @@ -788,7 +790,7 @@ func _1662460056_move_favourites_to_saved_addressesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662460056_move_favourites_to_saved_addresses.up.sql", size: 233, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1662460056_move_favourites_to_saved_addresses.up.sql", size: 233, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0xa2, 0x8c, 0xa3, 0xec, 0xad, 0xdf, 0xc3, 0x48, 0x5, 0x9b, 0x50, 0x25, 0x59, 0xae, 0x7d, 0xee, 0x58, 0xd2, 0x41, 0x27, 0xf2, 0x22, 0x2e, 0x9a, 0xb9, 0x4a, 0xcc, 0x38, 0x6e, 0x3a, 0xb2}} return a, nil } @@ -808,7 +810,7 @@ func _1662738097_add_base_fee_transactionUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662738097_add_base_fee_transaction.up.sql", size: 112, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1662738097_add_base_fee_transaction.up.sql", size: 112, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6b, 0xfb, 0x10, 0xae, 0xfc, 0x77, 0x70, 0x98, 0x6f, 0xec, 0xaa, 0xcd, 0x7, 0xc7, 0x74, 0x23, 0xc, 0xd5, 0x1e, 0x82, 0xdd, 0xfe, 0xff, 0x3b, 0xd2, 0x49, 0x10, 0x5b, 0x30, 0xc, 0x2d, 0xb0}} return a, nil } @@ -828,7 +830,7 @@ func _1662972194_add_keypairs_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1662972194_add_keypairs_table.up.sql", size: 345, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1662972194_add_keypairs_table.up.sql", size: 345, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x76, 0xf2, 0x86, 0xe1, 0x7e, 0xe9, 0x47, 0x32, 0x48, 0xd5, 0x6b, 0xe5, 0xd, 0xab, 0xb7, 0xf1, 0xd4, 0xf1, 0xad, 0x38, 0xa6, 0x11, 0xe7, 0xce, 0x5c, 0x11, 0x11, 0xf, 0x47, 0xb2, 0x4}} return a, nil } @@ -848,7 +850,7 @@ func _1664392661_add_third_party_id_to_waku_messagesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1664392661_add_third_party_id_to_waku_messages.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1664392661_add_third_party_id_to_waku_messages.up.sql", size: 70, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfd, 0x67, 0x66, 0x9e, 0x66, 0x74, 0xce, 0x1c, 0xb, 0x1b, 0x9d, 0xd5, 0xfc, 0x65, 0xe, 0x83, 0x90, 0x4c, 0x61, 0x4e, 0x6b, 0xe7, 0x86, 0xbe, 0x36, 0x4f, 0x91, 0x36, 0x4, 0x47, 0x7b, 0x82}} return a, nil } @@ -868,7 +870,7 @@ func _1664783660_add_sync_info_to_saved_addressesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1664783660_add_sync_info_to_saved_addresses.up.sql", size: 388, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1664783660_add_sync_info_to_saved_addresses.up.sql", size: 388, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x67, 0x7c, 0x3a, 0x95, 0x4e, 0x55, 0xb2, 0xbd, 0xb4, 0x18, 0x93, 0xc1, 0xcf, 0x9f, 0x12, 0xbb, 0x49, 0x8a, 0x2a, 0x6a, 0x2a, 0x7f, 0xad, 0x44, 0xc3, 0xf, 0x3a, 0x79, 0x18, 0xb9, 0x4c, 0x64}} return a, nil } @@ -888,7 +890,7 @@ func _1668109917_wakunodesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1668109917_wakunodes.up.sql", size: 99, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1668109917_wakunodes.up.sql", size: 99, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x29, 0xaa, 0x9e, 0x2, 0x66, 0x85, 0x69, 0xa8, 0xd9, 0xe2, 0x4b, 0x8d, 0x2a, 0x9c, 0xdf, 0xd2, 0xef, 0x64, 0x58, 0xe3, 0xa6, 0xe7, 0xc1, 0xd1, 0xc8, 0x9c, 0xc0, 0x2c, 0x1, 0xa8, 0x7b, 0x81}} return a, nil } @@ -908,7 +910,7 @@ func _1670249678_display_name_to_settings_sync_clock_tableUpSql() (*asset, error return nil, err } - info := bindataFileInfo{name: "1670249678_display_name_to_settings_sync_clock_table.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1670249678_display_name_to_settings_sync_clock_table.up.sql", size: 83, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x39, 0x18, 0xdc, 0xc4, 0x1f, 0x79, 0x22, 0x16, 0x4d, 0xdf, 0x6c, 0x66, 0xd5, 0xa4, 0x88, 0x5d, 0x5, 0x37, 0xa7, 0x41, 0x5, 0x50, 0xae, 0x12, 0xfa, 0x7e, 0x89, 0x24, 0x5c, 0xae, 0x30, 0xfc}} return a, nil } @@ -928,7 +930,7 @@ func _1670836810_add_imported_flag_to_community_archive_hashesUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1670836810_add_imported_flag_to_community_archive_hashes.up.sql", size: 144, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1670836810_add_imported_flag_to_community_archive_hashes.up.sql", size: 144, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6f, 0xf, 0xf0, 0xbd, 0xfe, 0x63, 0x25, 0x8f, 0x5e, 0x46, 0x4b, 0x45, 0x31, 0x8b, 0x3e, 0xd8, 0x6b, 0x5d, 0x9d, 0x6d, 0x10, 0x9a, 0x87, 0x4b, 0x18, 0xc6, 0x39, 0x81, 0x6e, 0xe4, 0x75, 0xfb}} return a, nil } @@ -948,7 +950,7 @@ func _1671438731_add_magnetlink_uri_to_communities_archive_infoUpSql() (*asset, return nil, err } - info := bindataFileInfo{name: "1671438731_add_magnetlink_uri_to_communities_archive_info.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1671438731_add_magnetlink_uri_to_communities_archive_info.up.sql", size: 86, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xda, 0x8b, 0x4b, 0xd6, 0xd8, 0xe2, 0x3d, 0xf7, 0x6b, 0xcd, 0x1e, 0x70, 0x9, 0x2e, 0x35, 0x4, 0x61, 0xc3, 0xb5, 0x9d, 0xc5, 0x27, 0x21, 0xa, 0x5a, 0xd6, 0x3e, 0xa6, 0x24, 0xa2, 0x12, 0xdf}} return a, nil } @@ -968,7 +970,7 @@ func _1672933930_switcher_cardUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1672933930_switcher_card.up.sql", size: 162, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1672933930_switcher_card.up.sql", size: 162, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x39, 0xba, 0xdc, 0xbb, 0x40, 0x4, 0xf2, 0x10, 0xdf, 0xb4, 0xd2, 0x80, 0x8a, 0x74, 0x4d, 0xf6, 0xbc, 0x50, 0x7, 0xd, 0x22, 0x7f, 0xc4, 0xaf, 0xaa, 0xde, 0xdc, 0x71, 0xe9, 0x42, 0x98, 0x36}} return a, nil } @@ -988,7 +990,7 @@ func _1674056187_add_price_cacheUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1674056187_add_price_cache.up.sql", size: 255, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1674056187_add_price_cache.up.sql", size: 255, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb7, 0x79, 0x6a, 0x9b, 0x28, 0xd1, 0x22, 0xf0, 0x84, 0x76, 0x40, 0x39, 0x49, 0x15, 0x5d, 0xaa, 0xfd, 0x11, 0xff, 0x13, 0x27, 0x42, 0x12, 0xfa, 0x82, 0xe6, 0x7a, 0xf0, 0x5e, 0x1f, 0xe3, 0xba}} return a, nil } @@ -1008,7 +1010,7 @@ func _1674136690_ens_usernamesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1674136690_ens_usernames.up.sql", size: 98, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1674136690_ens_usernames.up.sql", size: 98, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x7a, 0xf3, 0xa8, 0x88, 0x99, 0xd6, 0x9c, 0x69, 0x48, 0x3c, 0x10, 0xda, 0x72, 0xdc, 0x14, 0xd, 0x6e, 0x8c, 0x82, 0x92, 0x2d, 0x2c, 0xee, 0x4c, 0x70, 0xa4, 0xdc, 0x5c, 0x5, 0x2, 0xc3}} return a, nil } @@ -1028,7 +1030,7 @@ func _1674232431_add_balance_historyUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1674232431_add_balance_history.up.sql", size: 698, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1674232431_add_balance_history.up.sql", size: 698, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf7, 0xb5, 0x18, 0xca, 0x4a, 0x93, 0xbb, 0x6f, 0xa4, 0xee, 0xe4, 0x3e, 0xff, 0x6a, 0x4b, 0xe2, 0xe1, 0x61, 0x28, 0xee, 0xc5, 0x26, 0x57, 0x61, 0x5e, 0x6d, 0x44, 0x1e, 0x85, 0x43, 0x70, 0xa2}} return a, nil } @@ -1048,7 +1050,7 @@ func _1676368933_keypairs_to_keycardsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1676368933_keypairs_to_keycards.up.sql", size: 639, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1676368933_keypairs_to_keycards.up.sql", size: 639, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x81, 0x93, 0x27, 0x2, 0xf0, 0x37, 0x81, 0x65, 0xa4, 0xb3, 0x5b, 0x60, 0x36, 0x95, 0xfc, 0x81, 0xf0, 0x3b, 0x7c, 0xc3, 0x2c, 0x85, 0xbd, 0x38, 0x46, 0xa4, 0x95, 0x4a, 0x6, 0x3e, 0x74, 0xd5}} return a, nil } @@ -1068,7 +1070,7 @@ func _1676951398_add_currency_format_cacheUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1676951398_add_currency_format_cache.up.sql", size: 291, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1676951398_add_currency_format_cache.up.sql", size: 291, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf9, 0xa3, 0x76, 0x35, 0xca, 0xf, 0xe8, 0xdf, 0xd9, 0x61, 0xf9, 0xed, 0xfc, 0x6d, 0xf5, 0xe, 0x11, 0x88, 0xbd, 0x14, 0x92, 0xc6, 0x57, 0x53, 0xe, 0xcd, 0x52, 0xf4, 0xa9, 0xb1, 0xdd, 0xfd}} return a, nil } @@ -1088,7 +1090,7 @@ func _1676968196_keycards_add_clock_columnUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1676968196_keycards_add_clock_column.up.sql", size: 73, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1676968196_keycards_add_clock_column.up.sql", size: 73, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4c, 0xf, 0x1c, 0x28, 0x41, 0x57, 0x57, 0x6c, 0xe, 0x75, 0x6b, 0x75, 0x12, 0x0, 0x18, 0x1e, 0x88, 0x1e, 0x45, 0xe0, 0x32, 0xb9, 0xd4, 0xd9, 0x2e, 0xc8, 0xb, 0x80, 0x6, 0x51, 0x3d, 0x28}} return a, nil } @@ -1108,7 +1110,7 @@ func _1676968197_add_fallback_rpc_to_networksUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1676968197_add_fallback_rpc_to_networks.up.sql", size: 112, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1676968197_add_fallback_rpc_to_networks.up.sql", size: 112, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0x6a, 0xc6, 0x45, 0xfa, 0x62, 0x84, 0x74, 0x6d, 0x7c, 0xd7, 0x1d, 0x79, 0xb6, 0x38, 0x43, 0xa8, 0x8, 0x6b, 0x75, 0x3d, 0x9, 0x2, 0xc5, 0x9f, 0xbb, 0x45, 0x56, 0x4c, 0x4e, 0x17, 0x89}} return a, nil } @@ -1128,7 +1130,7 @@ func _1677674090_add_chains_ens_istest_to_saved_addressesUpSql() (*asset, error) return nil, err } - info := bindataFileInfo{name: "1677674090_add_chains_ens_istest_to_saved_addresses.up.sql", size: 638, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1677674090_add_chains_ens_istest_to_saved_addresses.up.sql", size: 638, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa8, 0x2d, 0xa4, 0x1b, 0xf6, 0x6a, 0x13, 0x7b, 0xe, 0x59, 0xcd, 0xe2, 0x4e, 0x81, 0x99, 0xc4, 0x33, 0x84, 0xde, 0x66, 0xca, 0xac, 0x2f, 0x5, 0x90, 0xac, 0xfd, 0x4e, 0xfc, 0x55, 0x44, 0xe5}} return a, nil } @@ -1148,7 +1150,7 @@ func _1677681143_accounts_table_type_column_updateUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1677681143_accounts_table_type_column_update.up.sql", size: 135, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1677681143_accounts_table_type_column_update.up.sql", size: 135, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd2, 0xc4, 0x6, 0x42, 0x50, 0x1d, 0xf4, 0x48, 0x55, 0xbc, 0xa2, 0x19, 0xdd, 0xad, 0xc8, 0xc, 0xa7, 0x30, 0xb6, 0xaf, 0xe, 0x2b, 0xaa, 0x2a, 0xa4, 0xe1, 0xb9, 0x41, 0x23, 0x66, 0xd3, 0x3}} return a, nil } @@ -1168,7 +1170,7 @@ func _1678264207_accounts_table_new_columns_addedUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1678264207_accounts_table_new_columns_added.up.sql", size: 130, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1678264207_accounts_table_new_columns_added.up.sql", size: 130, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0xd4, 0xf3, 0x35, 0xef, 0x5c, 0x19, 0x3c, 0x15, 0x90, 0x60, 0xbd, 0x1f, 0x81, 0xf0, 0x86, 0x73, 0x89, 0xa0, 0x70, 0xf2, 0x46, 0xae, 0xea, 0xd0, 0xc6, 0x9e, 0x55, 0x4a, 0x54, 0x62, 0xbb}} return a, nil } @@ -1188,7 +1190,7 @@ func _1680770368_add_bio_to_settings_sync_clock_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1680770368_add_bio_to_settings_sync_clock_table.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1680770368_add_bio_to_settings_sync_clock_table.up.sql", size: 75, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4a, 0x52, 0xf6, 0x3f, 0xaa, 0xd, 0xa0, 0xee, 0xe8, 0xe6, 0x16, 0x21, 0x80, 0x61, 0xe4, 0x7a, 0x4e, 0x37, 0x8d, 0x30, 0x51, 0x20, 0x4d, 0x15, 0x47, 0xfb, 0x6, 0xa1, 0xce, 0xc8, 0x27, 0x5a}} return a, nil } @@ -1208,7 +1210,7 @@ func _1681110436_add_mnemonic_to_settings_sync_clock_tableUpSql() (*asset, error return nil, err } - info := bindataFileInfo{name: "1681110436_add_mnemonic_to_settings_sync_clock_table.up.sql", size: 311, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1681110436_add_mnemonic_to_settings_sync_clock_table.up.sql", size: 311, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3d, 0x74, 0x81, 0x7d, 0x9e, 0x77, 0xb6, 0xfe, 0xe3, 0xcb, 0x48, 0xe5, 0x5f, 0x39, 0x23, 0xa1, 0x7d, 0x53, 0x22, 0xe8, 0x96, 0x15, 0x8a, 0x1e, 0x8e, 0xbc, 0xe2, 0x1d, 0xc4, 0xc2, 0x56, 0x34}} return a, nil } @@ -1228,7 +1230,7 @@ func _1681392602_9d_sync_periodUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681392602_9d_sync_period.up.sql", size: 60, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1681392602_9d_sync_period.up.sql", size: 60, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc9, 0xa, 0x90, 0x29, 0x7f, 0x76, 0x98, 0xa7, 0x71, 0x80, 0x5a, 0x2f, 0xbe, 0x23, 0x9a, 0xd4, 0xf4, 0x39, 0x19, 0xd3, 0xa5, 0x34, 0x6e, 0x67, 0x6a, 0xbe, 0x8a, 0xad, 0x21, 0xc7, 0xba, 0x88}} return a, nil } @@ -1248,7 +1250,7 @@ func _1681762078_default_sync_period_9dUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681762078_default_sync_period_9d.up.sql", size: 3002, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1681762078_default_sync_period_9d.up.sql", size: 3002, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x3e, 0xd9, 0x26, 0xfc, 0xa9, 0x45, 0xc1, 0x81, 0xa8, 0xe2, 0x2c, 0xe9, 0x3c, 0xea, 0x1d, 0x37, 0x11, 0x45, 0x8c, 0x6c, 0xbc, 0xc2, 0x6, 0x69, 0x2, 0x75, 0x29, 0x40, 0x9f, 0xc5, 0xbb, 0x36}} return a, nil } @@ -1268,7 +1270,7 @@ func _1681780680_add_clock_to_social_links_settingsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1681780680_add_clock_to_social_links_settings.up.sql", size: 137, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1681780680_add_clock_to_social_links_settings.up.sql", size: 137, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x63, 0x11, 0xf5, 0x41, 0xe5, 0x5a, 0xf4, 0xe3, 0xf3, 0x14, 0x87, 0x28, 0xd8, 0xf0, 0x52, 0x31, 0x8, 0xd5, 0xbb, 0xf4, 0xff, 0x55, 0x5f, 0x42, 0x90, 0xcb, 0xf7, 0x46, 0x2, 0x6, 0xbe, 0x42}} return a, nil } @@ -1288,7 +1290,7 @@ func _1682073779_settings_table_remove_latest_derived_path_columnUpSql() (*asset return nil, err } - info := bindataFileInfo{name: "1682073779_settings_table_remove_latest_derived_path_column.up.sql", size: 4470, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1682073779_settings_table_remove_latest_derived_path_column.up.sql", size: 4470, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7a, 0x36, 0x2, 0x41, 0xd, 0x5c, 0xd1, 0x92, 0x85, 0x6d, 0x84, 0xff, 0x67, 0xa7, 0x4c, 0x67, 0xa4, 0xef, 0x52, 0x69, 0x1f, 0x22, 0x25, 0x92, 0xc, 0xb3, 0x89, 0x50, 0x91, 0xc, 0x49, 0xf9}} return a, nil } @@ -1308,7 +1310,7 @@ func _1682146075_add_created_at_to_saved_addressesUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1682146075_add_created_at_to_saved_addresses.up.sql", size: 107, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1682146075_add_created_at_to_saved_addresses.up.sql", size: 107, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x88, 0xfe, 0x35, 0x9c, 0x6b, 0xdf, 0x67, 0x18, 0x16, 0xe4, 0xc9, 0xd4, 0x77, 0x7c, 0x4, 0xe2, 0x6c, 0x41, 0xd9, 0x53, 0x97, 0xfe, 0x5, 0xa3, 0x23, 0xce, 0x82, 0xad, 0x92, 0x5e, 0xd7, 0x7d}} return a, nil } @@ -1328,7 +1330,7 @@ func _1682393575_sync_ens_nameUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1682393575_sync_ens_name.up.sql", size: 713, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1682393575_sync_ens_name.up.sql", size: 713, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfb, 0xea, 0xcb, 0x4d, 0x71, 0x5a, 0x49, 0x19, 0x8b, 0xef, 0x66, 0x27, 0x33, 0x89, 0xb0, 0xe, 0x37, 0x1b, 0x41, 0x8, 0x12, 0xcc, 0x56, 0xd8, 0x1b, 0xf, 0xf8, 0x50, 0x4b, 0x93, 0xf1, 0x29}} return a, nil } @@ -1348,7 +1350,7 @@ func _1683457503_add_blocks_ranges_sequential_tableUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1683457503_add_blocks_ranges_sequential_table.up.sql", size: 263, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "1683457503_add_blocks_ranges_sequential_table.up.sql", size: 263, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfe, 0x57, 0x2e, 0x0, 0x6a, 0x6e, 0xd7, 0xeb, 0xe6, 0x66, 0x79, 0x32, 0x22, 0x82, 0x92, 0xf4, 0xc9, 0xf1, 0x58, 0x1a, 0x45, 0x60, 0x77, 0x50, 0xe7, 0x54, 0x4a, 0xc0, 0x42, 0x3a, 0x4f, 0x35}} return a, nil } @@ -1368,7 +1370,7 @@ func _1683627613_accounts_and_keycards_improvementsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1683627613_accounts_and_keycards_improvements.up.sql", size: 3640, mode: os.FileMode(0644), modTime: time.Unix(1685358731, 0)} + info := bindataFileInfo{name: "1683627613_accounts_and_keycards_improvements.up.sql", size: 3640, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x8e, 0xbe, 0x62, 0xf5, 0x9, 0x42, 0x8c, 0x8f, 0xa8, 0x45, 0xe7, 0x36, 0xc9, 0xde, 0xf4, 0xe2, 0xfd, 0xc4, 0x8, 0xd0, 0xa3, 0x8, 0x64, 0xe2, 0x56, 0xcc, 0xa7, 0x6d, 0xc5, 0xcc, 0x82, 0x2c}} return a, nil } @@ -1388,7 +1390,7 @@ func _1685041348_settings_table_add_latest_derived_path_columnUpSql() (*asset, e return nil, err } - info := bindataFileInfo{name: "1685041348_settings_table_add_latest_derived_path_column.up.sql", size: 115, mode: os.FileMode(0644), modTime: time.Unix(1685358731, 0)} + info := bindataFileInfo{name: "1685041348_settings_table_add_latest_derived_path_column.up.sql", size: 115, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0xd4, 0x1b, 0xbf, 0x8, 0xf9, 0xd4, 0xb0, 0xa0, 0x6, 0x5b, 0xfb, 0x7e, 0xff, 0xfa, 0xbf, 0xcc, 0x64, 0x47, 0x81, 0x8b, 0x5e, 0x17, 0x6a, 0xa7, 0xa4, 0x35, 0x8f, 0x30, 0x4f, 0xd9, 0xd}} return a, nil } @@ -1408,7 +1410,7 @@ func _1685440989_update_color_id_accountsUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1685440989_update_color_id_accounts.up.sql", size: 918, mode: os.FileMode(0644), modTime: time.Unix(1685733628, 0)} + info := bindataFileInfo{name: "1685440989_update_color_id_accounts.up.sql", size: 918, mode: os.FileMode(0644), modTime: time.Unix(1685977515, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x10, 0x2e, 0x51, 0x1d, 0x2d, 0x16, 0x84, 0xd6, 0xe8, 0xbc, 0x20, 0x53, 0x47, 0xb8, 0x40, 0x21, 0x52, 0x5c, 0xd9, 0xbb, 0xea, 0xe2, 0xa5, 0x77, 0xc8, 0x35, 0x4c, 0xe0, 0x9d, 0x42, 0x44, 0x50}} return a, nil } @@ -1428,11 +1430,31 @@ func _1685463947_add_to_asset_to_multitransactionUpSql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "1685463947_add_to_asset_to_multitransaction.up.sql", size: 61, mode: os.FileMode(0644), modTime: time.Unix(1685964120, 0)} + info := bindataFileInfo{name: "1685463947_add_to_asset_to_multitransaction.up.sql", size: 61, mode: os.FileMode(0644), modTime: time.Unix(1685979377, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd3, 0x66, 0x15, 0x10, 0xfa, 0x66, 0x81, 0x68, 0xd9, 0xb4, 0x93, 0x9e, 0x11, 0xed, 0x1d, 0x16, 0x9d, 0x5a, 0xf8, 0xd7, 0x8, 0xea, 0x7a, 0xaf, 0xe4, 0xb3, 0x22, 0x19, 0xca, 0xff, 0x75, 0x7c}} return a, nil } +var __1685880973_add_profile_links_settings_tableUpSql = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x8c\x93\xdd\x6e\xdb\x46\x10\x85\xef\xf9\x14\xa7\xee\x45\x45\xc0\x8c\xec\x26\x46\x8a\x06\x2e\xc0\x4a\x74\x4d\x84\x96\x0c\x8a\x6e\x9b\x2b\x65\xbd\x1c\x91\x0b\x2f\x77\x95\xdd\xa1\x59\xbf\x7d\xc1\x1f\xb9\x16\xa0\x16\xbd\x5b\x62\xce\xfc\x7d\x67\x18\x45\x58\x38\x12\x4c\x30\xd4\x81\xc5\xa3\x26\x74\x35\x39\x42\x47\xe8\x94\xd6\xf0\x6c\x1d\x61\xef\xec\x4e\x69\x82\xb7\x52\x09\x0d\xad\xcc\x93\x3f\x0f\xa2\x08\x62\xc7\xe4\x50\x2a\x2f\x5b\xef\x95\x35\xa8\x99\xf7\xfe\xe7\xf9\xbc\x52\x5c\xb7\x8f\xef\xa4\x6d\xe6\x9e\x05\xb7\x3e\x52\xaf\xaf\xca\xce\xf7\xad\xd6\xf3\xf7\x57\x57\x3f\x7e\xaf\xbc\x6f\x49\xda\xa6\x21\xc3\xd1\xe5\xd5\xc7\xf7\x3f\x5d\x7e\xbc\xf8\xf0\xa1\x2f\xde\x11\x4a\x92\xaa\xa4\x12\x6c\xe1\x68\xaf\x85\x24\x70\x4d\x20\xc3\xca\x11\xca\xc7\x69\x66\x69\x0d\x93\x61\x58\x03\x7a\x26\xf7\x02\x59\x0b\x53\x11\x66\x8f\x24\x45\xeb\x09\x76\x07\xae\x05\x63\x6f\xbd\xe2\x7e\x4e\x69\x75\xdb\x18\x28\x0f\x63\x19\x86\xa8\xa4\x32\x0c\x16\x79\x12\x17\x09\x8a\xf8\xd7\x2c\x41\x7a\x83\xd5\xba\x40\xf2\x67\xba\x29\x36\x07\x04\xdb\x11\xc1\x76\x40\x80\x59\x00\x30\xfd\xc5\xf8\x3d\xce\x17\xb7\x71\x3e\x24\xac\x1e\xb2\x0c\x8b\xdb\x64\xf1\x19\x33\x4d\xa6\xe2\x7a\xc6\x4e\x35\xb3\x5e\x18\x86\xf8\x05\x17\xe1\x79\x00\xb4\x4e\xff\xaf\xb4\xd6\xe9\x37\x59\xf7\x79\x7a\x17\xe7\x5f\xf0\x39\xf9\x82\xa1\xe2\x79\x5f\x28\x0c\xc2\x4f\x41\x70\xec\xe6\xb4\x21\x5b\x3c\x11\xed\x21\xb5\x95\x4f\x23\x07\x82\x16\x9e\x0f\x8c\xec\xee\xa4\xbd\x98\x79\x65\xe4\x3f\x68\x95\x3f\x38\x50\x42\x68\x0d\x67\x3b\xf8\x5a\xb8\xd1\x10\x2f\x1a\x9a\x5a\x3c\x0b\xdd\x52\x18\xc4\x59\x91\xe4\x13\x49\x4f\xcc\xca\x54\x7e\xeb\x5f\x8c\xdc\x8e\xb2\x78\xb9\xc4\x62\x9d\x3d\xdc\xad\x70\x84\x34\x5d\x15\xc9\x6f\xc9\x1b\x24\xcb\xe4\x26\x7e\xc8\x0a\x5c\x8c\x1b\xa6\xc6\x93\x63\x28\xc3\x16\x5f\x4f\x99\xf2\x75\xbc\x89\x20\x5d\x6d\x92\xbc\xe8\xeb\xad\xff\xc5\xbc\x37\xf8\x80\x4d\x92\x25\x8b\x62\xd8\x7d\x3b\x06\x86\x67\xeb\x74\x00\xdc\xe4\xeb\xbb\xa3\x31\xb7\x87\x95\x02\xe0\x8f\xdb\x24\x4f\x5e\xd5\xf8\xee\x1a\x67\x67\xe3\xac\x37\xce\x36\xf0\xb6\x21\x38\x12\xde\x9a\x01\xd5\xce\x6a\x6d\x3b\x65\x2a\xf8\x6f\x1a\xa5\x25\x6f\x7e\x60\x74\xd6\x3d\x81\x6b\x67\xdb\xaa\xc6\xeb\x7f\x82\x46\x55\x4e\xf4\x07\xeb\xcf\x21\x34\xd7\x43\xb8\xaf\xf2\xad\xed\xcf\x5c\x79\x48\xeb\x1c\x49\x7e\xd7\xf7\x8b\x22\x6c\x88\x87\xf8\x08\x79\x67\xdd\x49\x73\x7b\xf1\xc3\xfd\xb2\xbf\xf5\x13\xde\xf4\xd1\x1e\x48\x31\x3e\x70\x6c\xd0\x35\x66\x13\xab\x37\xe2\xff\x44\x34\x29\x4e\x71\x3a\xc4\xb2\xf4\x2e\x2d\x70\x19\x8e\xdf\xa3\xd2\xbf\x18\xae\x89\x95\xdc\xaa\x12\xd7\x38\x53\xe5\x84\x75\xe9\xec\x1e\x56\x97\x93\xd1\xcb\x7c\x7d\x7f\x38\xb4\x53\xfd\x3f\xfd\x1d\x00\x00\xff\xff\x16\x8e\x9a\x75\xe6\x04\x00\x00") + +func _1685880973_add_profile_links_settings_tableUpSqlBytes() ([]byte, error) { + return bindataRead( + __1685880973_add_profile_links_settings_tableUpSql, + "1685880973_add_profile_links_settings_table.up.sql", + ) +} + +func _1685880973_add_profile_links_settings_tableUpSql() (*asset, error) { + bytes, err := _1685880973_add_profile_links_settings_tableUpSqlBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "1685880973_add_profile_links_settings_table.up.sql", size: 1254, mode: os.FileMode(0644), modTime: time.Unix(1685979377, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcc, 0xa4, 0xea, 0x41, 0x4e, 0xf, 0xea, 0x99, 0x9c, 0x8c, 0xe4, 0x22, 0xb7, 0x64, 0x8c, 0x9a, 0xac, 0x6, 0xc3, 0xbc, 0x4a, 0x40, 0xbe, 0x79, 0x73, 0x30, 0x29, 0x33, 0x88, 0x6a, 0x81, 0xf7}} + return a, nil +} + var _docGo = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x2c\xc9\xb1\x0d\xc4\x20\x0c\x05\xd0\x9e\x29\xfe\x02\xd8\xfd\x6d\xe3\x4b\xac\x2f\x44\x82\x09\x78\x7f\xa5\x49\xfd\xa6\x1d\xdd\xe8\xd8\xcf\x55\x8a\x2a\xe3\x47\x1f\xbe\x2c\x1d\x8c\xfa\x6f\xe3\xb4\x34\xd4\xd9\x89\xbb\x71\x59\xb6\x18\x1b\x35\x20\xa2\x9f\x0a\x03\xa2\xe5\x0d\x00\x00\xff\xff\x60\xcd\x06\xbe\x4a\x00\x00\x00") func docGoBytes() ([]byte, error) { @@ -1448,7 +1470,7 @@ func docGo() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1684852796, 0)} + info := bindataFileInfo{name: "doc.go", size: 74, mode: os.FileMode(0644), modTime: time.Unix(1685950754, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x7c, 0x28, 0xcd, 0x47, 0xf2, 0xfa, 0x7c, 0x51, 0x2d, 0xd8, 0x38, 0xb, 0xb0, 0x34, 0x9d, 0x4c, 0x62, 0xa, 0x9e, 0x28, 0xc3, 0x31, 0x23, 0xd9, 0xbb, 0x89, 0x9f, 0xa0, 0x89, 0x1f, 0xe8}} return a, nil } @@ -1544,88 +1566,150 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "1640111208_dummy.up.sql": _1640111208_dummyUpSql, - "1642666031_add_removed_clock_to_bookmarks.up.sql": _1642666031_add_removed_clock_to_bookmarksUpSql, - "1643644541_gif_api_key_setting.up.sql": _1643644541_gif_api_key_settingUpSql, - "1644188994_recent_stickers.up.sql": _1644188994_recent_stickersUpSql, - "1646659233_add_address_to_dapp_permisssion.up.sql": _1646659233_add_address_to_dapp_permisssionUpSql, - "1646841105_add_emoji_account.up.sql": _1646841105_add_emoji_accountUpSql, - "1647278782_display_name.up.sql": _1647278782_display_nameUpSql, - "1647862838_reset_last_backup.up.sql": _1647862838_reset_last_backupUpSql, - "1647871652_add_settings_sync_clock_table.up.sql": _1647871652_add_settings_sync_clock_tableUpSql, - "1647880168_add_torrent_config.up.sql": _1647880168_add_torrent_configUpSql, - "1647882837_add_communities_settings_table.up.sql": _1647882837_add_communities_settings_tableUpSql, - "1647956635_add_waku_messages_table.up.sql": _1647956635_add_waku_messages_tableUpSql, - "1648554928_network_test.up.sql": _1648554928_network_testUpSql, - "1649174829_add_visitble_token.up.sql": _1649174829_add_visitble_tokenUpSql, - "1649882262_add_derived_from_accounts.up.sql": _1649882262_add_derived_from_accountsUpSql, - "1650612625_add_community_message_archive_hashes_table.up.sql": _1650612625_add_community_message_archive_hashes_tableUpSql, - "1650616788_add_communities_archives_info_table.up.sql": _1650616788_add_communities_archives_info_tableUpSql, - "1652715604_add_clock_accounts.up.sql": _1652715604_add_clock_accountsUpSql, - "1653037334_add_notifications_settings_table.up.sql": _1653037334_add_notifications_settings_tableUpSql, - "1654702119_add_mutual_contact_settings.up.sql": _1654702119_add_mutual_contact_settingsUpSql, - "1655375270_add_clock_field_to_communities_settings_table.up.sql": _1655375270_add_clock_field_to_communities_settings_tableUpSql, - "1655385721_drop_networks_config.up.sql": _1655385721_drop_networks_configUpSql, - "1655385724_networks_chainColor_shortName.up.sql": _1655385724_networks_chaincolor_shortnameUpSql, - "1655456688_add_deleted_at_field_to_bookmarks_table.up.sql": _1655456688_add_deleted_at_field_to_bookmarks_tableUpSql, - "1655462032_create_bookmarks_deleted_at_index.up.sql": _1655462032_create_bookmarks_deleted_at_indexUpSql, - "1657617291_add_multi_transactions_table.up.sql": _1657617291_add_multi_transactions_tableUpSql, - "1660134042_add_social_links_settings_table.up.sql": _1660134042_add_social_links_settings_tableUpSql, - "1660134060_settings_bio.up.sql": _1660134060_settings_bioUpSql, - "1660134070_add_wakuv2_store.up.sql": _1660134070_add_wakuv2_storeUpSql, - "1660134072_waku2_store_messages.up.sql": _1660134072_waku2_store_messagesUpSql, - "1662365868_add_key_uid_accounts.up.sql": _1662365868_add_key_uid_accountsUpSql, - "1662447680_add_keypairs_table.up.sql": _1662447680_add_keypairs_tableUpSql, - "1662460056_move_favourites_to_saved_addresses.up.sql": _1662460056_move_favourites_to_saved_addressesUpSql, - "1662738097_add_base_fee_transaction.up.sql": _1662738097_add_base_fee_transactionUpSql, - "1662972194_add_keypairs_table.up.sql": _1662972194_add_keypairs_tableUpSql, - "1664392661_add_third_party_id_to_waku_messages.up.sql": _1664392661_add_third_party_id_to_waku_messagesUpSql, - "1664783660_add_sync_info_to_saved_addresses.up.sql": _1664783660_add_sync_info_to_saved_addressesUpSql, - "1668109917_wakunodes.up.sql": _1668109917_wakunodesUpSql, - "1670249678_display_name_to_settings_sync_clock_table.up.sql": _1670249678_display_name_to_settings_sync_clock_tableUpSql, - "1670836810_add_imported_flag_to_community_archive_hashes.up.sql": _1670836810_add_imported_flag_to_community_archive_hashesUpSql, - "1671438731_add_magnetlink_uri_to_communities_archive_info.up.sql": _1671438731_add_magnetlink_uri_to_communities_archive_infoUpSql, - "1672933930_switcher_card.up.sql": _1672933930_switcher_cardUpSql, - "1674056187_add_price_cache.up.sql": _1674056187_add_price_cacheUpSql, - "1674136690_ens_usernames.up.sql": _1674136690_ens_usernamesUpSql, - "1674232431_add_balance_history.up.sql": _1674232431_add_balance_historyUpSql, - "1676368933_keypairs_to_keycards.up.sql": _1676368933_keypairs_to_keycardsUpSql, - "1676951398_add_currency_format_cache.up.sql": _1676951398_add_currency_format_cacheUpSql, - "1676968196_keycards_add_clock_column.up.sql": _1676968196_keycards_add_clock_columnUpSql, - "1676968197_add_fallback_rpc_to_networks.up.sql": _1676968197_add_fallback_rpc_to_networksUpSql, - "1677674090_add_chains_ens_istest_to_saved_addresses.up.sql": _1677674090_add_chains_ens_istest_to_saved_addressesUpSql, - "1677681143_accounts_table_type_column_update.up.sql": _1677681143_accounts_table_type_column_updateUpSql, - "1678264207_accounts_table_new_columns_added.up.sql": _1678264207_accounts_table_new_columns_addedUpSql, - "1680770368_add_bio_to_settings_sync_clock_table.up.sql": _1680770368_add_bio_to_settings_sync_clock_tableUpSql, - "1681110436_add_mnemonic_to_settings_sync_clock_table.up.sql": _1681110436_add_mnemonic_to_settings_sync_clock_tableUpSql, - "1681392602_9d_sync_period.up.sql": _1681392602_9d_sync_periodUpSql, - "1681762078_default_sync_period_9d.up.sql": _1681762078_default_sync_period_9dUpSql, - "1681780680_add_clock_to_social_links_settings.up.sql": _1681780680_add_clock_to_social_links_settingsUpSql, + "1640111208_dummy.up.sql": _1640111208_dummyUpSql, + + "1642666031_add_removed_clock_to_bookmarks.up.sql": _1642666031_add_removed_clock_to_bookmarksUpSql, + + "1643644541_gif_api_key_setting.up.sql": _1643644541_gif_api_key_settingUpSql, + + "1644188994_recent_stickers.up.sql": _1644188994_recent_stickersUpSql, + + "1646659233_add_address_to_dapp_permisssion.up.sql": _1646659233_add_address_to_dapp_permisssionUpSql, + + "1646841105_add_emoji_account.up.sql": _1646841105_add_emoji_accountUpSql, + + "1647278782_display_name.up.sql": _1647278782_display_nameUpSql, + + "1647862838_reset_last_backup.up.sql": _1647862838_reset_last_backupUpSql, + + "1647871652_add_settings_sync_clock_table.up.sql": _1647871652_add_settings_sync_clock_tableUpSql, + + "1647880168_add_torrent_config.up.sql": _1647880168_add_torrent_configUpSql, + + "1647882837_add_communities_settings_table.up.sql": _1647882837_add_communities_settings_tableUpSql, + + "1647956635_add_waku_messages_table.up.sql": _1647956635_add_waku_messages_tableUpSql, + + "1648554928_network_test.up.sql": _1648554928_network_testUpSql, + + "1649174829_add_visitble_token.up.sql": _1649174829_add_visitble_tokenUpSql, + + "1649882262_add_derived_from_accounts.up.sql": _1649882262_add_derived_from_accountsUpSql, + + "1650612625_add_community_message_archive_hashes_table.up.sql": _1650612625_add_community_message_archive_hashes_tableUpSql, + + "1650616788_add_communities_archives_info_table.up.sql": _1650616788_add_communities_archives_info_tableUpSql, + + "1652715604_add_clock_accounts.up.sql": _1652715604_add_clock_accountsUpSql, + + "1653037334_add_notifications_settings_table.up.sql": _1653037334_add_notifications_settings_tableUpSql, + + "1654702119_add_mutual_contact_settings.up.sql": _1654702119_add_mutual_contact_settingsUpSql, + + "1655375270_add_clock_field_to_communities_settings_table.up.sql": _1655375270_add_clock_field_to_communities_settings_tableUpSql, + + "1655385721_drop_networks_config.up.sql": _1655385721_drop_networks_configUpSql, + + "1655385724_networks_chainColor_shortName.up.sql": _1655385724_networks_chaincolor_shortnameUpSql, + + "1655456688_add_deleted_at_field_to_bookmarks_table.up.sql": _1655456688_add_deleted_at_field_to_bookmarks_tableUpSql, + + "1655462032_create_bookmarks_deleted_at_index.up.sql": _1655462032_create_bookmarks_deleted_at_indexUpSql, + + "1657617291_add_multi_transactions_table.up.sql": _1657617291_add_multi_transactions_tableUpSql, + + "1660134042_add_social_links_settings_table.up.sql": _1660134042_add_social_links_settings_tableUpSql, + + "1660134060_settings_bio.up.sql": _1660134060_settings_bioUpSql, + + "1660134070_add_wakuv2_store.up.sql": _1660134070_add_wakuv2_storeUpSql, + + "1660134072_waku2_store_messages.up.sql": _1660134072_waku2_store_messagesUpSql, + + "1662365868_add_key_uid_accounts.up.sql": _1662365868_add_key_uid_accountsUpSql, + + "1662447680_add_keypairs_table.up.sql": _1662447680_add_keypairs_tableUpSql, + + "1662460056_move_favourites_to_saved_addresses.up.sql": _1662460056_move_favourites_to_saved_addressesUpSql, + + "1662738097_add_base_fee_transaction.up.sql": _1662738097_add_base_fee_transactionUpSql, + + "1662972194_add_keypairs_table.up.sql": _1662972194_add_keypairs_tableUpSql, + + "1664392661_add_third_party_id_to_waku_messages.up.sql": _1664392661_add_third_party_id_to_waku_messagesUpSql, + + "1664783660_add_sync_info_to_saved_addresses.up.sql": _1664783660_add_sync_info_to_saved_addressesUpSql, + + "1668109917_wakunodes.up.sql": _1668109917_wakunodesUpSql, + + "1670249678_display_name_to_settings_sync_clock_table.up.sql": _1670249678_display_name_to_settings_sync_clock_tableUpSql, + + "1670836810_add_imported_flag_to_community_archive_hashes.up.sql": _1670836810_add_imported_flag_to_community_archive_hashesUpSql, + + "1671438731_add_magnetlink_uri_to_communities_archive_info.up.sql": _1671438731_add_magnetlink_uri_to_communities_archive_infoUpSql, + + "1672933930_switcher_card.up.sql": _1672933930_switcher_cardUpSql, + + "1674056187_add_price_cache.up.sql": _1674056187_add_price_cacheUpSql, + + "1674136690_ens_usernames.up.sql": _1674136690_ens_usernamesUpSql, + + "1674232431_add_balance_history.up.sql": _1674232431_add_balance_historyUpSql, + + "1676368933_keypairs_to_keycards.up.sql": _1676368933_keypairs_to_keycardsUpSql, + + "1676951398_add_currency_format_cache.up.sql": _1676951398_add_currency_format_cacheUpSql, + + "1676968196_keycards_add_clock_column.up.sql": _1676968196_keycards_add_clock_columnUpSql, + + "1676968197_add_fallback_rpc_to_networks.up.sql": _1676968197_add_fallback_rpc_to_networksUpSql, + + "1677674090_add_chains_ens_istest_to_saved_addresses.up.sql": _1677674090_add_chains_ens_istest_to_saved_addressesUpSql, + + "1677681143_accounts_table_type_column_update.up.sql": _1677681143_accounts_table_type_column_updateUpSql, + + "1678264207_accounts_table_new_columns_added.up.sql": _1678264207_accounts_table_new_columns_addedUpSql, + + "1680770368_add_bio_to_settings_sync_clock_table.up.sql": _1680770368_add_bio_to_settings_sync_clock_tableUpSql, + + "1681110436_add_mnemonic_to_settings_sync_clock_table.up.sql": _1681110436_add_mnemonic_to_settings_sync_clock_tableUpSql, + + "1681392602_9d_sync_period.up.sql": _1681392602_9d_sync_periodUpSql, + + "1681762078_default_sync_period_9d.up.sql": _1681762078_default_sync_period_9dUpSql, + + "1681780680_add_clock_to_social_links_settings.up.sql": _1681780680_add_clock_to_social_links_settingsUpSql, + "1682073779_settings_table_remove_latest_derived_path_column.up.sql": _1682073779_settings_table_remove_latest_derived_path_columnUpSql, - "1682146075_add_created_at_to_saved_addresses.up.sql": _1682146075_add_created_at_to_saved_addressesUpSql, - "1682393575_sync_ens_name.up.sql": _1682393575_sync_ens_nameUpSql, - "1683457503_add_blocks_ranges_sequential_table.up.sql": _1683457503_add_blocks_ranges_sequential_tableUpSql, - "1683627613_accounts_and_keycards_improvements.up.sql": _1683627613_accounts_and_keycards_improvementsUpSql, - "1685041348_settings_table_add_latest_derived_path_column.up.sql": _1685041348_settings_table_add_latest_derived_path_columnUpSql, - "1685440989_update_color_id_accounts.up.sql": _1685440989_update_color_id_accountsUpSql, - "1685463947_add_to_asset_to_multitransaction.up.sql": _1685463947_add_to_asset_to_multitransactionUpSql, + + "1682146075_add_created_at_to_saved_addresses.up.sql": _1682146075_add_created_at_to_saved_addressesUpSql, + + "1682393575_sync_ens_name.up.sql": _1682393575_sync_ens_nameUpSql, + + "1683457503_add_blocks_ranges_sequential_table.up.sql": _1683457503_add_blocks_ranges_sequential_tableUpSql, + + "1683627613_accounts_and_keycards_improvements.up.sql": _1683627613_accounts_and_keycards_improvementsUpSql, + + "1685041348_settings_table_add_latest_derived_path_column.up.sql": _1685041348_settings_table_add_latest_derived_path_columnUpSql, + + "1685440989_update_color_id_accounts.up.sql": _1685440989_update_color_id_accountsUpSql, + + "1685463947_add_to_asset_to_multitransaction.up.sql": _1685463947_add_to_asset_to_multitransactionUpSql, + + "1685880973_add_profile_links_settings_table.up.sql": _1685880973_add_profile_links_settings_tableUpSql, + "doc.go": docGo, } -// AssetDebug is true if the assets were built with the debug flag enabled. -const AssetDebug = false - // AssetDir returns the file names below a certain // directory embedded in the file by go-bindata. // For example if you run go-bindata on data/... and data contains the // following hierarchy: -// -// data/ -// foo.txt -// img/ -// a.png -// b.png -// +// data/ +// foo.txt +// img/ +// a.png +// b.png // then AssetDir("data") would return []string{"foo.txt", "img"}, // AssetDir("data/img") would return []string{"a.png", "b.png"}, // AssetDir("foo.txt") and AssetDir("notexist") would return an error, and @@ -1658,72 +1742,73 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "1640111208_dummy.up.sql": {_1640111208_dummyUpSql, map[string]*bintree{}}, - "1642666031_add_removed_clock_to_bookmarks.up.sql": {_1642666031_add_removed_clock_to_bookmarksUpSql, map[string]*bintree{}}, - "1643644541_gif_api_key_setting.up.sql": {_1643644541_gif_api_key_settingUpSql, map[string]*bintree{}}, - "1644188994_recent_stickers.up.sql": {_1644188994_recent_stickersUpSql, map[string]*bintree{}}, - "1646659233_add_address_to_dapp_permisssion.up.sql": {_1646659233_add_address_to_dapp_permisssionUpSql, map[string]*bintree{}}, - "1646841105_add_emoji_account.up.sql": {_1646841105_add_emoji_accountUpSql, map[string]*bintree{}}, - "1647278782_display_name.up.sql": {_1647278782_display_nameUpSql, map[string]*bintree{}}, - "1647862838_reset_last_backup.up.sql": {_1647862838_reset_last_backupUpSql, map[string]*bintree{}}, - "1647871652_add_settings_sync_clock_table.up.sql": {_1647871652_add_settings_sync_clock_tableUpSql, map[string]*bintree{}}, - "1647880168_add_torrent_config.up.sql": {_1647880168_add_torrent_configUpSql, map[string]*bintree{}}, - "1647882837_add_communities_settings_table.up.sql": {_1647882837_add_communities_settings_tableUpSql, map[string]*bintree{}}, - "1647956635_add_waku_messages_table.up.sql": {_1647956635_add_waku_messages_tableUpSql, map[string]*bintree{}}, - "1648554928_network_test.up.sql": {_1648554928_network_testUpSql, map[string]*bintree{}}, - "1649174829_add_visitble_token.up.sql": {_1649174829_add_visitble_tokenUpSql, map[string]*bintree{}}, - "1649882262_add_derived_from_accounts.up.sql": {_1649882262_add_derived_from_accountsUpSql, map[string]*bintree{}}, - "1650612625_add_community_message_archive_hashes_table.up.sql": {_1650612625_add_community_message_archive_hashes_tableUpSql, map[string]*bintree{}}, - "1650616788_add_communities_archives_info_table.up.sql": {_1650616788_add_communities_archives_info_tableUpSql, map[string]*bintree{}}, - "1652715604_add_clock_accounts.up.sql": {_1652715604_add_clock_accountsUpSql, map[string]*bintree{}}, - "1653037334_add_notifications_settings_table.up.sql": {_1653037334_add_notifications_settings_tableUpSql, map[string]*bintree{}}, - "1654702119_add_mutual_contact_settings.up.sql": {_1654702119_add_mutual_contact_settingsUpSql, map[string]*bintree{}}, - "1655375270_add_clock_field_to_communities_settings_table.up.sql": {_1655375270_add_clock_field_to_communities_settings_tableUpSql, map[string]*bintree{}}, - "1655385721_drop_networks_config.up.sql": {_1655385721_drop_networks_configUpSql, map[string]*bintree{}}, - "1655385724_networks_chainColor_shortName.up.sql": {_1655385724_networks_chaincolor_shortnameUpSql, map[string]*bintree{}}, - "1655456688_add_deleted_at_field_to_bookmarks_table.up.sql": {_1655456688_add_deleted_at_field_to_bookmarks_tableUpSql, map[string]*bintree{}}, - "1655462032_create_bookmarks_deleted_at_index.up.sql": {_1655462032_create_bookmarks_deleted_at_indexUpSql, map[string]*bintree{}}, - "1657617291_add_multi_transactions_table.up.sql": {_1657617291_add_multi_transactions_tableUpSql, map[string]*bintree{}}, - "1660134042_add_social_links_settings_table.up.sql": {_1660134042_add_social_links_settings_tableUpSql, map[string]*bintree{}}, - "1660134060_settings_bio.up.sql": {_1660134060_settings_bioUpSql, map[string]*bintree{}}, - "1660134070_add_wakuv2_store.up.sql": {_1660134070_add_wakuv2_storeUpSql, map[string]*bintree{}}, - "1660134072_waku2_store_messages.up.sql": {_1660134072_waku2_store_messagesUpSql, map[string]*bintree{}}, - "1662365868_add_key_uid_accounts.up.sql": {_1662365868_add_key_uid_accountsUpSql, map[string]*bintree{}}, - "1662447680_add_keypairs_table.up.sql": {_1662447680_add_keypairs_tableUpSql, map[string]*bintree{}}, - "1662460056_move_favourites_to_saved_addresses.up.sql": {_1662460056_move_favourites_to_saved_addressesUpSql, map[string]*bintree{}}, - "1662738097_add_base_fee_transaction.up.sql": {_1662738097_add_base_fee_transactionUpSql, map[string]*bintree{}}, - "1662972194_add_keypairs_table.up.sql": {_1662972194_add_keypairs_tableUpSql, map[string]*bintree{}}, - "1664392661_add_third_party_id_to_waku_messages.up.sql": {_1664392661_add_third_party_id_to_waku_messagesUpSql, map[string]*bintree{}}, - "1664783660_add_sync_info_to_saved_addresses.up.sql": {_1664783660_add_sync_info_to_saved_addressesUpSql, map[string]*bintree{}}, - "1668109917_wakunodes.up.sql": {_1668109917_wakunodesUpSql, map[string]*bintree{}}, - "1670249678_display_name_to_settings_sync_clock_table.up.sql": {_1670249678_display_name_to_settings_sync_clock_tableUpSql, map[string]*bintree{}}, - "1670836810_add_imported_flag_to_community_archive_hashes.up.sql": {_1670836810_add_imported_flag_to_community_archive_hashesUpSql, map[string]*bintree{}}, - "1671438731_add_magnetlink_uri_to_communities_archive_info.up.sql": {_1671438731_add_magnetlink_uri_to_communities_archive_infoUpSql, map[string]*bintree{}}, - "1672933930_switcher_card.up.sql": {_1672933930_switcher_cardUpSql, map[string]*bintree{}}, - "1674056187_add_price_cache.up.sql": {_1674056187_add_price_cacheUpSql, map[string]*bintree{}}, - "1674136690_ens_usernames.up.sql": {_1674136690_ens_usernamesUpSql, map[string]*bintree{}}, - "1674232431_add_balance_history.up.sql": {_1674232431_add_balance_historyUpSql, map[string]*bintree{}}, - "1676368933_keypairs_to_keycards.up.sql": {_1676368933_keypairs_to_keycardsUpSql, map[string]*bintree{}}, - "1676951398_add_currency_format_cache.up.sql": {_1676951398_add_currency_format_cacheUpSql, map[string]*bintree{}}, - "1676968196_keycards_add_clock_column.up.sql": {_1676968196_keycards_add_clock_columnUpSql, map[string]*bintree{}}, - "1676968197_add_fallback_rpc_to_networks.up.sql": {_1676968197_add_fallback_rpc_to_networksUpSql, map[string]*bintree{}}, - "1677674090_add_chains_ens_istest_to_saved_addresses.up.sql": {_1677674090_add_chains_ens_istest_to_saved_addressesUpSql, map[string]*bintree{}}, - "1677681143_accounts_table_type_column_update.up.sql": {_1677681143_accounts_table_type_column_updateUpSql, map[string]*bintree{}}, - "1678264207_accounts_table_new_columns_added.up.sql": {_1678264207_accounts_table_new_columns_addedUpSql, map[string]*bintree{}}, - "1680770368_add_bio_to_settings_sync_clock_table.up.sql": {_1680770368_add_bio_to_settings_sync_clock_tableUpSql, map[string]*bintree{}}, - "1681110436_add_mnemonic_to_settings_sync_clock_table.up.sql": {_1681110436_add_mnemonic_to_settings_sync_clock_tableUpSql, map[string]*bintree{}}, - "1681392602_9d_sync_period.up.sql": {_1681392602_9d_sync_periodUpSql, map[string]*bintree{}}, - "1681762078_default_sync_period_9d.up.sql": {_1681762078_default_sync_period_9dUpSql, map[string]*bintree{}}, - "1681780680_add_clock_to_social_links_settings.up.sql": {_1681780680_add_clock_to_social_links_settingsUpSql, map[string]*bintree{}}, - "1682073779_settings_table_remove_latest_derived_path_column.up.sql": {_1682073779_settings_table_remove_latest_derived_path_columnUpSql, map[string]*bintree{}}, - "1682146075_add_created_at_to_saved_addresses.up.sql": {_1682146075_add_created_at_to_saved_addressesUpSql, map[string]*bintree{}}, - "1682393575_sync_ens_name.up.sql": {_1682393575_sync_ens_nameUpSql, map[string]*bintree{}}, - "1683457503_add_blocks_ranges_sequential_table.up.sql": {_1683457503_add_blocks_ranges_sequential_tableUpSql, map[string]*bintree{}}, - "1683627613_accounts_and_keycards_improvements.up.sql": {_1683627613_accounts_and_keycards_improvementsUpSql, map[string]*bintree{}}, - "1685041348_settings_table_add_latest_derived_path_column.up.sql": {_1685041348_settings_table_add_latest_derived_path_columnUpSql, map[string]*bintree{}}, - "1685440989_update_color_id_accounts.up.sql": {_1685440989_update_color_id_accountsUpSql, map[string]*bintree{}}, - "1685463947_add_to_asset_to_multitransaction.up.sql": {_1685463947_add_to_asset_to_multitransactionUpSql, map[string]*bintree{}}, - "doc.go": {docGo, map[string]*bintree{}}, + "1640111208_dummy.up.sql": &bintree{_1640111208_dummyUpSql, map[string]*bintree{}}, + "1642666031_add_removed_clock_to_bookmarks.up.sql": &bintree{_1642666031_add_removed_clock_to_bookmarksUpSql, map[string]*bintree{}}, + "1643644541_gif_api_key_setting.up.sql": &bintree{_1643644541_gif_api_key_settingUpSql, map[string]*bintree{}}, + "1644188994_recent_stickers.up.sql": &bintree{_1644188994_recent_stickersUpSql, map[string]*bintree{}}, + "1646659233_add_address_to_dapp_permisssion.up.sql": &bintree{_1646659233_add_address_to_dapp_permisssionUpSql, map[string]*bintree{}}, + "1646841105_add_emoji_account.up.sql": &bintree{_1646841105_add_emoji_accountUpSql, map[string]*bintree{}}, + "1647278782_display_name.up.sql": &bintree{_1647278782_display_nameUpSql, map[string]*bintree{}}, + "1647862838_reset_last_backup.up.sql": &bintree{_1647862838_reset_last_backupUpSql, map[string]*bintree{}}, + "1647871652_add_settings_sync_clock_table.up.sql": &bintree{_1647871652_add_settings_sync_clock_tableUpSql, map[string]*bintree{}}, + "1647880168_add_torrent_config.up.sql": &bintree{_1647880168_add_torrent_configUpSql, map[string]*bintree{}}, + "1647882837_add_communities_settings_table.up.sql": &bintree{_1647882837_add_communities_settings_tableUpSql, map[string]*bintree{}}, + "1647956635_add_waku_messages_table.up.sql": &bintree{_1647956635_add_waku_messages_tableUpSql, map[string]*bintree{}}, + "1648554928_network_test.up.sql": &bintree{_1648554928_network_testUpSql, map[string]*bintree{}}, + "1649174829_add_visitble_token.up.sql": &bintree{_1649174829_add_visitble_tokenUpSql, map[string]*bintree{}}, + "1649882262_add_derived_from_accounts.up.sql": &bintree{_1649882262_add_derived_from_accountsUpSql, map[string]*bintree{}}, + "1650612625_add_community_message_archive_hashes_table.up.sql": &bintree{_1650612625_add_community_message_archive_hashes_tableUpSql, map[string]*bintree{}}, + "1650616788_add_communities_archives_info_table.up.sql": &bintree{_1650616788_add_communities_archives_info_tableUpSql, map[string]*bintree{}}, + "1652715604_add_clock_accounts.up.sql": &bintree{_1652715604_add_clock_accountsUpSql, map[string]*bintree{}}, + "1653037334_add_notifications_settings_table.up.sql": &bintree{_1653037334_add_notifications_settings_tableUpSql, map[string]*bintree{}}, + "1654702119_add_mutual_contact_settings.up.sql": &bintree{_1654702119_add_mutual_contact_settingsUpSql, map[string]*bintree{}}, + "1655375270_add_clock_field_to_communities_settings_table.up.sql": &bintree{_1655375270_add_clock_field_to_communities_settings_tableUpSql, map[string]*bintree{}}, + "1655385721_drop_networks_config.up.sql": &bintree{_1655385721_drop_networks_configUpSql, map[string]*bintree{}}, + "1655385724_networks_chainColor_shortName.up.sql": &bintree{_1655385724_networks_chaincolor_shortnameUpSql, map[string]*bintree{}}, + "1655456688_add_deleted_at_field_to_bookmarks_table.up.sql": &bintree{_1655456688_add_deleted_at_field_to_bookmarks_tableUpSql, map[string]*bintree{}}, + "1655462032_create_bookmarks_deleted_at_index.up.sql": &bintree{_1655462032_create_bookmarks_deleted_at_indexUpSql, map[string]*bintree{}}, + "1657617291_add_multi_transactions_table.up.sql": &bintree{_1657617291_add_multi_transactions_tableUpSql, map[string]*bintree{}}, + "1660134042_add_social_links_settings_table.up.sql": &bintree{_1660134042_add_social_links_settings_tableUpSql, map[string]*bintree{}}, + "1660134060_settings_bio.up.sql": &bintree{_1660134060_settings_bioUpSql, map[string]*bintree{}}, + "1660134070_add_wakuv2_store.up.sql": &bintree{_1660134070_add_wakuv2_storeUpSql, map[string]*bintree{}}, + "1660134072_waku2_store_messages.up.sql": &bintree{_1660134072_waku2_store_messagesUpSql, map[string]*bintree{}}, + "1662365868_add_key_uid_accounts.up.sql": &bintree{_1662365868_add_key_uid_accountsUpSql, map[string]*bintree{}}, + "1662447680_add_keypairs_table.up.sql": &bintree{_1662447680_add_keypairs_tableUpSql, map[string]*bintree{}}, + "1662460056_move_favourites_to_saved_addresses.up.sql": &bintree{_1662460056_move_favourites_to_saved_addressesUpSql, map[string]*bintree{}}, + "1662738097_add_base_fee_transaction.up.sql": &bintree{_1662738097_add_base_fee_transactionUpSql, map[string]*bintree{}}, + "1662972194_add_keypairs_table.up.sql": &bintree{_1662972194_add_keypairs_tableUpSql, map[string]*bintree{}}, + "1664392661_add_third_party_id_to_waku_messages.up.sql": &bintree{_1664392661_add_third_party_id_to_waku_messagesUpSql, map[string]*bintree{}}, + "1664783660_add_sync_info_to_saved_addresses.up.sql": &bintree{_1664783660_add_sync_info_to_saved_addressesUpSql, map[string]*bintree{}}, + "1668109917_wakunodes.up.sql": &bintree{_1668109917_wakunodesUpSql, map[string]*bintree{}}, + "1670249678_display_name_to_settings_sync_clock_table.up.sql": &bintree{_1670249678_display_name_to_settings_sync_clock_tableUpSql, map[string]*bintree{}}, + "1670836810_add_imported_flag_to_community_archive_hashes.up.sql": &bintree{_1670836810_add_imported_flag_to_community_archive_hashesUpSql, map[string]*bintree{}}, + "1671438731_add_magnetlink_uri_to_communities_archive_info.up.sql": &bintree{_1671438731_add_magnetlink_uri_to_communities_archive_infoUpSql, map[string]*bintree{}}, + "1672933930_switcher_card.up.sql": &bintree{_1672933930_switcher_cardUpSql, map[string]*bintree{}}, + "1674056187_add_price_cache.up.sql": &bintree{_1674056187_add_price_cacheUpSql, map[string]*bintree{}}, + "1674136690_ens_usernames.up.sql": &bintree{_1674136690_ens_usernamesUpSql, map[string]*bintree{}}, + "1674232431_add_balance_history.up.sql": &bintree{_1674232431_add_balance_historyUpSql, map[string]*bintree{}}, + "1676368933_keypairs_to_keycards.up.sql": &bintree{_1676368933_keypairs_to_keycardsUpSql, map[string]*bintree{}}, + "1676951398_add_currency_format_cache.up.sql": &bintree{_1676951398_add_currency_format_cacheUpSql, map[string]*bintree{}}, + "1676968196_keycards_add_clock_column.up.sql": &bintree{_1676968196_keycards_add_clock_columnUpSql, map[string]*bintree{}}, + "1676968197_add_fallback_rpc_to_networks.up.sql": &bintree{_1676968197_add_fallback_rpc_to_networksUpSql, map[string]*bintree{}}, + "1677674090_add_chains_ens_istest_to_saved_addresses.up.sql": &bintree{_1677674090_add_chains_ens_istest_to_saved_addressesUpSql, map[string]*bintree{}}, + "1677681143_accounts_table_type_column_update.up.sql": &bintree{_1677681143_accounts_table_type_column_updateUpSql, map[string]*bintree{}}, + "1678264207_accounts_table_new_columns_added.up.sql": &bintree{_1678264207_accounts_table_new_columns_addedUpSql, map[string]*bintree{}}, + "1680770368_add_bio_to_settings_sync_clock_table.up.sql": &bintree{_1680770368_add_bio_to_settings_sync_clock_tableUpSql, map[string]*bintree{}}, + "1681110436_add_mnemonic_to_settings_sync_clock_table.up.sql": &bintree{_1681110436_add_mnemonic_to_settings_sync_clock_tableUpSql, map[string]*bintree{}}, + "1681392602_9d_sync_period.up.sql": &bintree{_1681392602_9d_sync_periodUpSql, map[string]*bintree{}}, + "1681762078_default_sync_period_9d.up.sql": &bintree{_1681762078_default_sync_period_9dUpSql, map[string]*bintree{}}, + "1681780680_add_clock_to_social_links_settings.up.sql": &bintree{_1681780680_add_clock_to_social_links_settingsUpSql, map[string]*bintree{}}, + "1682073779_settings_table_remove_latest_derived_path_column.up.sql": &bintree{_1682073779_settings_table_remove_latest_derived_path_columnUpSql, map[string]*bintree{}}, + "1682146075_add_created_at_to_saved_addresses.up.sql": &bintree{_1682146075_add_created_at_to_saved_addressesUpSql, map[string]*bintree{}}, + "1682393575_sync_ens_name.up.sql": &bintree{_1682393575_sync_ens_nameUpSql, map[string]*bintree{}}, + "1683457503_add_blocks_ranges_sequential_table.up.sql": &bintree{_1683457503_add_blocks_ranges_sequential_tableUpSql, map[string]*bintree{}}, + "1683627613_accounts_and_keycards_improvements.up.sql": &bintree{_1683627613_accounts_and_keycards_improvementsUpSql, map[string]*bintree{}}, + "1685041348_settings_table_add_latest_derived_path_column.up.sql": &bintree{_1685041348_settings_table_add_latest_derived_path_columnUpSql, map[string]*bintree{}}, + "1685440989_update_color_id_accounts.up.sql": &bintree{_1685440989_update_color_id_accountsUpSql, map[string]*bintree{}}, + "1685463947_add_to_asset_to_multitransaction.up.sql": &bintree{_1685463947_add_to_asset_to_multitransactionUpSql, map[string]*bintree{}}, + "1685880973_add_profile_links_settings_table.up.sql": &bintree{_1685880973_add_profile_links_settings_tableUpSql, map[string]*bintree{}}, + "doc.go": &bintree{docGo, map[string]*bintree{}}, }} // RestoreAsset restores an asset under the given directory. @@ -1740,7 +1825,7 @@ func RestoreAsset(dir, name string) error { if err != nil { return err } - err = os.WriteFile(_filePath(dir, name), data, info.Mode()) + err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) if err != nil { return err } diff --git a/appdatabase/migrations/sql/1685880973_add_profile_links_settings_table.up.sql b/appdatabase/migrations/sql/1685880973_add_profile_links_settings_table.up.sql new file mode 100644 index 000000000..a8f34e52c --- /dev/null +++ b/appdatabase/migrations/sql/1685880973_add_profile_links_settings_table.up.sql @@ -0,0 +1,30 @@ +-- Create new table where we will store profile social links, +-- after discussion https://github.com/status-im/status-go/pull/3552#issuecomment-1573817044 +-- we decided to replace the entire db table content on every change (because of that position column is not needed) +CREATE TABLE IF NOT EXISTS profile_social_links ( + text VARCHAR NOT NULL CHECK (length(trim(text)) > 0), + url VARCHAR NOT NULL CHECK (length(trim(url)) > 0), + PRIMARY KEY (text, url) +); + +-- Create new column to keep clock of the last change of profile social links (since content is replaced all row share the same clock value) +ALTER TABLE settings_sync_clock ADD COLUMN social_links INTEGER NOT NULL DEFAULT 0; + +-- Insert into `profile_social_links` table +INSERT INTO profile_social_links (text, url) + SELECT link_text, link_url + FROM social_links_settings + WHERE link_url != ""; + +-- From some reason the following sql doesn't work through status-go migrations, although the query is correct. +-- -- Set the clock for profile social links +-- UPDATE settings_sync_clock +-- SET +-- social_links = (SELECT clock +-- FROM social_links_settings +-- WHERE link_url != "" +-- LIMIT 1) +-- WHERE synthetic_id = "id"; + +-- Drop old table +DROP TABLE social_links_settings; \ No newline at end of file diff --git a/multiaccounts/settings_social_links/database.go b/multiaccounts/settings_social_links/database.go index 6f0e228f5..32bef26d6 100644 --- a/multiaccounts/settings_social_links/database.go +++ b/multiaccounts/settings_social_links/database.go @@ -8,6 +8,14 @@ import ( "github.com/status-im/status-go/protocol/identity" ) +const ( + MaxNumOfSocialLinks = 20 +) + +var ( + ErrNilSocialLinkProvided = errors.New("social links, nil object provided") +) + type SocialLinksSettings struct { db *sql.DB } @@ -18,68 +26,60 @@ func NewSocialLinksSettings(db *sql.DB) *SocialLinksSettings { } } -func (s *SocialLinksSettings) GetSocialLink(text string) (*identity.SocialLink, error) { - rows, err := s.db.Query(`SELECT link_text, link_url, clock FROM social_links_settings WHERE link_text = ?`, text) +func (s *SocialLinksSettings) getSocialLinksClock(tx *sql.Tx) (result uint64, err error) { + query := "SELECT social_links FROM settings_sync_clock WHERE synthetic_id = 'id'" + if tx == nil { + err = s.db.QueryRow(query).Scan(&result) + } else { + err = tx.QueryRow(query).Scan(&result) + } + return result, err +} + +func (s *SocialLinksSettings) getSocialLinks(tx *sql.Tx) (identity.SocialLinks, error) { + var ( + rows *sql.Rows + err error + ) + query := "SELECT * FROM profile_social_links" + + if tx == nil { + rows, err = s.db.Query(query) + } else { + rows, err = tx.Query(query) + } if err != nil { return nil, err } defer rows.Close() - if rows.Next() { - link := identity.SocialLink{} - var url sql.NullString - - err = rows.Scan( - &link.Text, &url, &link.Clock, - ) + var socialLinks identity.SocialLinks + for rows.Next() { + socialLink := &identity.SocialLink{} + err := rows.Scan(&socialLink.Text, &socialLink.URL) if err != nil { return nil, err } - - if url.Valid { - link.URL = url.String - } - return &link, nil + socialLinks = append(socialLinks, socialLink) } - return nil, nil + err = rows.Err() + if err != nil { + return nil, err + } + + return socialLinks, nil } func (s *SocialLinksSettings) GetSocialLinks() (identity.SocialLinks, error) { - rows, err := s.db.Query(`SELECT link_text, link_url, clock FROM social_links_settings`) - if err != nil { - return nil, err - } - defer rows.Close() - - links := identity.SocialLinks{} - - for rows.Next() { - link := identity.SocialLink{} - var url sql.NullString - - err := rows.Scan( - &link.Text, &url, &link.Clock, - ) - if err != nil { - return nil, err - } - - if url.Valid { - link.URL = url.String - } - links = append(links, link) - } - - return links, nil + return s.getSocialLinks(nil) } -// Be careful, it removes every row before insertion -func (s *SocialLinksSettings) SetSocialLinks(links *identity.SocialLinks) (err error) { - if links == nil { - return errors.New("can't set social links, nil object provided") - } +func (s *SocialLinksSettings) GetSocialLinksClock() (result uint64, err error) { + return s.getSocialLinksClock(nil) +} +func (s *SocialLinksSettings) AddOrReplaceSocialLinksIfNewer(links identity.SocialLinks, clock uint64) error { tx, err := s.db.BeginTx(context.Background(), &sql.TxOptions{}) if err != nil { return err @@ -89,57 +89,53 @@ func (s *SocialLinksSettings) SetSocialLinks(links *identity.SocialLinks) (err e err = tx.Commit() return } - // don't shadow original error _ = tx.Rollback() }() - // remove everything - _, err = tx.Exec(`DELETE from social_links_settings`) + dbClock, err := s.getSocialLinksClock(tx) + if err != nil { + return err + } - stmt, err := tx.Prepare("INSERT INTO social_links_settings (link_text, link_url, clock) VALUES (?, ?, ?)") + if dbClock > clock { + return nil + } + + dbLinks, err := s.getSocialLinks(tx) + if err != nil { + return err + } + if len(dbLinks) > 0 { + _, err = tx.Exec("DELETE from profile_social_links") + if err != nil { + return err + } + } + + stmt, err := tx.Prepare("INSERT INTO profile_social_links (text, url) VALUES (?, ?)") if err != nil { return err } defer stmt.Close() - for _, link := range *links { + for _, link := range links { + if link == nil { + return ErrNilSocialLinkProvided + } _, err = stmt.Exec( link.Text, link.URL, - link.Clock, ) if err != nil { return err } } - return nil -} + stmt, err = tx.Prepare("UPDATE settings_sync_clock SET social_links = ? WHERE synthetic_id = 'id'") + if err != nil { + return err + } -func (s *SocialLinksSettings) UpdateSocialLinkFromSync(link *identity.SocialLink) error { - if link == nil { - return errors.New("can't update social link, nil object provided") - } - tx, err := s.db.BeginTx(context.Background(), &sql.TxOptions{}) - if err != nil { - return err - } - defer func() { - if err == nil { - err = tx.Commit() - return - } - // don't shadow original error - _ = tx.Rollback() - }() - - stmt, err := tx.Prepare("UPDATE social_links_settings SET link_text = ?, link_url = ?, clock = ? WHERE link_text = ? AND clock < ?") - if err != nil { - return err - } - _, err = stmt.Exec(link.Text, link.URL, link.Clock, link.Text, link.Clock) - if err != nil { - return err - } - return stmt.Close() + _, err = stmt.Exec(clock) + return err } diff --git a/multiaccounts/settings_social_links/database_test.go b/multiaccounts/settings_social_links/database_test.go index b398542f9..c52a8fd1c 100644 --- a/multiaccounts/settings_social_links/database_test.go +++ b/multiaccounts/settings_social_links/database_test.go @@ -27,91 +27,207 @@ func openTestDB(t *testing.T) (*SocialLinksSettings, func()) { } } -func socialLinksWithDefaults(twitter, personalSite, github, youtube, discord, telegram string) identity.SocialLinks { +func profileSocialLinks() identity.SocialLinks { return identity.SocialLinks{ { Text: identity.TwitterID, - URL: twitter, + URL: "https://twitter.com/ethstatus", }, - { - Text: identity.PersonalSiteID, - URL: personalSite, - }, - { - Text: identity.GithubID, - URL: github, - }, - { - Text: identity.YoutubeID, - URL: youtube, - }, - { - Text: identity.DiscordID, - URL: discord, - }, - { - Text: identity.TelegramID, - URL: telegram, - }, - } -} - -func TestDatabase(t *testing.T) { - socialLinkSettings, stop := openTestDB(t) - defer stop() - - // fresh database should have default rows - links, err := socialLinkSettings.GetSocialLinks() - require.NoError(t, err) - require.True(t, links.Equals(socialLinksWithDefaults("", "", "", "", "", ""))) - - // cleaning db should not remove default rows - links = identity.SocialLinks{} - err = socialLinkSettings.SetSocialLinks(&links) - require.NoError(t, err) - links, err = socialLinkSettings.GetSocialLinks() - require.NoError(t, err) - require.True(t, links.Equals(identity.SocialLinks{})) - - // custom links - links = identity.SocialLinks{ { Text: identity.TwitterID, - URL: "Status_ico", + URL: "https://twitter.com/StatusIMBlog", }, { Text: identity.TelegramID, URL: "dummy.telegram", }, + { + Text: identity.YoutubeID, + URL: "https://www.youtube.com/@Statusim", + }, + { + Text: identity.YoutubeID, + URL: "https://www.youtube.com/@EthereumProtocol", + }, { Text: "customLink", URL: "customLink.com", }, } - err = socialLinkSettings.SetSocialLinks(&links) - require.NoError(t, err) - - expected := identity.SocialLinks{ - { - Text: identity.TwitterID, - URL: "Status_ico", - }, - { - Text: identity.TelegramID, - URL: "dummy.telegram", - }, - } - expected = append(expected, identity.SocialLink{Text: "customLink", URL: "customLink.com"}) - - links, err = socialLinkSettings.GetSocialLinks() - require.NoError(t, err) - require.True(t, links.Equals(expected)) - - // cleaning database with defaults should remove custom links - links = socialLinksWithDefaults("", "", "", "", "", "") - err = socialLinkSettings.SetSocialLinks(&links) - require.NoError(t, err) - links, err = socialLinkSettings.GetSocialLinks() - require.NoError(t, err) - require.True(t, links.Equals(socialLinksWithDefaults("", "", "", "", "", ""))) +} + +func TestProfileSocialLinksSaveAndGet(t *testing.T) { + socialLinkSettings, stop := openTestDB(t) + defer stop() + + // db is empty at the beginning + links, err := socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, 0) + + clock := uint64(1) + // add profile social links with new clock + profileSocialLinks1 := profileSocialLinks()[:2] + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks1, clock) + require.NoError(t, err) + + // check social links + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, len(profileSocialLinks1)) + require.True(t, profileSocialLinks1.Equal(links)) + + oldClock := uint64(0) + // delete add profile social links with old clock + profileSocialLinks2 := profileSocialLinks() + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks2, oldClock) + require.NoError(t, err) + + // check social links + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, len(profileSocialLinks1)) + require.True(t, profileSocialLinks1.Equal(links)) + + // check clock + dbClock, err := socialLinkSettings.GetSocialLinksClock() + require.NoError(t, err) + require.Equal(t, clock, dbClock) +} + +func TestProfileSocialLinksUpdate(t *testing.T) { + socialLinkSettings, stop := openTestDB(t) + defer stop() + + // db is empty at the beginning + links, err := socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, 0) + + clock := uint64(1) + // add profile social links + profileSocialLinks := profileSocialLinks() + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock) + require.NoError(t, err) + + clock = 2 + // test sociial link update + updateLinkAtIndex := 2 + profileSocialLinks[updateLinkAtIndex].Text = identity.GithubID + profileSocialLinks[updateLinkAtIndex].URL = "https://github.com/status-im" + + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock) + require.NoError(t, err) + + // check social links + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, len(profileSocialLinks)) + require.True(t, profileSocialLinks.Equal(links)) + + // check clock + dbClock, err := socialLinkSettings.GetSocialLinksClock() + require.NoError(t, err) + require.Equal(t, clock, dbClock) +} + +func TestProfileSocialLinksDelete(t *testing.T) { + socialLinkSettings, stop := openTestDB(t) + defer stop() + + // db is empty at the beginning + links, err := socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, 0) + + clock := uint64(1) + // add profile social links + profileSocialLinks := profileSocialLinks() + totalLinks := len(profileSocialLinks) + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock) + require.NoError(t, err) + + // check + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, totalLinks) + require.True(t, profileSocialLinks.Equal(links)) + + // prepare new links to save + removeLinkAtIndex := 2 + removedLink := profileSocialLinks[removeLinkAtIndex] + profileSocialLinks = append(profileSocialLinks[:removeLinkAtIndex], profileSocialLinks[removeLinkAtIndex+1:]...) + + oldClock := uint64(0) + // test delete with old clock + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, oldClock) + require.NoError(t, err) + + // check + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, totalLinks) + require.True(t, links.Contains(removedLink)) + + clock = 2 + // test delete link new clock + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock) + require.NoError(t, err) + + // check social links + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, totalLinks-1) + require.True(t, profileSocialLinks.Equal(links)) + require.False(t, links.Contains(removedLink)) + + // check clock + dbClock, err := socialLinkSettings.GetSocialLinksClock() + require.NoError(t, err) + require.Equal(t, clock, dbClock) +} + +func TestProfileSocialLinksReorder(t *testing.T) { + socialLinkSettings, stop := openTestDB(t) + defer stop() + + // db is empty at the beginning + links, err := socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, 0) + + clock := uint64(1) + // add profile social links + profileSocialLinks := profileSocialLinks() + totalLinks := len(profileSocialLinks) + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, clock) + require.NoError(t, err) + + // check social links + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, links, len(profileSocialLinks)) + require.True(t, profileSocialLinks.Equal(links)) + + var randomLinksOrder identity.SocialLinks + for i := len(profileSocialLinks) - 1; i >= 3; i-- { + randomLinksOrder = append(randomLinksOrder, profileSocialLinks[i]) + } + randomLinksOrder = append(randomLinksOrder, profileSocialLinks[:3]...) + + clock = 2 + // test reorder links + err = socialLinkSettings.AddOrReplaceSocialLinksIfNewer(randomLinksOrder, clock) + require.NoError(t, err) + + // check social links + links, err = socialLinkSettings.GetSocialLinks() + require.NoError(t, err) + require.Len(t, randomLinksOrder, totalLinks) + require.True(t, randomLinksOrder.Equal(links)) + + // check clock + dbClock, err := socialLinkSettings.GetSocialLinksClock() + require.NoError(t, err) + require.Equal(t, clock, dbClock) } diff --git a/protocol/identity/social_links.go b/protocol/identity/social_links.go index f93c32004..b7f09736a 100644 --- a/protocol/identity/social_links.go +++ b/protocol/identity/social_links.go @@ -2,7 +2,6 @@ package identity import ( "encoding/json" - "reflect" "github.com/status-im/status-go/protocol/protobuf" ) @@ -18,33 +17,79 @@ const ( ) type SocialLink struct { - Text string `json:"text"` - URL string `json:"url"` - Clock uint64 `json:"clock"` + Text string `json:"text"` + URL string `json:"url"` } -type SocialLinks []SocialLink +type SocialLinks []*SocialLink -func NewSocialLinks(links []*protobuf.SocialLink) *SocialLinks { +type SocialLinksInfo struct { + Links []*SocialLink `json:"links"` + Removed bool `json:"removed"` +} + +func NewSocialLinks(links []*protobuf.SocialLink) SocialLinks { res := SocialLinks{} for _, link := range links { - res = append(res, SocialLink{Text: link.Text, URL: link.Url}) + res = append(res, &SocialLink{Text: link.Text, URL: link.Url}) } - return &res + return res +} + +func (s *SocialLink) ToProtobuf() *protobuf.SocialLink { + return &protobuf.SocialLink{ + Text: s.Text, + Url: s.URL, + } +} + +func (s *SocialLink) Equal(link *SocialLink) bool { + return s.Text == link.Text && s.URL == link.URL } func (s *SocialLinks) ToProtobuf() []*protobuf.SocialLink { res := []*protobuf.SocialLink{} for _, link := range *s { - res = append(res, &protobuf.SocialLink{Text: link.Text, Url: link.URL}) + res = append(res, link.ToProtobuf()) } return res } -func (s SocialLinks) Equals(rhs SocialLinks) bool { - return reflect.DeepEqual(s, rhs) +func (s *SocialLinks) ToSyncProtobuf(clock uint64) *protobuf.SyncSocialLinks { + res := &protobuf.SyncSocialLinks{ + Clock: clock, + } + for _, link := range *s { + res.SocialLinks = append(res.SocialLinks, link.ToProtobuf()) + } + return res +} + +// Equal means the same links at the same order +func (s *SocialLinks) Equal(links SocialLinks) bool { + if len(*s) != len(links) { + return false + } + for i := range *s { + if !(*s)[i].Equal(links[i]) { + return false + } + } + return true +} + +func (s *SocialLinks) Contains(link *SocialLink) bool { + if len(*s) == 0 { + return false + } + for _, l := range *s { + if l.Equal(link) { + return true + } + } + return false } func (s *SocialLinks) Serialize() ([]byte, error) { - return json.Marshal(s) + return json.Marshal(*s) } diff --git a/protocol/identity/social_links_test.go b/protocol/identity/social_links_test.go index 3a53c3704..42c2ce5d0 100644 --- a/protocol/identity/social_links_test.go +++ b/protocol/identity/social_links_test.go @@ -22,10 +22,10 @@ func TestEquals(t *testing.T) { protobufLinks := []*protobuf.SocialLink{} transformedLinks := NewSocialLinks(protobufLinks) - require.False(t, socialLinks.Equals(*transformedLinks)) + require.False(t, socialLinks.Equal(transformedLinks)) protobufLinks = append(protobufLinks, &protobuf.SocialLink{Text: "A", Url: "B"}) protobufLinks = append(protobufLinks, &protobuf.SocialLink{Text: "X", Url: "Y"}) transformedLinks = NewSocialLinks(protobufLinks) - require.True(t, socialLinks.Equals(*transformedLinks)) + require.True(t, socialLinks.Equal(transformedLinks)) } diff --git a/protocol/messenger.go b/protocol/messenger.go index 334f6da53..c565d4644 100644 --- a/protocol/messenger.go +++ b/protocol/messenger.go @@ -973,7 +973,7 @@ func (m *Messenger) attachChatIdentity(cca *protobuf.ContactCodeAdvertisement) e return err } - identityHash, err := m.getIdentityHash(displayName, bio, img, &socialLinks) + identityHash, err := m.getIdentityHash(displayName, bio, img, socialLinks) if err != nil { return err } @@ -1053,7 +1053,7 @@ func (m *Messenger) handleStandaloneChatIdentity(chat *Chat) error { return err } - identityHash, err := m.getIdentityHash(displayName, bio, img, &socialLinks) + identityHash, err := m.getIdentityHash(displayName, bio, img, socialLinks) if err != nil { return err } @@ -1066,7 +1066,7 @@ func (m *Messenger) handleStandaloneChatIdentity(chat *Chat) error { return nil } -func (m *Messenger) getIdentityHash(displayName, bio string, img *images.IdentityImage, socialLinks *identity.SocialLinks) ([]byte, error) { +func (m *Messenger) getIdentityHash(displayName, bio string, img *images.IdentityImage, socialLinks identity.SocialLinks) ([]byte, error) { socialLinksData, err := socialLinks.Serialize() if err != nil { return []byte{}, err @@ -1113,7 +1113,7 @@ func (m *Messenger) shouldPublishChatIdentity(chatID string) (bool, error) { return false, err } - identityHash, err := m.getIdentityHash(displayName, bio, img, &socialLinks) + identityHash, err := m.getIdentityHash(displayName, bio, img, socialLinks) if err != nil { return false, err } @@ -2514,7 +2514,7 @@ func (m *Messenger) SyncDevices(ctx context.Context, ensName, photoPath string, return err } - return m.syncSocialSettings(ctx, rawMessageHandler) + return m.syncSocialLinks(context.Background(), rawMessageHandler) } func (m *Messenger) syncContactRequestDecision(ctx context.Context, requestID string, accepted bool, rawMessageHandler RawMessageHandler) error { @@ -4246,17 +4246,17 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[transport.Filte allMessagesProcessed = false continue } - case protobuf.SyncSocialLinkSetting: + case protobuf.SyncSocialLinks: if !common.IsPubKeyEqual(messageState.CurrentMessageState.PublicKey, &m.identity.PublicKey) { logger.Warn("not coming from us, ignoring") continue } - p := msg.ParsedMessage.Interface().(protobuf.SyncSocialLinkSetting) + p := msg.ParsedMessage.Interface().(protobuf.SyncSocialLinks) m.outputToCSV(msg.TransportMessage.Timestamp, msg.ID, senderID, filter.Topic, filter.ChatID, msg.Type, p) - err = m.HandleSyncSocialLinkSetting(messageState, p) + err = m.HandleSyncSocialLinks(messageState, p) if err != nil { - logger.Warn("failed to handle SyncSocialLinkSetting", zap.Error(err)) + logger.Warn("failed to handle HandleSyncSocialLinks", zap.Error(err)) allMessagesProcessed = false continue } @@ -6284,62 +6284,74 @@ func (m *Messenger) syncDeleteForMeMessage(ctx context.Context, rawMessageDispat }) } -func (m *Messenger) syncSocialSettings(ctx context.Context, rawMessageDispatcher RawMessageHandler) error { +func (m *Messenger) syncSocialLinks(ctx context.Context, rawMessageDispatcher RawMessageHandler) error { if !m.hasPairedDevices() { return nil } - socialLinks, err := m.settings.GetSocialLinks() + dbSocialLinks, err := m.settings.GetSocialLinks() if err != nil { return err } - for _, link := range socialLinks { - syncMessage := &protobuf.SyncSocialLinkSetting{ - Text: link.Text, - Url: link.URL, - Clock: link.Clock, - } - encodedMessage, err2 := proto.Marshal(syncMessage) - if err2 != nil { - return err - } - err = m.withChatClock(func(chatID string, clock uint64) error { - rawMessage := common.RawMessage{ - LocalChatID: chatID, - Payload: encodedMessage, - MessageType: protobuf.ApplicationMetadataMessage_SYNC_SOCIAL_LINK_SETTING, - ResendAutomatically: true, - } - _, err = rawMessageDispatcher(ctx, rawMessage) - return err - }) - if err != nil { - return err - } + + dbClock, err := m.settings.GetSocialLinksClock() + if err != nil { + return err } - return nil + + _, chat := m.getLastClockWithRelatedChat() + encodedMessage, err := proto.Marshal(dbSocialLinks.ToSyncProtobuf(dbClock)) + if err != nil { + return err + } + + rawMessage := common.RawMessage{ + LocalChatID: chat.ID, + Payload: encodedMessage, + MessageType: protobuf.ApplicationMetadataMessage_SYNC_SOCIAL_LINKS, + ResendAutomatically: true, + } + + _, err = rawMessageDispatcher(ctx, rawMessage) + return err } -func (m *Messenger) HandleSyncSocialLinkSetting(state *ReceivedMessageState, message protobuf.SyncSocialLinkSetting) error { - return m.handleSyncSocialLinkSetting(message, func(link *identity.SocialLink) { - state.Response.AddSocialLinkSetting(link) +func (m *Messenger) HandleSyncSocialLinks(state *ReceivedMessageState, message protobuf.SyncSocialLinks) error { + return m.handleSyncSocialLinks(&message, func(links identity.SocialLinks) { + state.Response.SocialLinksInfo = &identity.SocialLinksInfo{ + Links: links, + Removed: len(links) == 0, + } }) } -func (m *Messenger) handleSyncSocialLinkSetting(message protobuf.SyncSocialLinkSetting, callback func(*identity.SocialLink)) error { - link := &identity.SocialLink{ - Text: message.Text, - URL: message.Url, - Clock: message.Clock, +func (m *Messenger) handleSyncSocialLinks(message *protobuf.SyncSocialLinks, callback func(identity.SocialLinks)) error { + if message == nil { + return nil } - if err := ValidateSocialLink(link); err != nil { - return err + var ( + links identity.SocialLinks + err error + ) + for _, sl := range message.SocialLinks { + link := &identity.SocialLink{ + Text: sl.Text, + URL: sl.Url, + } + err = ValidateSocialLink(link) + if err != nil { + return err + } + + links = append(links, link) } - err := m.settings.UpdateSocialLinkFromSync(link) + + err = m.settings.AddOrReplaceSocialLinksIfNewer(links, message.Clock) if err != nil { return err } - callback(link) + + callback(links) return nil } diff --git a/protocol/messenger_backup.go b/protocol/messenger_backup.go index 308310a6e..66c7b319f 100644 --- a/protocol/messenger_backup.go +++ b/protocol/messenger_backup.go @@ -379,13 +379,15 @@ func (m *Messenger) backupProfile(ctx context.Context, clock uint64) ([]*protobu if err != nil { return nil, err } - socialLinkSettingProtos := make([]*protobuf.SyncSocialLinkSetting, len(socialLinks)) - for i, socialLink := range socialLinks { - socialLinkSettingProtos[i] = &protobuf.SyncSocialLinkSetting{ - Text: socialLink.Text, - Url: socialLink.URL, - Clock: socialLink.Clock, - } + + socialLinksClock, err := m.settings.GetSocialLinksClock() + if err != nil { + return nil, err + } + + syncSocialLinks := &protobuf.SyncSocialLinks{ + SocialLinks: socialLinks.ToProtobuf(), + Clock: socialLinksClock, } ensUsernameDetails, err := m.getEnsUsernameDetails() @@ -408,7 +410,7 @@ func (m *Messenger) backupProfile(ctx context.Context, clock uint64) ([]*protobu DisplayName: displayName, Pictures: pictureProtos, DisplayNameClock: displayNameClock, - SocialLinkSettings: socialLinkSettingProtos, + SocialLinks: syncSocialLinks, EnsUsernameDetails: ensUsernameDetailProtos, }, } diff --git a/protocol/messenger_backup_handler.go b/protocol/messenger_backup_handler.go index 74c50b055..5d5a39359 100644 --- a/protocol/messenger_backup_handler.go +++ b/protocol/messenger_backup_handler.go @@ -146,16 +146,12 @@ func (m *Messenger) handleBackedUpProfile(message *protobuf.BackedUpProfile, bac } } - var links identity.SocialLinks - for _, s := range message.SocialLinkSettings { - err = m.handleSyncSocialLinkSetting(*s, func(link *identity.SocialLink) { - links = append(links, *link) - }) - if err != nil { - return err - } + err = m.handleSyncSocialLinks(message.SocialLinks, func(links identity.SocialLinks) { + response.SetSocialLinks(links) + }) + if err != nil { + return err } - response.SetSocialLinks(links) var ensUsernameDetails []*ensservice.UsernameDetail for _, d := range message.EnsUsernameDetails { diff --git a/protocol/messenger_backup_test.go b/protocol/messenger_backup_test.go index 6e26d4e5a..90fd204ee 100644 --- a/protocol/messenger_backup_test.go +++ b/protocol/messenger_backup_test.go @@ -163,13 +163,22 @@ func (s *MessengerBackupSuite) TestBackupProfile() { iis := images.SampleIdentityImages() s.Require().NoError(bob1.multiAccounts.StoreIdentityImages(bob1KeyUID, iis, false)) - err = bob1.SetSocialLinks(&identity.SocialLinks{ + profileSocialLinks := identity.SocialLinks{ { - Text: identity.GithubID, - URL: "https://github.com/status-im", - Clock: 1, + Text: identity.TwitterID, + URL: "https://twitter.com/ethstatus", }, - }) + { + Text: identity.TwitterID, + URL: "https://twitter.com/StatusIMBlog", + }, + { + Text: identity.GithubID, + URL: "https://github.com/status-im", + }, + } + profileSocialLinksClock := uint64(1) + err = bob1.settings.AddOrReplaceSocialLinksIfNewer(profileSocialLinks, profileSocialLinksClock) s.Require().NoError(err) bob1EnsUsernameDetail, err := bob1.saveEnsUsernameDetailProto(protobuf.SyncEnsUsernameDetail{ @@ -197,9 +206,13 @@ func (s *MessengerBackupSuite) TestBackupProfile() { s.Require().NoError(err) s.Require().Equal(imagesExpected, string(jBob1Images)) - bob1SocialLink, err := bob1.settings.GetSocialLink(identity.GithubID) + bob1SocialLinks, err := bob1.settings.GetSocialLinks() s.Require().NoError(err) - s.Require().NotNil(bob1SocialLink) + s.Require().Len(bob1SocialLinks, len(profileSocialLinks)) + + bob1SocialLinksClock, err := bob1.settings.GetSocialLinksClock() + s.Require().NoError(err) + s.Require().Equal(profileSocialLinksClock, bob1SocialLinksClock) bob1EnsUsernameDetails, err := bob1.getEnsUsernameDetails() s.Require().NoError(err) @@ -215,9 +228,13 @@ func (s *MessengerBackupSuite) TestBackupProfile() { s.Require().NoError(err) s.Require().Equal(expectedEmpty, bob2Images) - bob2SocialLink, err := bob2.settings.GetSocialLink(identity.GithubID) + bob2SocialLinks, err := bob2.settings.GetSocialLinks() s.Require().NoError(err) - s.Require().Equal("", bob2SocialLink.URL) + s.Require().Len(bob2SocialLinks, 0) + + bob2SocialLinksClock, err := bob2.settings.GetSocialLinksClock() + s.Require().NoError(err) + s.Require().Equal(uint64(0), bob2SocialLinksClock) bob2EnsUsernameDetails, err := bob2.getEnsUsernameDetails() s.Require().NoError(err) @@ -248,10 +265,14 @@ func (s *MessengerBackupSuite) TestBackupProfile() { s.Require().Equal(bob2Images[0].Payload, bob1Images[0].Payload) s.Require().Equal(bob2Images[1].Payload, bob1Images[1].Payload) - bob2SocialLink, err = bob2.settings.GetSocialLink(identity.GithubID) + bob2SocialLinks, err = bob2.settings.GetSocialLinks() s.Require().NoError(err) - s.Require().NotNil(bob2SocialLink) - s.Require().Equal(bob1SocialLink.URL, bob2SocialLink.URL) + s.Require().Len(bob2SocialLinks, len(profileSocialLinks)) + s.Require().True(profileSocialLinks.Equal(bob2SocialLinks)) + + bob2SocialLinksClock, err = bob2.settings.GetSocialLinksClock() + s.Require().NoError(err) + s.Require().Equal(profileSocialLinksClock, bob2SocialLinksClock) bob2EnsUsernameDetails, err = bob2.getEnsUsernameDetails() s.Require().NoError(err) diff --git a/protocol/messenger_handler.go b/protocol/messenger_handler.go index 556f681f4..203ddf123 100644 --- a/protocol/messenger_handler.go +++ b/protocol/messenger_handler.go @@ -2698,8 +2698,8 @@ func (m *Messenger) HandleChatIdentity(state *ReceivedMessageState, ci protobuf. return err } - if !contact.SocialLinks.Equals(*socialLinks) { - contact.SocialLinks = *socialLinks + if !contact.SocialLinks.Equal(socialLinks) { + contact.SocialLinks = socialLinks contactModified = true } } diff --git a/protocol/messenger_identity.go b/protocol/messenger_identity.go index 70696d7be..997bf4c6b 100644 --- a/protocol/messenger_identity.go +++ b/protocol/messenger_identity.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/status-im/status-go/multiaccounts/settings" + sociallinkssettings "github.com/status-im/status-go/multiaccounts/settings_social_links" "github.com/status-im/status-go/protocol/encryption/multidevice" "github.com/status-im/status-go/protocol/identity" "github.com/status-im/status-go/protocol/identity/alias" @@ -131,10 +132,10 @@ func (m *Messenger) SetBio(bio string) error { return m.publishContactCode() } -func ValidateSocialLinks(socialLinks *identity.SocialLinks) error { - for _, link := range *socialLinks { +func ValidateSocialLinks(socialLinks identity.SocialLinks) error { + for _, link := range socialLinks { l := link - if err := ValidateSocialLink(&l); err != nil { + if err := ValidateSocialLink(l); err != nil { return err } } @@ -148,33 +149,35 @@ func ValidateSocialLink(link *identity.SocialLink) error { return nil } -func (m *Messenger) SetSocialLinks(socialLinks *identity.SocialLinks) error { +func (m *Messenger) AddOrReplaceSocialLinks(socialLinks identity.SocialLinks) error { + if len(socialLinks) > sociallinkssettings.MaxNumOfSocialLinks { + return errors.New("exceeded maximum number of social links") + } + currentSocialLinks, err := m.settings.GetSocialLinks() if err != nil { return err } - if currentSocialLinks.Equals(*socialLinks) { + if currentSocialLinks.Equal(socialLinks) { return nil // Do nothing } - if err = ValidateSocialLinks(socialLinks); err != nil { - return err - } - - err = m.withChatClock(func(chatID string, clock uint64) error { - for _, link := range *socialLinks { - if link.Clock == 0 { - link.Clock = clock - } - } - return nil - }) + err = ValidateSocialLinks(socialLinks) if err != nil { return err } - if err = m.settings.SetSocialLinks(socialLinks); err != nil { + err = m.withChatClock(func(chatID string, clock uint64) error { + err = m.settings.AddOrReplaceSocialLinksIfNewer(socialLinks, clock) + if err != nil { + return err + } + + err = m.syncSocialLinks(context.Background(), m.dispatchMessage) + return err + }) + if err != nil { return err } @@ -182,16 +185,11 @@ func (m *Messenger) SetSocialLinks(socialLinks *identity.SocialLinks) error { return err } - err = m.publishContactCode() - if err != nil { - return err - } - - return m.syncSocialSettings(context.Background(), m.dispatchMessage) + return m.publishContactCode() } -func (m *Messenger) GetSocialLink(text string) (*identity.SocialLink, error) { - return m.settings.GetSocialLink(text) +func (m *Messenger) GetSocialLinks() (identity.SocialLinks, error) { + return m.settings.GetSocialLinks() } func (m *Messenger) setInstallationHostname() error { diff --git a/protocol/messenger_identity_social_links_test.go b/protocol/messenger_identity_social_links_test.go new file mode 100644 index 000000000..e9a25c14e --- /dev/null +++ b/protocol/messenger_identity_social_links_test.go @@ -0,0 +1,217 @@ +package protocol + +import ( + "context" + "crypto/ecdsa" + "errors" + "testing" + + gethbridge "github.com/status-im/status-go/eth-node/bridge/geth" + "github.com/status-im/status-go/eth-node/crypto" + "github.com/status-im/status-go/protocol/encryption/multidevice" + "github.com/status-im/status-go/protocol/identity" + "github.com/status-im/status-go/protocol/tt" + "github.com/status-im/status-go/waku" + + "github.com/stretchr/testify/suite" + "go.uber.org/zap" + + "github.com/status-im/status-go/eth-node/types" +) + +func TestMessengerSocialLinksHandlerSuite(t *testing.T) { + suite.Run(t, new(MessengerSocialLinksHandlerSuite)) +} + +type MessengerSocialLinksHandlerSuite struct { + suite.Suite + m *Messenger // main instance of Messenger + privateKey *ecdsa.PrivateKey // private key for the main instance of Messenger + + // If one wants to send messages between different instances of Messenger, + // a single Waku service should be shared. + shh types.Waku + + logger *zap.Logger +} + +func (s *MessengerSocialLinksHandlerSuite) SetupTest() { + s.logger = tt.MustCreateTestLogger() + + config := waku.DefaultConfig + config.MinimumAcceptedPoW = 0 + shh := waku.New(&config, s.logger) + s.shh = gethbridge.NewGethWakuWrapper(shh) + s.Require().NoError(shh.Start()) + + s.m = s.newMessenger(s.shh) + s.privateKey = s.m.identity + // We start the messenger in order to receive installations + _, err := s.m.Start() + s.Require().NoError(err) +} + +func (s *MessengerSocialLinksHandlerSuite) TearDownTest() { + s.Require().NoError(s.m.Shutdown()) +} + +func (s *MessengerSocialLinksHandlerSuite) newMessenger(shh types.Waku) *Messenger { + privateKey, err := crypto.GenerateKey() + s.Require().NoError(err) + + messenger, err := newMessengerWithKey(s.shh, privateKey, s.logger, nil) + s.Require().NoError(err) + + return messenger +} + +func profileSocialLinks() identity.SocialLinks { + return identity.SocialLinks{ + { + Text: identity.TwitterID, + URL: "https://twitter.com/ethstatus", + }, + { + Text: identity.TwitterID, + URL: "https://twitter.com/StatusIMBlog", + }, + { + Text: identity.TelegramID, + URL: "dummy.telegram", + }, + { + Text: identity.YoutubeID, + URL: "https://www.youtube.com/@Statusim", + }, + { + Text: identity.YoutubeID, + URL: "https://www.youtube.com/@EthereumProtocol", + }, + { + Text: "customLink", + URL: "customLink.com", + }, + } +} + +func (s *MessengerSocialLinksHandlerSuite) TestSocialLinks() { + // db is empty for alice + links, err := s.m.settings.GetSocialLinks() + s.Require().NoError(err) + s.Require().Len(links, 0) + + // Create new device + alicesOtherDevice, err := newMessengerWithKey(s.shh, s.m.identity, s.logger, nil) + s.Require().NoError(err) + + // db is empty for alice's other device + links, err = alicesOtherDevice.settings.GetSocialLinks() + s.Require().NoError(err) + s.Require().Len(links, 0) + + // Pair devices + im1 := &multidevice.InstallationMetadata{ + Name: "alice's-other-device", + DeviceType: "alice's-other-device-type", + } + err = alicesOtherDevice.SetInstallationMetadata(alicesOtherDevice.installationID, im1) + s.Require().NoError(err) + response, err := alicesOtherDevice.SendPairInstallation(context.Background(), nil) + s.Require().NoError(err) + s.Require().NotNil(response) + s.Require().Len(response.Chats(), 1) + s.Require().False(response.Chats()[0].Active) + + // Wait for the message to reach its destination + response, err = WaitOnMessengerResponse( + s.m, + func(r *MessengerResponse) bool { return len(r.Installations) > 0 }, + "installation not received", + ) + + s.Require().NoError(err) + actualInstallation := response.Installations[0] + s.Require().Equal(alicesOtherDevice.installationID, actualInstallation.ID) + s.Require().NotNil(actualInstallation.InstallationMetadata) + s.Require().Equal("alice's-other-device", actualInstallation.InstallationMetadata.Name) + s.Require().Equal("alice's-other-device-type", actualInstallation.InstallationMetadata.DeviceType) + + err = s.m.EnableInstallation(alicesOtherDevice.installationID) + s.Require().NoError(err) + + // Set social links on alice's device + profileSocialLinks := profileSocialLinks() + err = s.m.AddOrReplaceSocialLinks(profileSocialLinks) + s.Require().NoError(err) + + err = tt.RetryWithBackOff(func() error { + response, err := alicesOtherDevice.RetrieveAll() + if err != nil { + return err + } + + if response.SocialLinksInfo == nil || + len(response.SocialLinksInfo.Links) != len(profileSocialLinks) { + return errors.New("no sync data received") + } + return nil + }) + s.Require().NoError(err) + + // Check social links on alice's other device + links, err = alicesOtherDevice.settings.GetSocialLinks() + s.Require().NoError(err) + s.Require().Len(links, len(profileSocialLinks)) + + // Delete some social links on alice's device + removeLinkAtIndex := 2 + removedLink := profileSocialLinks[removeLinkAtIndex] + profileSocialLinks = append(profileSocialLinks[:removeLinkAtIndex], profileSocialLinks[removeLinkAtIndex+1:]...) + + err = s.m.AddOrReplaceSocialLinks(profileSocialLinks) + s.Require().NoError(err) + + err = tt.RetryWithBackOff(func() error { + response, err := alicesOtherDevice.RetrieveAll() + if err != nil { + return err + } + + if response.SocialLinksInfo == nil || + len(response.SocialLinksInfo.Links) != len(profileSocialLinks) { + return errors.New("no sync data received") + } + return nil + }) + s.Require().NoError(err) + + // Check social links on alice's other device + links, err = alicesOtherDevice.settings.GetSocialLinks() + s.Require().NoError(err) + s.Require().Len(links, len(profileSocialLinks)) + s.Require().False(links.Contains(removedLink)) + + // Delete all social links on alice's device + profileSocialLinks = identity.SocialLinks{} + err = s.m.AddOrReplaceSocialLinks(profileSocialLinks) + s.Require().NoError(err) + + err = tt.RetryWithBackOff(func() error { + response, err := alicesOtherDevice.RetrieveAll() + if err != nil { + return err + } + + if response.SocialLinksInfo == nil || + !response.SocialLinksInfo.Removed { + return errors.New("no sync data received") + } + return nil + }) + s.Require().NoError(err) + + // Check social links on alice's other device + links, err = alicesOtherDevice.settings.GetSocialLinks() + s.Require().NoError(err) + s.Require().Len(links, 0) +} diff --git a/protocol/messenger_response.go b/protocol/messenger_response.go index 26f33b2a7..ecf4b2198 100644 --- a/protocol/messenger_response.go +++ b/protocol/messenger_response.go @@ -5,8 +5,6 @@ import ( ensservice "github.com/status-im/status-go/services/ens" - "github.com/status-im/status-go/protocol/identity" - "github.com/status-im/status-go/services/browsers" "github.com/status-im/status-go/services/wallet" @@ -18,6 +16,7 @@ import ( "github.com/status-im/status-go/protocol/communities" "github.com/status-im/status-go/protocol/discord" "github.com/status-im/status-go/protocol/encryption/multidevice" + "github.com/status-im/status-go/protocol/identity" "github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/verification" localnotifications "github.com/status-im/status-go/services/local-notifications" @@ -77,7 +76,7 @@ type MessengerResponse struct { savedAddresses map[string]*wallet.SavedAddress Keycards []*accounts.Keycard keycardActions []*accounts.KeycardAction - socialLinkSettings []*identity.SocialLink + SocialLinksInfo *identity.SocialLinksInfo ensUsernameDetails []*ensservice.UsernameDetail } @@ -120,7 +119,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) { SavedAddresses []*wallet.SavedAddress `json:"savedAddresses,omitempty"` Keycards []*accounts.Keycard `json:"keycards,omitempty"` KeycardActions []*accounts.KeycardAction `json:"keycardActions,omitempty"` - SocialLinkSettings []*identity.SocialLink `json:"socialLinkSettings,omitempty"` + SocialLinksInfo *identity.SocialLinksInfo `json:"socialLinksInfo,omitempty"` EnsUsernameDetails []*ensservice.UsernameDetail `json:"ensUsernameDetails,omitempty"` }{ Contacts: r.Contacts, @@ -156,7 +155,7 @@ func (r *MessengerResponse) MarshalJSON() ([]byte, error) { DiscordOldestMessageTimestamp: r.DiscordOldestMessageTimestamp, Keycards: r.Keycards, KeycardActions: r.KeycardActions(), - SocialLinkSettings: r.SocialLinkSettings(), + SocialLinksInfo: r.SocialLinksInfo, EnsUsernameDetails: r.EnsUsernameDetails(), } @@ -285,10 +284,10 @@ func (r *MessengerResponse) IsEmpty() bool { len(r.savedAddresses)+ len(r.Keycards)+ len(r.keycardActions) == 0 && - len(r.socialLinkSettings) == 0 && len(r.ensUsernameDetails) == 0 && r.currentStatus == nil && - r.activityCenterState == nil + r.activityCenterState == nil && + r.SocialLinksInfo == nil } // Merge takes another response and appends the new Chats & new Messages and replaces @@ -319,7 +318,6 @@ func (r *MessengerResponse) Merge(response *MessengerResponse) error { r.AddInstallations(response.Installations) r.AddSavedAddresses(response.SavedAddresses()) r.AddKeycardActions(response.KeycardActions()) - r.AddSocialLinkSettings(response.SocialLinkSettings()) r.AddEnsUsernameDetails(response.EnsUsernameDetails()) r.AddBookmarks(response.GetBookmarks()) r.CommunityChanges = append(r.CommunityChanges, response.CommunityChanges...) @@ -327,6 +325,7 @@ func (r *MessengerResponse) Merge(response *MessengerResponse) error { r.Accounts = append(r.Accounts, response.Accounts...) r.Keypairs = append(r.Keypairs, response.Keypairs...) r.Keycards = append(r.Keycards, response.Keycards...) + r.SocialLinksInfo = response.SocialLinksInfo return nil } @@ -477,18 +476,6 @@ func (r *MessengerResponse) KeycardActions() []*accounts.KeycardAction { return r.keycardActions } -func (r *MessengerResponse) AddSocialLinkSetting(socialLinkSettings *identity.SocialLink) { - r.socialLinkSettings = append(r.socialLinkSettings, socialLinkSettings) -} - -func (r *MessengerResponse) AddSocialLinkSettings(socialLinkSettings []*identity.SocialLink) { - r.socialLinkSettings = append(r.socialLinkSettings, socialLinkSettings...) -} - -func (r *MessengerResponse) SocialLinkSettings() []*identity.SocialLink { - return r.socialLinkSettings -} - func (r *MessengerResponse) AddEnsUsernameDetail(detail *ensservice.UsernameDetail) { r.ensUsernameDetails = append(r.ensUsernameDetails, detail) } diff --git a/protocol/messenger_sync_raw_messages.go b/protocol/messenger_sync_raw_messages.go index 5555a2cf9..a8112cf1e 100644 --- a/protocol/messenger_sync_raw_messages.go +++ b/protocol/messenger_sync_raw_messages.go @@ -226,15 +226,15 @@ func (m *Messenger) HandleSyncRawMessages(rawMessages []*protobuf.RawMessage) er m.logger.Error("failed to handleSyncSavedAddress when HandleSyncRawMessages", zap.Error(err)) continue } - case protobuf.ApplicationMetadataMessage_SYNC_SOCIAL_LINK_SETTING: - var message protobuf.SyncSocialLinkSetting + case protobuf.ApplicationMetadataMessage_SYNC_SOCIAL_LINKS: + var message protobuf.SyncSocialLinks err := proto.Unmarshal(rawMessage.GetPayload(), &message) if err != nil { return err } - err = m.HandleSyncSocialLinkSetting(state, message) + err = m.HandleSyncSocialLinks(state, message) if err != nil { - m.logger.Error("failed to HandleSyncSocialLinkSetting when HandleSyncRawMessages", zap.Error(err)) + m.logger.Error("failed to HandleSyncSocialLinks when HandleSyncRawMessages", zap.Error(err)) continue } case protobuf.ApplicationMetadataMessage_SYNC_ENS_USERNAME_DETAIL: diff --git a/protocol/persistence.go b/protocol/persistence.go index 28e535dc6..287fb4934 100644 --- a/protocol/persistence.go +++ b/protocol/persistence.go @@ -718,7 +718,7 @@ func (db sqlitePersistence) Contacts() ([]*Contact, error) { return nil, err } - link := identity.SocialLink{} + link := &identity.SocialLink{} if text.Valid { link.Text = text.String } diff --git a/protocol/protobuf/application_metadata_message.pb.go b/protocol/protobuf/application_metadata_message.pb.go index 94a9d5285..dc2bc1661 100644 --- a/protocol/protobuf/application_metadata_message.pb.go +++ b/protocol/protobuf/application_metadata_message.pb.go @@ -86,7 +86,7 @@ const ( ApplicationMetadataMessage_CANCEL_CONTACT_VERIFICATION ApplicationMetadataMessage_Type = 61 ApplicationMetadataMessage_SYNC_KEYPAIR ApplicationMetadataMessage_Type = 62 ApplicationMetadataMessage_SYNC_KEYCARD_ACTION ApplicationMetadataMessage_Type = 63 - ApplicationMetadataMessage_SYNC_SOCIAL_LINK_SETTING ApplicationMetadataMessage_Type = 64 + ApplicationMetadataMessage_SYNC_SOCIAL_LINKS ApplicationMetadataMessage_Type = 64 ApplicationMetadataMessage_SYNC_ENS_USERNAME_DETAIL ApplicationMetadataMessage_Type = 65 ApplicationMetadataMessage_SYNC_FULL_KEYPAIR ApplicationMetadataMessage_Type = 66 ) @@ -155,7 +155,7 @@ var ApplicationMetadataMessage_Type_name = map[int32]string{ 61: "CANCEL_CONTACT_VERIFICATION", 62: "SYNC_KEYPAIR", 63: "SYNC_KEYCARD_ACTION", - 64: "SYNC_SOCIAL_LINK_SETTING", + 64: "SYNC_SOCIAL_LINKS", 65: "SYNC_ENS_USERNAME_DETAIL", 66: "SYNC_FULL_KEYPAIR", } @@ -224,7 +224,7 @@ var ApplicationMetadataMessage_Type_value = map[string]int32{ "CANCEL_CONTACT_VERIFICATION": 61, "SYNC_KEYPAIR": 62, "SYNC_KEYCARD_ACTION": 63, - "SYNC_SOCIAL_LINK_SETTING": 64, + "SYNC_SOCIAL_LINKS": 64, "SYNC_ENS_USERNAME_DETAIL": 65, "SYNC_FULL_KEYPAIR": 66, } @@ -306,64 +306,64 @@ func init() { var fileDescriptor_ad09a6406fcf24c7 = []byte{ // 959 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x6b, 0x73, 0x13, 0x37, - 0x17, 0x7e, 0x03, 0x79, 0x13, 0x50, 0x6e, 0x8a, 0xc8, 0xc5, 0xb9, 0x1b, 0x43, 0x43, 0x80, 0xd6, - 0xb4, 0xd0, 0x76, 0xda, 0x52, 0xda, 0xca, 0xd2, 0x89, 0x2d, 0xbc, 0x2b, 0x2d, 0x92, 0xd6, 0x1d, - 0xf7, 0x8b, 0xc6, 0x14, 0x97, 0xc9, 0x0c, 0x10, 0x0f, 0x31, 0x1f, 0xf2, 0x2b, 0xfb, 0x2b, 0xfa, - 0x3f, 0x3a, 0xda, 0x8b, 0xd6, 0x49, 0x9c, 0xf2, 0x29, 0xf1, 0x79, 0x1e, 0x1d, 0xe9, 0x3c, 0xe7, - 0x39, 0x67, 0x51, 0x63, 0x30, 0x1a, 0xbd, 0x3b, 0xf9, 0x73, 0x30, 0x3e, 0x39, 0xfd, 0xe0, 0xde, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x55, 0x6b, 0x73, 0x53, 0x37, + 0x13, 0x7e, 0x03, 0x79, 0x13, 0x50, 0x6e, 0x8a, 0xc8, 0xc5, 0xb9, 0x1b, 0x43, 0x43, 0x80, 0xd6, + 0xb4, 0xd0, 0x76, 0xda, 0x52, 0xda, 0xca, 0xd2, 0xc6, 0x16, 0x3e, 0x47, 0x3a, 0x48, 0x3a, 0xee, + 0xb8, 0x5f, 0x34, 0xa6, 0xb8, 0x4c, 0x66, 0x80, 0x78, 0x88, 0xf9, 0x90, 0x7f, 0xd8, 0x5f, 0xd1, + 0xdf, 0xd2, 0xd1, 0xb9, 0xe8, 0x38, 0x89, 0x53, 0x3e, 0x25, 0xde, 0x7d, 0x76, 0x57, 0xfb, 0xec, + 0xb3, 0x7b, 0x50, 0x63, 0x30, 0x1a, 0xbd, 0x3b, 0xf9, 0x73, 0x30, 0x3e, 0x39, 0xfd, 0xe0, 0xde, 0x0f, 0xc7, 0x83, 0x37, 0x83, 0xf1, 0xc0, 0xbd, 0x1f, 0x9e, 0x9d, 0x0d, 0xde, 0x0e, 0x9b, 0xa3, 0x8f, 0xa7, 0xe3, 0x53, 0x72, 0x2b, 0xfb, 0xf3, 0xfa, 0xd3, 0x5f, 0x8d, 0x7f, 0x56, 0xd0, 0x36, - 0xad, 0x0e, 0xc4, 0x05, 0x3f, 0xce, 0xe9, 0x64, 0x17, 0xdd, 0x3e, 0x3b, 0x79, 0xfb, 0x61, 0x30, - 0xfe, 0xf4, 0x71, 0x58, 0x9b, 0xa9, 0xcf, 0x1c, 0x2d, 0xea, 0x2a, 0x40, 0x6a, 0x68, 0x7e, 0x34, - 0x38, 0x7f, 0x77, 0x3a, 0x78, 0x53, 0xbb, 0x91, 0x61, 0xe5, 0x4f, 0xf2, 0x02, 0xcd, 0x8e, 0xcf, - 0x47, 0xc3, 0xda, 0xcd, 0xfa, 0xcc, 0xd1, 0xf2, 0xd3, 0x87, 0xcd, 0xf2, 0xbe, 0xe6, 0xf5, 0x77, - 0x35, 0xed, 0xf9, 0x68, 0xa8, 0xb3, 0x63, 0x8d, 0xbf, 0x97, 0xd1, 0xac, 0xff, 0x49, 0x16, 0xd0, - 0x7c, 0x2a, 0xbb, 0x52, 0xfd, 0x2e, 0xf1, 0xff, 0x08, 0x46, 0x8b, 0xac, 0x43, 0xad, 0x8b, 0xc1, - 0x18, 0xda, 0x06, 0x3c, 0x43, 0x08, 0x5a, 0x66, 0x4a, 0x5a, 0xca, 0xac, 0x4b, 0x13, 0x4e, 0x2d, - 0xe0, 0x1b, 0x64, 0x0f, 0x6d, 0xc5, 0x10, 0xb7, 0x40, 0x9b, 0x8e, 0x48, 0x8a, 0x70, 0x38, 0x72, - 0x93, 0xac, 0xa3, 0xd5, 0x84, 0x0a, 0xed, 0x84, 0x34, 0x96, 0x46, 0x11, 0xb5, 0x42, 0x49, 0x3c, - 0xeb, 0xc3, 0xa6, 0x2f, 0xd9, 0xc5, 0xf0, 0xff, 0xc9, 0x3d, 0x74, 0xa0, 0xe1, 0x55, 0x0a, 0xc6, - 0x3a, 0xca, 0xb9, 0x06, 0x63, 0xdc, 0xb1, 0xd2, 0xce, 0x6a, 0x2a, 0x0d, 0x65, 0x19, 0x69, 0x8e, - 0x3c, 0x42, 0x87, 0x94, 0x31, 0x48, 0xac, 0xfb, 0x1c, 0x77, 0x9e, 0x3c, 0x46, 0x0f, 0x38, 0xb0, - 0x48, 0x48, 0xf8, 0x2c, 0xf9, 0x16, 0xd9, 0x44, 0x77, 0x4a, 0xd2, 0x24, 0x70, 0x9b, 0xac, 0x21, - 0x6c, 0x40, 0xf2, 0x0b, 0x51, 0x44, 0x0e, 0xd0, 0xce, 0xe5, 0xdc, 0x93, 0x84, 0x05, 0x2f, 0xcd, - 0x95, 0x22, 0x5d, 0x21, 0x20, 0x5e, 0x9c, 0x0e, 0x53, 0xc6, 0x54, 0x2a, 0x2d, 0x5e, 0x22, 0x77, - 0xd1, 0xde, 0x55, 0x38, 0x49, 0x5b, 0x91, 0x60, 0xce, 0xf7, 0x05, 0x2f, 0x93, 0x7d, 0xb4, 0x5d, - 0xf6, 0x83, 0x29, 0x0e, 0x8e, 0xf2, 0x1e, 0x68, 0x2b, 0x0c, 0xc4, 0x20, 0x2d, 0x5e, 0x21, 0x0d, - 0xb4, 0x9f, 0xa4, 0xa6, 0xe3, 0xa4, 0xb2, 0xe2, 0x58, 0xb0, 0x3c, 0x85, 0x86, 0xb6, 0x30, 0x56, - 0xe7, 0x92, 0x63, 0xaf, 0xd0, 0x7f, 0x73, 0x9c, 0x06, 0x93, 0x28, 0x69, 0x00, 0xaf, 0x92, 0x1d, - 0xb4, 0x79, 0x95, 0xfc, 0x2a, 0x05, 0xdd, 0xc7, 0x84, 0xdc, 0x47, 0xf5, 0x6b, 0xc0, 0x2a, 0xc5, - 0x1d, 0x5f, 0xf5, 0xb4, 0xfb, 0x32, 0xfd, 0xf0, 0x9a, 0x2f, 0x69, 0x1a, 0x5c, 0x1c, 0x5f, 0xf7, - 0x16, 0x84, 0x58, 0xbd, 0x14, 0x4e, 0x43, 0xa1, 0xf3, 0x06, 0xd9, 0x42, 0xeb, 0x6d, 0xad, 0xd2, - 0x24, 0x93, 0xc5, 0x09, 0xd9, 0x13, 0x36, 0xaf, 0x6e, 0x93, 0xac, 0xa2, 0xa5, 0x3c, 0xc8, 0x41, - 0x5a, 0x61, 0xfb, 0xb8, 0xe6, 0xd9, 0x4c, 0xc5, 0x71, 0x2a, 0x85, 0xed, 0x3b, 0x0e, 0x86, 0x69, - 0x91, 0x64, 0xec, 0x2d, 0x52, 0x43, 0x6b, 0x15, 0x34, 0x91, 0x67, 0xdb, 0xbf, 0xba, 0x42, 0x42, - 0xb7, 0x95, 0x7b, 0xa9, 0x84, 0xc4, 0x3b, 0x64, 0x05, 0x2d, 0x24, 0x42, 0x06, 0xdb, 0xef, 0xfa, - 0xd9, 0x01, 0x2e, 0xaa, 0xd9, 0xd9, 0xf3, 0x2f, 0x31, 0x96, 0xda, 0xd4, 0x94, 0xa3, 0xb3, 0xef, - 0x6b, 0xe1, 0x10, 0xc1, 0xc4, 0xbc, 0x1c, 0x78, 0x53, 0x4d, 0xf3, 0x4c, 0x71, 0x35, 0xae, 0x93, + 0xad, 0x02, 0xe2, 0x02, 0x1f, 0xe7, 0x70, 0xb2, 0x8b, 0x6e, 0x9f, 0x9d, 0xbc, 0xfd, 0x30, 0x18, + 0x7f, 0xfa, 0x38, 0xac, 0xcd, 0xd4, 0x67, 0x8e, 0x16, 0x75, 0x65, 0x20, 0x35, 0x34, 0x3f, 0x1a, + 0x9c, 0xbf, 0x3b, 0x1d, 0xbc, 0xa9, 0xdd, 0xc8, 0x7c, 0xe5, 0x4f, 0xf2, 0x02, 0xcd, 0x8e, 0xcf, + 0x47, 0xc3, 0xda, 0xcd, 0xfa, 0xcc, 0xd1, 0xf2, 0xd3, 0x87, 0xcd, 0xb2, 0x5e, 0xf3, 0xfa, 0x5a, + 0x4d, 0x7b, 0x3e, 0x1a, 0xea, 0x2c, 0xac, 0xf1, 0xf7, 0x32, 0x9a, 0xf5, 0x3f, 0xc9, 0x02, 0x9a, + 0x4f, 0x65, 0x57, 0xaa, 0xdf, 0x25, 0xfe, 0x1f, 0xc1, 0x68, 0x91, 0x75, 0xa8, 0x75, 0x31, 0x18, + 0x43, 0xdb, 0x80, 0x67, 0x08, 0x41, 0xcb, 0x4c, 0x49, 0x4b, 0x99, 0x75, 0x69, 0xc2, 0xa9, 0x05, + 0x7c, 0x83, 0xec, 0xa1, 0xad, 0x18, 0xe2, 0x16, 0x68, 0xd3, 0x11, 0x49, 0x61, 0x0e, 0x21, 0x37, + 0xc9, 0x3a, 0x5a, 0x4d, 0xa8, 0xd0, 0x4e, 0x48, 0x63, 0x69, 0x14, 0x51, 0x2b, 0x94, 0xc4, 0xb3, + 0xde, 0x6c, 0xfa, 0x92, 0x5d, 0x34, 0xff, 0x9f, 0xdc, 0x43, 0x07, 0x1a, 0x5e, 0xa5, 0x60, 0xac, + 0xa3, 0x9c, 0x6b, 0x30, 0xc6, 0x1d, 0x2b, 0xed, 0xac, 0xa6, 0xd2, 0x50, 0x96, 0x81, 0xe6, 0xc8, + 0x23, 0x74, 0x48, 0x19, 0x83, 0xc4, 0xba, 0xcf, 0x61, 0xe7, 0xc9, 0x63, 0xf4, 0x80, 0x03, 0x8b, + 0x84, 0x84, 0xcf, 0x82, 0x6f, 0x91, 0x4d, 0x74, 0xa7, 0x04, 0x4d, 0x3a, 0x6e, 0x93, 0x35, 0x84, + 0x0d, 0x48, 0x7e, 0xc1, 0x8a, 0xc8, 0x01, 0xda, 0xb9, 0x9c, 0x7b, 0x12, 0xb0, 0xe0, 0xa9, 0xb9, + 0xd2, 0xa4, 0x2b, 0x08, 0xc4, 0x8b, 0xd3, 0xdd, 0x94, 0x31, 0x95, 0x4a, 0x8b, 0x97, 0xc8, 0x5d, + 0xb4, 0x77, 0xd5, 0x9d, 0xa4, 0xad, 0x48, 0x30, 0xe7, 0xe7, 0x82, 0x97, 0xc9, 0x3e, 0xda, 0x2e, + 0xe7, 0xc1, 0x14, 0x07, 0x47, 0x79, 0x0f, 0xb4, 0x15, 0x06, 0x62, 0x90, 0x16, 0xaf, 0x90, 0x06, + 0xda, 0x4f, 0x52, 0xd3, 0x71, 0x52, 0x59, 0x71, 0x2c, 0x58, 0x9e, 0x42, 0x43, 0x5b, 0x18, 0xab, + 0x73, 0xca, 0xb1, 0x67, 0xe8, 0xbf, 0x31, 0x4e, 0x83, 0x49, 0x94, 0x34, 0x80, 0x57, 0xc9, 0x0e, + 0xda, 0xbc, 0x0a, 0x7e, 0x95, 0x82, 0xee, 0x63, 0x42, 0xee, 0xa3, 0xfa, 0x35, 0xce, 0x2a, 0xc5, + 0x1d, 0xdf, 0xf5, 0xb4, 0x7a, 0x19, 0x7f, 0x78, 0xcd, 0xb7, 0x34, 0xcd, 0x5d, 0x84, 0xaf, 0x7b, + 0x09, 0x42, 0xac, 0x5e, 0x0a, 0xa7, 0xa1, 0xe0, 0x79, 0x83, 0x6c, 0xa1, 0xf5, 0xb6, 0x56, 0x69, + 0x92, 0xd1, 0xe2, 0x84, 0xec, 0x09, 0x9b, 0x77, 0xb7, 0x49, 0x56, 0xd1, 0x52, 0x6e, 0xe4, 0x20, + 0xad, 0xb0, 0x7d, 0x5c, 0xf3, 0x68, 0xa6, 0xe2, 0x38, 0x95, 0xc2, 0xf6, 0x1d, 0x07, 0xc3, 0xb4, + 0x48, 0x32, 0xf4, 0x16, 0xa9, 0xa1, 0xb5, 0xca, 0x35, 0x91, 0x67, 0xdb, 0xbf, 0xba, 0xf2, 0x84, + 0x69, 0x2b, 0xf7, 0x52, 0x09, 0x89, 0x77, 0xc8, 0x0a, 0x5a, 0x48, 0x84, 0x0c, 0xb2, 0xdf, 0xf5, + 0xbb, 0x03, 0x5c, 0x54, 0xbb, 0xb3, 0xe7, 0x5f, 0x62, 0x2c, 0xb5, 0xa9, 0x29, 0x57, 0x67, 0xdf, + 0xf7, 0xc2, 0x21, 0x82, 0x89, 0x7d, 0x39, 0xf0, 0xa2, 0x9a, 0xa6, 0x99, 0xa2, 0x34, 0xae, 0x93, 0x6d, 0xb4, 0x41, 0xa5, 0x92, 0xfd, 0x58, 0xa5, 0xc6, 0xc5, 0x60, 0xb5, 0x60, 0xae, 0x45, 0x2d, - 0xeb, 0xe0, 0xbb, 0x61, 0xaa, 0xb2, 0x92, 0x35, 0xc4, 0xaa, 0x07, 0x1c, 0x37, 0x7c, 0xd7, 0xaa, - 0x70, 0x71, 0x95, 0xf1, 0x02, 0x72, 0x7c, 0x8f, 0x20, 0x34, 0xd7, 0xa2, 0xac, 0x9b, 0x26, 0xf8, - 0x7e, 0x70, 0xa4, 0x57, 0xb6, 0xe7, 0x2b, 0x65, 0x20, 0x2d, 0xe8, 0x9c, 0xfa, 0x45, 0x70, 0xe4, - 0x65, 0x38, 0x9f, 0x46, 0xe0, 0xf8, 0xd0, 0x3b, 0x6e, 0x2a, 0x85, 0x0b, 0x13, 0x0b, 0x63, 0x80, - 0xe3, 0x07, 0x99, 0x12, 0x9e, 0xd3, 0x52, 0xaa, 0x1b, 0x53, 0xdd, 0xc5, 0x47, 0x64, 0x03, 0x91, - 0xfc, 0x85, 0x11, 0x50, 0xed, 0x3a, 0xc2, 0x58, 0xa5, 0xfb, 0xf8, 0xa1, 0x97, 0x31, 0x8b, 0x1b, - 0xb0, 0x56, 0xc8, 0x36, 0x7e, 0x44, 0xea, 0x68, 0xb7, 0x6a, 0x04, 0xd5, 0xac, 0x23, 0x7a, 0xe0, - 0x62, 0xda, 0x96, 0x60, 0x23, 0x21, 0xbb, 0xf8, 0xb1, 0x6f, 0x62, 0x76, 0x26, 0xd1, 0xea, 0x58, - 0x44, 0xe0, 0x12, 0xc1, 0x6c, 0xaa, 0x01, 0x7f, 0x19, 0xb2, 0x95, 0x33, 0xf6, 0x55, 0x26, 0x66, - 0xbe, 0x4a, 0xca, 0x39, 0x2a, 0x9d, 0xd8, 0xf4, 0xaa, 0x69, 0xb0, 0x3a, 0x1f, 0xae, 0x8b, 0xe0, - 0x13, 0x72, 0x88, 0x1a, 0xd7, 0xfa, 0xa1, 0xb2, 0xeb, 0xd7, 0x95, 0xf4, 0x81, 0x5c, 0x94, 0x62, - 0xf0, 0x37, 0xbe, 0x96, 0xf2, 0x68, 0x79, 0x43, 0x0f, 0x74, 0xb0, 0x3d, 0x7e, 0xea, 0xdd, 0x70, - 0xe9, 0x7d, 0x17, 0x08, 0xcf, 0x7c, 0x8a, 0x72, 0x07, 0x4d, 0x65, 0x7c, 0x1b, 0x3c, 0x61, 0x75, - 0x6a, 0x2c, 0x70, 0x97, 0x1a, 0xd0, 0xf8, 0xbb, 0xd0, 0xea, 0x49, 0x76, 0xa8, 0xef, 0xfb, 0xd0, - 0xea, 0x4b, 0x95, 0x3b, 0x0e, 0x4c, 0x18, 0x9f, 0xf8, 0x87, 0x7c, 0xf9, 0x4c, 0x91, 0x20, 0x02, - 0xda, 0x03, 0xfc, 0xa3, 0xc7, 0xb3, 0x14, 0x85, 0xc5, 0xfd, 0xba, 0x8d, 0x2b, 0xa7, 0xff, 0x14, - 0x7a, 0x6e, 0x68, 0x0f, 0x78, 0xb9, 0x95, 0xf1, 0x73, 0xbf, 0x46, 0xaa, 0xbc, 0x8c, 0x4a, 0x06, - 0xd1, 0x95, 0x89, 0xfb, 0xd9, 0x2b, 0x53, 0x60, 0x53, 0xeb, 0x7e, 0x11, 0x9a, 0xdd, 0x85, 0xbe, - 0xff, 0x00, 0xe1, 0x5f, 0xfc, 0x7a, 0x2f, 0x23, 0x8c, 0x6a, 0xee, 0x8a, 0xfd, 0xf1, 0x2b, 0xd9, - 0x45, 0xb5, 0xfc, 0x25, 0x8a, 0x09, 0x1a, 0x39, 0xef, 0xa3, 0xe0, 0xb8, 0xdf, 0x02, 0x0a, 0xd2, - 0x64, 0xe2, 0x49, 0x1a, 0x83, 0xe3, 0x60, 0xa9, 0x88, 0x30, 0x0d, 0xf2, 0x1e, 0xa7, 0x51, 0x14, - 0xee, 0x6a, 0xb5, 0x96, 0xfe, 0x58, 0x68, 0x3e, 0x79, 0x5e, 0x7e, 0x86, 0x5f, 0xcf, 0x65, 0xff, - 0x3d, 0xfb, 0x37, 0x00, 0x00, 0xff, 0xff, 0xef, 0xbf, 0x60, 0xd4, 0x2d, 0x08, 0x00, 0x00, + 0xeb, 0xe0, 0xbb, 0x61, 0xab, 0xb2, 0x96, 0x35, 0xc4, 0xaa, 0x07, 0x1c, 0x37, 0xfc, 0xd4, 0x2a, + 0x73, 0x51, 0xca, 0x78, 0x02, 0x39, 0xbe, 0x47, 0x10, 0x9a, 0x6b, 0x51, 0xd6, 0x4d, 0x13, 0x7c, + 0x3f, 0x28, 0xd2, 0x33, 0xdb, 0xf3, 0x9d, 0x32, 0x90, 0x16, 0x74, 0x0e, 0xfd, 0x22, 0x28, 0xf2, + 0xb2, 0x3b, 0xdf, 0x46, 0xe0, 0xf8, 0xd0, 0x2b, 0x6e, 0x2a, 0x84, 0x0b, 0x13, 0x0b, 0x63, 0x80, + 0xe3, 0x07, 0x19, 0x13, 0x1e, 0xd3, 0x52, 0xaa, 0x1b, 0x53, 0xdd, 0xc5, 0x47, 0x64, 0x03, 0x91, + 0xfc, 0x85, 0x11, 0x50, 0xed, 0x3a, 0xc2, 0x58, 0xa5, 0xfb, 0xf8, 0xa1, 0xa7, 0x31, 0xb3, 0x1b, + 0xb0, 0x56, 0xc8, 0x36, 0x7e, 0x44, 0xea, 0x68, 0xb7, 0x1a, 0x04, 0xd5, 0xac, 0x23, 0x7a, 0xe0, + 0x62, 0xda, 0x96, 0x60, 0x23, 0x21, 0xbb, 0xf8, 0xb1, 0x1f, 0x62, 0x16, 0x93, 0x68, 0x75, 0x2c, + 0x22, 0x70, 0x89, 0x60, 0x36, 0xd5, 0x80, 0xbf, 0x0c, 0xd9, 0xca, 0x1d, 0xfb, 0x2a, 0x23, 0x33, + 0x3f, 0x25, 0xe5, 0x1e, 0x95, 0x4a, 0x6c, 0x7a, 0xd6, 0x34, 0x58, 0x9d, 0x2f, 0xd7, 0x45, 0xe7, + 0x13, 0x72, 0x88, 0x1a, 0xd7, 0xea, 0xa1, 0x92, 0xeb, 0xd7, 0x15, 0xf5, 0x01, 0x5c, 0xb4, 0x62, + 0xf0, 0x37, 0xbe, 0x97, 0x32, 0xb4, 0xac, 0xd0, 0x03, 0x1d, 0x64, 0x8f, 0x9f, 0x7a, 0x35, 0x5c, + 0x7a, 0xdf, 0x05, 0xc0, 0x33, 0x9f, 0xa2, 0xbc, 0x41, 0x53, 0x11, 0xdf, 0x06, 0x4d, 0x58, 0x9d, + 0x1a, 0x0b, 0xdc, 0xa5, 0x06, 0x34, 0xfe, 0x2e, 0x8c, 0x7a, 0x12, 0x1d, 0xfa, 0xfb, 0x3e, 0x8c, + 0xfa, 0x52, 0xe7, 0x8e, 0x03, 0x13, 0xc6, 0x27, 0xfe, 0x21, 0x3f, 0x3e, 0x53, 0x28, 0x88, 0x80, + 0xf6, 0x00, 0xff, 0xe8, 0xfd, 0x59, 0x8a, 0x42, 0xe2, 0xfe, 0xdc, 0xc6, 0x95, 0xd2, 0x7f, 0x0a, + 0x33, 0x37, 0xb4, 0x07, 0xbc, 0xbc, 0xca, 0xf8, 0xb9, 0x3f, 0x23, 0x55, 0x5e, 0x46, 0x25, 0x83, + 0xe8, 0xca, 0xc6, 0xfd, 0xec, 0x99, 0x29, 0x7c, 0x53, 0xfb, 0x7e, 0x11, 0x86, 0xdd, 0x85, 0xbe, + 0xff, 0x00, 0xe1, 0x5f, 0xfc, 0x79, 0x2f, 0x2d, 0x8c, 0x6a, 0xee, 0x8a, 0xfb, 0xf1, 0x6b, 0xa0, + 0xc8, 0x28, 0x26, 0x68, 0xe4, 0xbc, 0x8e, 0x0c, 0xfe, 0x8d, 0xec, 0xa2, 0x5a, 0x66, 0x06, 0x69, + 0x32, 0xd6, 0x24, 0x8d, 0xc1, 0x71, 0xb0, 0x54, 0x44, 0x98, 0x86, 0xa0, 0xe3, 0x34, 0x8a, 0x42, + 0x91, 0x56, 0x6b, 0xe9, 0x8f, 0x85, 0xe6, 0x93, 0xe7, 0xe5, 0xf7, 0xf7, 0xf5, 0x5c, 0xf6, 0xdf, + 0xb3, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x5f, 0xbf, 0xf4, 0x92, 0x26, 0x08, 0x00, 0x00, } diff --git a/protocol/protobuf/application_metadata_message.proto b/protocol/protobuf/application_metadata_message.proto index 371bee709..2435876be 100644 --- a/protocol/protobuf/application_metadata_message.proto +++ b/protocol/protobuf/application_metadata_message.proto @@ -76,7 +76,7 @@ message ApplicationMetadataMessage { CANCEL_CONTACT_VERIFICATION = 61; SYNC_KEYPAIR = 62; SYNC_KEYCARD_ACTION = 63; - SYNC_SOCIAL_LINK_SETTING = 64; + SYNC_SOCIAL_LINKS = 64; SYNC_ENS_USERNAME_DETAIL = 65; SYNC_FULL_KEYPAIR = 66; } diff --git a/protocol/protobuf/pairing.pb.go b/protocol/protobuf/pairing.pb.go index 86e05f26d..623f6aa4e 100644 --- a/protocol/protobuf/pairing.pb.go +++ b/protocol/protobuf/pairing.pb.go @@ -2678,7 +2678,7 @@ type BackedUpProfile struct { DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` DisplayNameClock uint64 `protobuf:"varint,3,opt,name=display_name_clock,json=displayNameClock,proto3" json:"display_name_clock,omitempty"` Pictures []*SyncProfilePicture `protobuf:"bytes,4,rep,name=pictures,proto3" json:"pictures,omitempty"` - SocialLinkSettings []*SyncSocialLinkSetting `protobuf:"bytes,5,rep,name=social_link_settings,json=socialLinkSettings,proto3" json:"social_link_settings,omitempty"` + SocialLinks *SyncSocialLinks `protobuf:"bytes,5,opt,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` EnsUsernameDetails []*SyncEnsUsernameDetail `protobuf:"bytes,6,rep,name=ens_username_details,json=ensUsernameDetails,proto3" json:"ens_username_details,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2738,9 +2738,9 @@ func (m *BackedUpProfile) GetPictures() []*SyncProfilePicture { return nil } -func (m *BackedUpProfile) GetSocialLinkSettings() []*SyncSocialLinkSetting { +func (m *BackedUpProfile) GetSocialLinks() *SyncSocialLinks { if m != nil { - return m.SocialLinkSettings + return m.SocialLinks } return nil } @@ -2989,55 +2989,47 @@ func (m *SyncKeycardAction) GetKeycard() *SyncKeycard { return nil } -type SyncSocialLinkSetting struct { - Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` - Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` - Clock uint64 `protobuf:"varint,3,opt,name=clock,proto3" json:"clock,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type SyncSocialLinks struct { + SocialLinks []*SocialLink `protobuf:"bytes,1,rep,name=social_links,json=socialLinks,proto3" json:"social_links,omitempty"` + Clock uint64 `protobuf:"varint,2,opt,name=clock,proto3" json:"clock,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *SyncSocialLinkSetting) Reset() { *m = SyncSocialLinkSetting{} } -func (m *SyncSocialLinkSetting) String() string { return proto.CompactTextString(m) } -func (*SyncSocialLinkSetting) ProtoMessage() {} -func (*SyncSocialLinkSetting) Descriptor() ([]byte, []int) { +func (m *SyncSocialLinks) Reset() { *m = SyncSocialLinks{} } +func (m *SyncSocialLinks) String() string { return proto.CompactTextString(m) } +func (*SyncSocialLinks) ProtoMessage() {} +func (*SyncSocialLinks) Descriptor() ([]byte, []int) { return fileDescriptor_d61ab7221f0b5518, []int{36} } -func (m *SyncSocialLinkSetting) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SyncSocialLinkSetting.Unmarshal(m, b) +func (m *SyncSocialLinks) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SyncSocialLinks.Unmarshal(m, b) } -func (m *SyncSocialLinkSetting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SyncSocialLinkSetting.Marshal(b, m, deterministic) +func (m *SyncSocialLinks) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SyncSocialLinks.Marshal(b, m, deterministic) } -func (m *SyncSocialLinkSetting) XXX_Merge(src proto.Message) { - xxx_messageInfo_SyncSocialLinkSetting.Merge(m, src) +func (m *SyncSocialLinks) XXX_Merge(src proto.Message) { + xxx_messageInfo_SyncSocialLinks.Merge(m, src) } -func (m *SyncSocialLinkSetting) XXX_Size() int { - return xxx_messageInfo_SyncSocialLinkSetting.Size(m) +func (m *SyncSocialLinks) XXX_Size() int { + return xxx_messageInfo_SyncSocialLinks.Size(m) } -func (m *SyncSocialLinkSetting) XXX_DiscardUnknown() { - xxx_messageInfo_SyncSocialLinkSetting.DiscardUnknown(m) +func (m *SyncSocialLinks) XXX_DiscardUnknown() { + xxx_messageInfo_SyncSocialLinks.DiscardUnknown(m) } -var xxx_messageInfo_SyncSocialLinkSetting proto.InternalMessageInfo +var xxx_messageInfo_SyncSocialLinks proto.InternalMessageInfo -func (m *SyncSocialLinkSetting) GetText() string { +func (m *SyncSocialLinks) GetSocialLinks() []*SocialLink { if m != nil { - return m.Text + return m.SocialLinks } - return "" + return nil } -func (m *SyncSocialLinkSetting) GetUrl() string { - if m != nil { - return m.Url - } - return "" -} - -func (m *SyncSocialLinkSetting) GetClock() uint64 { +func (m *SyncSocialLinks) GetClock() uint64 { if m != nil { return m.Clock } @@ -3089,7 +3081,7 @@ func init() { proto.RegisterType((*SyncRawMessage)(nil), "protobuf.SyncRawMessage") proto.RegisterType((*SyncKeycard)(nil), "protobuf.SyncKeycard") proto.RegisterType((*SyncKeycardAction)(nil), "protobuf.SyncKeycardAction") - proto.RegisterType((*SyncSocialLinkSetting)(nil), "protobuf.SyncSocialLinkSetting") + proto.RegisterType((*SyncSocialLinks)(nil), "protobuf.SyncSocialLinks") } func init() { @@ -3097,196 +3089,197 @@ func init() { } var fileDescriptor_d61ab7221f0b5518 = []byte{ - // 3049 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0xcb, 0x8e, 0x1b, 0xc7, - 0xd1, 0x7c, 0x2c, 0x1f, 0x45, 0xee, 0x2e, 0xd5, 0x5a, 0x4b, 0xd4, 0x4a, 0x86, 0xa4, 0xb1, 0x0d, - 0x2b, 0x81, 0xb3, 0x4a, 0xe4, 0x3c, 0x1c, 0xc9, 0x86, 0x43, 0x91, 0xb4, 0xb5, 0x5a, 0x89, 0xbb, - 0xe9, 0x5d, 0xca, 0x71, 0x10, 0x60, 0xd0, 0x9a, 0x69, 0x2d, 0xdb, 0x3b, 0x9c, 0x61, 0xa6, 0x9b, - 0x2b, 0xd3, 0x87, 0x00, 0xc9, 0x17, 0x04, 0xb9, 0xc4, 0x47, 0x9f, 0x83, 0x9c, 0x02, 0xe4, 0x90, - 0x5b, 0x8e, 0xb9, 0xe7, 0xe8, 0x7c, 0x41, 0x90, 0x0f, 0xc8, 0x31, 0xe8, 0xea, 0x9e, 0xe1, 0x0c, - 0x1f, 0x8a, 0x84, 0x9c, 0x72, 0x62, 0x57, 0x75, 0x55, 0x4d, 0x75, 0x3d, 0xba, 0xaa, 0x9a, 0xb0, - 0x39, 0x61, 0x22, 0x16, 0xe1, 0xe9, 0xde, 0x24, 0x8e, 0x54, 0x44, 0x6a, 0xf8, 0xf3, 0x74, 0xfa, - 0x6c, 0xf7, 0xa2, 0x9c, 0x85, 0x9e, 0x2b, 0xb9, 0x52, 0x22, 0x3c, 0x95, 0x66, 0x7b, 0xd7, 0x61, - 0x93, 0x49, 0x20, 0x3c, 0xa6, 0x44, 0x14, 0xba, 0x63, 0xae, 0x98, 0xcf, 0x14, 0x73, 0xc7, 0x5c, - 0x4a, 0x76, 0xca, 0x0d, 0x8d, 0xc3, 0xe0, 0xea, 0xc7, 0x5c, 0x79, 0x23, 0x11, 0x9e, 0xde, 0x67, - 0xde, 0x19, 0xf7, 0x87, 0x93, 0x1e, 0x53, 0xac, 0xc7, 0x15, 0x13, 0x81, 0x24, 0xd7, 0xa1, 0x81, - 0x4c, 0xe1, 0x74, 0xfc, 0x94, 0xc7, 0xed, 0xc2, 0x8d, 0xc2, 0xad, 0x4d, 0x0a, 0x1a, 0x35, 0x40, - 0x0c, 0xb9, 0x09, 0x4d, 0x15, 0x29, 0x16, 0x24, 0x14, 0x45, 0xa4, 0x68, 0x20, 0xce, 0x90, 0x38, - 0xbf, 0xad, 0x42, 0x45, 0xcb, 0x9e, 0x4e, 0xc8, 0x0e, 0x6c, 0x78, 0x41, 0xe4, 0x9d, 0xa1, 0xa0, - 0x32, 0x35, 0x00, 0xd9, 0x82, 0xa2, 0xf0, 0x91, 0xb3, 0x4e, 0x8b, 0xc2, 0x27, 0x1f, 0x41, 0xcd, - 0x8b, 0x42, 0xc5, 0x3c, 0x25, 0xdb, 0xa5, 0x1b, 0xa5, 0x5b, 0x8d, 0x3b, 0x6f, 0xee, 0x25, 0x27, - 0xdd, 0x3b, 0x9e, 0x85, 0xde, 0x7e, 0x28, 0x15, 0x0b, 0x02, 0x3c, 0x58, 0xd7, 0x50, 0x3e, 0xb9, - 0x43, 0x53, 0x26, 0xf2, 0x63, 0x68, 0x78, 0xd1, 0x78, 0x3c, 0x0d, 0x85, 0x12, 0x5c, 0xb6, 0xcb, - 0x28, 0xe3, 0x72, 0x5e, 0x46, 0xd7, 0x12, 0xcc, 0x68, 0x96, 0x96, 0x1c, 0xc2, 0x76, 0x22, 0xc6, - 0xda, 0xa0, 0xbd, 0x71, 0xa3, 0x70, 0xab, 0x71, 0xe7, 0xed, 0x39, 0xfb, 0x0b, 0x0c, 0x46, 0x17, - 0xb9, 0xc9, 0x10, 0x48, 0x46, 0x7e, 0x22, 0xb3, 0xf2, 0x2a, 0x32, 0x57, 0x08, 0x20, 0xef, 0x41, - 0x75, 0x12, 0x47, 0xcf, 0x44, 0xc0, 0xdb, 0x55, 0x94, 0x75, 0x65, 0x2e, 0x2b, 0x91, 0x71, 0x64, - 0x08, 0x68, 0x42, 0x49, 0x1e, 0xc3, 0x96, 0x5d, 0x26, 0x7a, 0xd4, 0x5e, 0x45, 0x8f, 0x05, 0x66, - 0x72, 0x1b, 0xaa, 0x36, 0xe2, 0xda, 0x75, 0x94, 0xf3, 0x7a, 0xde, 0xc4, 0xc7, 0x66, 0x93, 0x26, - 0x54, 0xda, 0xb8, 0x49, 0x88, 0x26, 0x0a, 0xc0, 0x2b, 0x19, 0x77, 0x81, 0x9b, 0xdc, 0x83, 0xc6, - 0xb3, 0x69, 0x10, 0x1c, 0xf0, 0x99, 0x4e, 0x8c, 0x76, 0x63, 0xd1, 0x12, 0x5a, 0x0b, 0xbb, 0xf9, - 0xf1, 0x34, 0x08, 0x68, 0x96, 0x5a, 0x7b, 0x26, 0x03, 0x26, 0x0a, 0x35, 0x5f, 0xc9, 0x33, 0xcb, - 0x02, 0x48, 0x07, 0x5a, 0xcf, 0x99, 0xf2, 0x46, 0x87, 0x61, 0x30, 0xeb, 0x78, 0x5e, 0x34, 0x0d, - 0x55, 0x7b, 0x73, 0x95, 0x79, 0xec, 0x26, 0x5d, 0x22, 0x27, 0x2e, 0x5c, 0x5e, 0xc4, 0x25, 0xea, - 0x6d, 0xbd, 0x8a, 0x7a, 0xeb, 0xa4, 0x38, 0xff, 0x2a, 0x43, 0xf3, 0xf1, 0x34, 0x50, 0x22, 0xf9, - 0x22, 0x81, 0x72, 0xc8, 0xc6, 0x1c, 0xf3, 0xb2, 0x4e, 0x71, 0x4d, 0xae, 0x41, 0x5d, 0x89, 0x31, - 0x97, 0x8a, 0x8d, 0x27, 0x98, 0x9d, 0x25, 0x3a, 0x47, 0xe8, 0x5d, 0xe1, 0xf3, 0x50, 0x09, 0x2f, - 0x0a, 0xdb, 0x25, 0x64, 0x9b, 0x23, 0xc8, 0x47, 0x00, 0x5e, 0x14, 0x44, 0xb1, 0x3b, 0x62, 0x72, - 0x64, 0x13, 0xf0, 0xc6, 0x5c, 0xe9, 0xec, 0xb7, 0xf7, 0xba, 0x9a, 0xf0, 0x01, 0x93, 0x23, 0x5a, - 0xf7, 0x92, 0x25, 0xb9, 0xa2, 0xef, 0x00, 0x2d, 0x40, 0xf8, 0x98, 0x80, 0x25, 0x5a, 0x45, 0x78, - 0xdf, 0x27, 0xef, 0xc0, 0xf6, 0x19, 0x9f, 0x79, 0x2c, 0xf6, 0x5d, 0x7b, 0x1d, 0x62, 0x3a, 0xd5, - 0xe9, 0x96, 0x45, 0x1f, 0x19, 0x2c, 0xb9, 0x0c, 0xd5, 0x33, 0x3e, 0x73, 0xa7, 0xc2, 0xc7, 0x1c, - 0xa9, 0xd3, 0xca, 0x19, 0x9f, 0x0d, 0x85, 0x4f, 0x3e, 0x80, 0x8a, 0x18, 0xb3, 0x53, 0xae, 0xe3, - 0x5f, 0x6b, 0xf6, 0xd6, 0x1a, 0xcd, 0xf6, 0xf1, 0x3c, 0x6a, 0xb6, 0xaf, 0x89, 0xa9, 0xe5, 0x21, - 0xb7, 0xe1, 0xa2, 0x37, 0x95, 0x2a, 0x1a, 0x8b, 0x2f, 0xcd, 0xd5, 0x8a, 0x8a, 0x61, 0x0a, 0xd4, - 0x29, 0xc9, 0x6d, 0xe1, 0xd1, 0x76, 0x6f, 0x42, 0x3d, 0x3d, 0xa3, 0xbe, 0x02, 0x45, 0xe8, 0xf3, - 0x2f, 0xda, 0x85, 0x1b, 0xa5, 0x5b, 0x25, 0x6a, 0x80, 0xdd, 0x6f, 0x0a, 0xb0, 0x99, 0xfb, 0x5a, - 0x56, 0xf9, 0x42, 0x4e, 0xf9, 0xc4, 0x55, 0xc5, 0x8c, 0xab, 0xda, 0x50, 0x9d, 0xb0, 0x59, 0x10, - 0x31, 0x1f, 0x5d, 0xd1, 0xa4, 0x09, 0xa8, 0x3f, 0xf7, 0x5c, 0xf8, 0x4a, 0xfb, 0x40, 0x1b, 0xd1, - 0x00, 0xe4, 0x12, 0x54, 0x46, 0x5c, 0x9c, 0x8e, 0x94, 0xb5, 0xad, 0x85, 0xc8, 0x2e, 0xd4, 0x74, - 0x82, 0x4b, 0xf1, 0x25, 0x47, 0x9b, 0x96, 0x68, 0x0a, 0x93, 0x37, 0x61, 0x33, 0xc6, 0x95, 0xab, - 0x58, 0x7c, 0xca, 0x15, 0xda, 0xb4, 0x44, 0x9b, 0x06, 0x79, 0x82, 0xb8, 0xf9, 0x05, 0x5f, 0xcb, - 0x5c, 0xf0, 0xce, 0xdf, 0x0b, 0x70, 0xf1, 0x51, 0xe4, 0xb1, 0xc0, 0x7a, 0xe6, 0xc8, 0x2a, 0xf7, - 0x03, 0x28, 0x9f, 0xf1, 0x99, 0x44, 0x53, 0x34, 0xee, 0xdc, 0x9c, 0x7b, 0x61, 0x05, 0xf1, 0xde, - 0x01, 0x9f, 0x51, 0x24, 0x27, 0x77, 0xa1, 0x39, 0xd6, 0x6e, 0x62, 0x36, 0xbb, 0x8a, 0x98, 0x13, - 0x97, 0x56, 0x3b, 0x91, 0xe6, 0x68, 0xf5, 0x09, 0x27, 0x4c, 0xca, 0xe7, 0x51, 0xec, 0xdb, 0xa8, - 0x4d, 0xe1, 0xdd, 0xef, 0x40, 0xe9, 0x80, 0xcf, 0x56, 0xe6, 0x02, 0x81, 0xb2, 0x2e, 0x7a, 0xf8, - 0xa9, 0x26, 0xc5, 0xb5, 0xf3, 0x97, 0x02, 0xbc, 0x9e, 0x53, 0x94, 0xf3, 0xf8, 0x01, 0x0f, 0x82, - 0x48, 0x47, 0xa8, 0x8d, 0x4c, 0xf7, 0x9c, 0xc7, 0x52, 0x44, 0x21, 0x0a, 0xdb, 0xa0, 0x5b, 0x16, - 0xfd, 0xc4, 0x60, 0xb5, 0x93, 0x27, 0x9c, 0x63, 0x90, 0x1b, 0xc9, 0x15, 0x0d, 0xee, 0xfb, 0x58, - 0x77, 0xf9, 0xb9, 0xf0, 0xb8, 0x8b, 0xaa, 0x18, 0x4d, 0xc1, 0xa0, 0x06, 0x5a, 0xa1, 0x39, 0x81, - 0x9a, 0x4d, 0x38, 0x7a, 0x37, 0x25, 0x38, 0x99, 0x4d, 0x30, 0x7b, 0xa5, 0x38, 0x0d, 0x99, 0x9a, - 0xc6, 0x1c, 0xbd, 0xdc, 0xa4, 0x73, 0x84, 0xf3, 0x75, 0x01, 0x5a, 0x5a, 0xed, 0x6c, 0x25, 0x5d, - 0x53, 0x9d, 0xdf, 0x81, 0x6d, 0x91, 0xa1, 0x72, 0xd3, 0x52, 0xbd, 0x95, 0x45, 0xe7, 0x74, 0x46, - 0x95, 0x4a, 0x4b, 0x2a, 0x25, 0x86, 0x2d, 0xe7, 0x23, 0x37, 0x31, 0xd1, 0x06, 0xb6, 0x0e, 0x09, - 0xe8, 0xfc, 0xb3, 0x00, 0x97, 0xd7, 0x14, 0xfb, 0x97, 0xec, 0x23, 0xde, 0x84, 0x4d, 0x5b, 0xb1, - 0x5c, 0x4c, 0x5d, 0xab, 0x52, 0xd3, 0x22, 0x4d, 0x9e, 0x5d, 0x81, 0x1a, 0x0f, 0xa5, 0x9b, 0x51, - 0xac, 0xca, 0x43, 0x89, 0x36, 0xbe, 0x09, 0xcd, 0x80, 0x49, 0xe5, 0x4e, 0x27, 0x3e, 0x53, 0xdc, - 0xdc, 0x43, 0x65, 0xda, 0xd0, 0xb8, 0xa1, 0x41, 0xe9, 0x33, 0xcb, 0x99, 0x54, 0x7c, 0xec, 0x2a, - 0x76, 0xaa, 0xcb, 0x7a, 0x49, 0x9f, 0xd9, 0xa0, 0x4e, 0xd8, 0xa9, 0x24, 0x6f, 0xc3, 0x56, 0xa0, - 0x63, 0xc4, 0x0d, 0x85, 0x77, 0x86, 0x1f, 0x31, 0x57, 0xd1, 0x26, 0x62, 0x07, 0x16, 0xe9, 0xfc, - 0xba, 0x02, 0x57, 0xd6, 0x76, 0x36, 0xe4, 0xbb, 0xb0, 0x93, 0x55, 0xc4, 0x45, 0xde, 0x60, 0x66, - 0x4f, 0x4f, 0x32, 0x0a, 0x3d, 0x32, 0x3b, 0xff, 0xc7, 0xa6, 0xd0, 0xbe, 0x65, 0xbe, 0xcf, 0x7d, - 0xbc, 0x50, 0x6b, 0xd4, 0x00, 0x3a, 0x4e, 0x9e, 0x6a, 0x27, 0x73, 0x1f, 0x5b, 0x86, 0x1a, 0x4d, - 0x40, 0x4d, 0x3f, 0x9e, 0x6a, 0x9d, 0x1a, 0x86, 0x1e, 0x01, 0x4d, 0x1f, 0xf3, 0x71, 0x74, 0xce, - 0x7d, 0xac, 0xe8, 0x35, 0x9a, 0x80, 0xe4, 0x06, 0x34, 0x47, 0x4c, 0xba, 0x28, 0xd6, 0x9d, 0x4a, - 0xac, 0xcd, 0x35, 0x0a, 0x23, 0x26, 0x3b, 0x1a, 0x35, 0xc4, 0x0b, 0xfe, 0x9c, 0xc7, 0xe2, 0x59, - 0xd2, 0x3a, 0x4b, 0xc5, 0xd4, 0xd4, 0x94, 0xde, 0x12, 0x25, 0xd9, 0xad, 0x63, 0xdc, 0xc1, 0x26, - 0x38, 0x9e, 0x4a, 0x95, 0x50, 0x6e, 0x23, 0x65, 0x03, 0x71, 0x96, 0xe4, 0x43, 0xb8, 0x6a, 0x3b, - 0x43, 0x37, 0xe6, 0xbf, 0x9c, 0x72, 0xa9, 0x8c, 0x17, 0x91, 0x85, 0xb7, 0x5b, 0xc8, 0xd1, 0xb6, - 0x24, 0xd4, 0x50, 0xa0, 0x33, 0x35, 0x3f, 0x5f, 0xcf, 0x6e, 0xd2, 0xe0, 0xc2, 0x5a, 0xf6, 0x2e, - 0x66, 0xc6, 0x47, 0x70, 0x6d, 0x91, 0x5d, 0x9b, 0x43, 0x71, 0xfb, 0x79, 0x82, 0xfc, 0x57, 0xf2, - 0xfc, 0x14, 0x29, 0xcc, 0xf7, 0xd7, 0x0b, 0x30, 0x0a, 0x5c, 0x5c, 0x2f, 0xc0, 0x68, 0x70, 0x13, - 0x9a, 0xbe, 0x90, 0x93, 0x80, 0xcd, 0x4c, 0x7c, 0xed, 0xa0, 0xeb, 0x1b, 0x16, 0xa7, 0x63, 0xcc, - 0x79, 0xbe, 0x9c, 0xef, 0x49, 0x7b, 0xb2, 0x3a, 0xdf, 0x97, 0x82, 0xba, 0xb8, 0x22, 0xa8, 0x17, - 0x23, 0xb7, 0xb4, 0x14, 0xb9, 0xce, 0x7d, 0xd8, 0x5d, 0xfc, 0xf0, 0xd1, 0xf4, 0x69, 0x20, 0xbc, - 0xee, 0x88, 0xbd, 0xe4, 0x5d, 0xe3, 0xfc, 0xb9, 0x04, 0x9b, 0xb9, 0xb1, 0xe2, 0xbf, 0xf2, 0x35, - 0x31, 0x31, 0xaf, 0x43, 0x63, 0x12, 0x8b, 0x73, 0xa6, 0xb8, 0x7b, 0xc6, 0x67, 0xb6, 0x7a, 0x83, - 0x45, 0xe9, 0x6a, 0x74, 0x43, 0xdf, 0xaa, 0xd2, 0x8b, 0xc5, 0x44, 0xeb, 0x85, 0x79, 0xd9, 0xa4, - 0x59, 0x94, 0x2e, 0xe6, 0x9f, 0x47, 0x22, 0xb4, 0x59, 0x59, 0xa3, 0x16, 0xd2, 0xa5, 0xce, 0xc4, - 0x2a, 0xf7, 0xb1, 0x98, 0xd7, 0x68, 0x0a, 0xcf, 0x93, 0xa6, 0x9a, 0x4d, 0x9a, 0x43, 0x68, 0x59, - 0xef, 0x4a, 0x57, 0x45, 0xae, 0x96, 0x63, 0x3b, 0xa4, 0xb7, 0xd7, 0x0d, 0x4f, 0x96, 0xfc, 0x24, - 0x7a, 0x18, 0x89, 0x90, 0x6e, 0xc5, 0x39, 0x98, 0xdc, 0x83, 0x5a, 0xd2, 0xb2, 0xdb, 0x11, 0xe1, - 0xfa, 0x1a, 0x41, 0x76, 0x56, 0x90, 0x34, 0x65, 0xd0, 0x15, 0x8c, 0x87, 0x5e, 0x3c, 0x9b, 0xa8, - 0x34, 0xe9, 0xe7, 0x08, 0xac, 0x6f, 0x13, 0xee, 0x29, 0x36, 0x4f, 0xfd, 0x39, 0x42, 0x17, 0x2d, - 0x4b, 0xaa, 0x13, 0x18, 0x9b, 0x8c, 0x26, 0x5a, 0x6e, 0x6b, 0x8e, 0x3e, 0xe0, 0x33, 0xe9, 0xfc, - 0xa6, 0x04, 0x57, 0x5f, 0x70, 0x22, 0xeb, 0xaf, 0x42, 0xea, 0xaf, 0x37, 0x00, 0x26, 0x18, 0x1b, - 0xe8, 0x2e, 0xe3, 0xff, 0xba, 0xc1, 0x68, 0x6f, 0xa5, 0x4e, 0x2f, 0x65, 0x9d, 0xfe, 0x82, 0x8b, - 0xf5, 0x32, 0x54, 0xbd, 0x11, 0x53, 0x49, 0x9b, 0x5b, 0xa7, 0x15, 0x0d, 0xee, 0xfb, 0x3a, 0x6e, - 0x93, 0xb1, 0x6f, 0xa6, 0x77, 0x2b, 0xc6, 0xf1, 0x29, 0x6e, 0x1f, 0x9d, 0x68, 0xd2, 0xb7, 0x6a, - 0x3e, 0x86, 0x00, 0x39, 0x03, 0x12, 0xf3, 0x73, 0xce, 0x02, 0xee, 0xeb, 0x4b, 0x2e, 0xe6, 0x52, - 0xa6, 0x8d, 0xee, 0x07, 0x2f, 0xe5, 0xc6, 0x3d, 0x6a, 0xf9, 0x3b, 0x09, 0x7b, 0x3f, 0x54, 0xf1, - 0x8c, 0x5e, 0x88, 0x17, 0xf1, 0xbb, 0x3d, 0xb8, 0xb4, 0x9a, 0x98, 0xb4, 0xa0, 0xa4, 0x2d, 0x64, - 0x9a, 0x28, 0xbd, 0xd4, 0xea, 0x9e, 0xb3, 0x60, 0xca, 0x6d, 0xf4, 0x1b, 0xe0, 0x6e, 0xf1, 0xfd, - 0x82, 0xf3, 0xbb, 0x22, 0xb4, 0x16, 0x33, 0x90, 0x7c, 0x98, 0x79, 0x05, 0x58, 0x6a, 0x10, 0xd7, - 0xd4, 0xca, 0xcc, 0x1b, 0xc0, 0x27, 0xd0, 0xb4, 0x8e, 0xd2, 0x06, 0x95, 0xed, 0xe2, 0x62, 0xa7, - 0xbf, 0x3e, 0xe5, 0x69, 0x63, 0x92, 0xae, 0xf5, 0x8c, 0x59, 0x4d, 0x1a, 0xcd, 0x12, 0x86, 0xf0, - 0x0b, 0xd4, 0x48, 0x7a, 0xce, 0x84, 0xe3, 0x7f, 0x78, 0x89, 0x70, 0x7e, 0x04, 0xdb, 0xb8, 0xab, - 0x15, 0xb2, 0xa5, 0xeb, 0xe5, 0xae, 0xa2, 0x0f, 0x60, 0x27, 0x61, 0x7c, 0x6c, 0xde, 0x7a, 0x24, - 0xe5, 0xec, 0x65, 0xb9, 0x7f, 0x02, 0x97, 0xcc, 0x70, 0xaa, 0xc4, 0xb9, 0x50, 0xb3, 0x2e, 0x0f, - 0x15, 0x8f, 0x5f, 0xc0, 0xdf, 0x82, 0x92, 0xf0, 0x8d, 0x79, 0x9b, 0x54, 0x2f, 0x9d, 0x9e, 0xb9, - 0x4e, 0xf3, 0x12, 0x3a, 0x9e, 0xc7, 0x31, 0x6f, 0x5f, 0x56, 0x4a, 0xdf, 0xe4, 0x65, 0x5e, 0x4a, - 0x4f, 0xc8, 0xb1, 0x90, 0xf2, 0x15, 0xc4, 0x7c, 0x5d, 0x80, 0xa6, 0x96, 0x73, 0x3f, 0x8a, 0xce, - 0xc6, 0x2c, 0x3e, 0x5b, 0xcf, 0x38, 0x8d, 0x03, 0x6b, 0x06, 0xbd, 0x4c, 0x9b, 0xd5, 0x52, 0xa6, - 0x59, 0xbd, 0x0a, 0x75, 0x2c, 0x34, 0xae, 0xa6, 0x35, 0x89, 0x5c, 0x43, 0xc4, 0x30, 0x0e, 0xb2, - 0x1d, 0xc7, 0x46, 0xbe, 0xe3, 0x78, 0x03, 0xc0, 0xe7, 0x01, 0xd7, 0x9d, 0x1b, 0x53, 0x98, 0xc8, - 0x65, 0x5a, 0xb7, 0x98, 0x8e, 0x72, 0x7e, 0x05, 0xaf, 0x6b, 0x0d, 0xfb, 0xa1, 0x1c, 0x4a, 0x1e, - 0xeb, 0x0f, 0x99, 0x31, 0x7d, 0x8d, 0xaa, 0xbb, 0x50, 0x9b, 0x5a, 0x3a, 0xab, 0x6f, 0x0a, 0xe3, - 0xd4, 0x3c, 0x62, 0x02, 0x9b, 0x74, 0x73, 0x03, 0x55, 0x11, 0xde, 0xcf, 0x35, 0x44, 0xe5, 0x9c, - 0x7a, 0xce, 0x43, 0x93, 0x7c, 0xdd, 0x80, 0xb3, 0xf8, 0x81, 0x90, 0x2a, 0x8a, 0x67, 0xd9, 0x6b, - 0xa9, 0x90, 0xbb, 0x96, 0xde, 0x00, 0xf0, 0x34, 0xa1, 0x39, 0x4b, 0xd1, 0x9c, 0xc5, 0x62, 0x3a, - 0xca, 0xf9, 0x5b, 0x01, 0x88, 0x16, 0x66, 0x9f, 0x9e, 0x8e, 0x84, 0xa7, 0xc7, 0x8d, 0x95, 0x23, - 0x55, 0x66, 0x66, 0x2d, 0xae, 0x99, 0x59, 0x4b, 0x38, 0x11, 0x2c, 0xcd, 0xac, 0x65, 0x44, 0x27, - 0x33, 0xeb, 0x55, 0xa8, 0x63, 0x0b, 0x80, 0x43, 0xab, 0x99, 0x21, 0x70, 0x68, 0x3d, 0x5e, 0x39, - 0xb4, 0x56, 0x90, 0x60, 0xcd, 0xd0, 0x5a, 0xcd, 0x0e, 0xad, 0x23, 0xb8, 0xb8, 0x7c, 0x12, 0xb9, - 0x7e, 0x2e, 0x7f, 0x1f, 0x6a, 0x13, 0x4b, 0x64, 0x2f, 0x9b, 0x6b, 0xf9, 0x3c, 0xcf, 0x4b, 0xa2, - 0x29, 0xb5, 0xf3, 0xc7, 0x22, 0x34, 0x32, 0x0f, 0x42, 0x6b, 0xfc, 0xde, 0x86, 0xaa, 0xbd, 0xce, - 0x13, 0x7b, 0x59, 0x30, 0xab, 0x52, 0x29, 0xa7, 0x52, 0xbe, 0x58, 0x99, 0xd6, 0x21, 0x53, 0xac, - 0x08, 0x94, 0x27, 0x4c, 0x8d, 0x6c, 0xe1, 0xc1, 0x75, 0xea, 0xa9, 0x4a, 0xc6, 0x53, 0xd9, 0xb7, - 0x18, 0xd3, 0xb2, 0xa7, 0x6f, 0x31, 0x3b, 0xb0, 0xc1, 0xc7, 0xd1, 0xe7, 0x02, 0xe7, 0xfd, 0x3a, - 0x35, 0x80, 0x76, 0xd5, 0x73, 0x16, 0x04, 0x5c, 0xd9, 0x1e, 0xde, 0x42, 0x5a, 0xb8, 0x0e, 0x23, - 0x5b, 0xcc, 0x71, 0x8d, 0x6e, 0x15, 0xbe, 0xcf, 0x43, 0x5b, 0xc4, 0x2d, 0xb4, 0xbe, 0x81, 0x77, - 0xbe, 0xb2, 0xe6, 0x4a, 0xde, 0xf1, 0x56, 0x9b, 0x2b, 0x63, 0x94, 0xe2, 0xca, 0xf7, 0x93, 0x52, - 0x7e, 0xbc, 0xcf, 0x8c, 0xd1, 0xb8, 0xc6, 0x8e, 0x95, 0xc7, 0xe2, 0x9c, 0xfb, 0xee, 0xb3, 0x38, - 0x1a, 0x5b, 0x2b, 0x35, 0x2c, 0xee, 0xe3, 0x38, 0x1a, 0x93, 0x7b, 0xb0, 0x6b, 0x7a, 0x4b, 0xc9, - 0x7d, 0x17, 0x37, 0xec, 0x88, 0x8c, 0x0f, 0x3c, 0x26, 0xd1, 0x2f, 0x63, 0xa7, 0x29, 0xb9, 0xdf, - 0x4b, 0xf7, 0xf7, 0xf5, 0xb6, 0x99, 0x97, 0x42, 0x2f, 0x11, 0x6f, 0x0c, 0x0b, 0x06, 0x85, 0xd2, - 0xbf, 0x07, 0x35, 0x5b, 0x46, 0x92, 0xf2, 0xbd, 0xe6, 0x01, 0x31, 0x25, 0x73, 0xa6, 0xa6, 0x66, - 0x64, 0x9e, 0x3c, 0xc9, 0x6d, 0xb4, 0x03, 0x3e, 0x8f, 0x16, 0x56, 0xbd, 0x42, 0x5a, 0x5a, 0x9a, - 0x50, 0xe9, 0xcf, 0xda, 0x77, 0xb4, 0x24, 0x8e, 0x97, 0x39, 0xf4, 0x2e, 0x4d, 0xc9, 0x9c, 0x7f, - 0x17, 0xcc, 0x15, 0x72, 0xcc, 0xce, 0xd3, 0x3e, 0x20, 0x1b, 0xaf, 0x85, 0x7c, 0xbc, 0xae, 0x7a, - 0xc1, 0xba, 0x06, 0xf5, 0x67, 0xec, 0x3c, 0x9a, 0xc6, 0x42, 0x19, 0xd7, 0xd4, 0xe8, 0x1c, 0xf1, - 0x82, 0xbb, 0xf5, 0x26, 0x34, 0x4d, 0x67, 0xef, 0x66, 0x53, 0xb8, 0x61, 0x70, 0x66, 0xf4, 0xf8, - 0x36, 0x5c, 0x30, 0x97, 0xa2, 0x1c, 0x45, 0xb1, 0xc2, 0x2e, 0x4c, 0xda, 0x78, 0xdd, 0xc6, 0x8d, - 0x63, 0x8d, 0xd7, 0xdd, 0x98, 0xd4, 0x75, 0x80, 0x87, 0xd2, 0xbe, 0xe5, 0xe9, 0xa5, 0x8e, 0x23, - 0x21, 0x5d, 0xc5, 0x65, 0x12, 0xb6, 0x15, 0x21, 0x4f, 0xb8, 0x54, 0x0f, 0xcb, 0xb5, 0x72, 0x6b, - 0xc3, 0xf9, 0x7d, 0xc1, 0xdc, 0xde, 0x4b, 0x8d, 0xec, 0x9a, 0xb0, 0x5c, 0x6c, 0xeb, 0x8c, 0x0d, - 0x72, 0x6d, 0x5d, 0x1f, 0xae, 0x8f, 0xcc, 0x35, 0xec, 0xb2, 0xd8, 0x1b, 0x89, 0x73, 0xee, 0xca, - 0xe9, 0x64, 0xa2, 0x75, 0xe7, 0x21, 0x7b, 0x1a, 0xd8, 0x21, 0xa6, 0x46, 0xaf, 0x59, 0xb2, 0x8e, - 0xa1, 0x3a, 0x36, 0x44, 0x7d, 0x43, 0xe3, 0xfc, 0xa9, 0x60, 0x82, 0xe1, 0x44, 0x4f, 0xa1, 0x7a, - 0xae, 0xe5, 0xf1, 0x4b, 0xbe, 0x9b, 0x7c, 0x08, 0x15, 0x3b, 0xc8, 0xea, 0xef, 0x6c, 0x2d, 0x36, - 0xff, 0x19, 0x81, 0x7b, 0x27, 0xf3, 0x11, 0x97, 0x5a, 0x26, 0xe7, 0x2e, 0x34, 0x32, 0x68, 0xd2, - 0x80, 0xea, 0x70, 0x70, 0x30, 0x38, 0xfc, 0x74, 0xd0, 0x7a, 0x4d, 0x03, 0x27, 0x74, 0x78, 0x7c, - 0xd2, 0xef, 0xb5, 0x0a, 0xe4, 0x02, 0x6c, 0x0e, 0x07, 0x08, 0x7e, 0x7a, 0x48, 0x4f, 0x1e, 0x7c, - 0xd6, 0x2a, 0x3a, 0x5f, 0x97, 0xcc, 0x10, 0xf8, 0x24, 0x33, 0x64, 0xdb, 0xe6, 0x74, 0x8d, 0xf2, - 0x04, 0xca, 0x98, 0x3f, 0x36, 0x98, 0xf4, 0x5a, 0x1f, 0x48, 0x45, 0x36, 0xc1, 0x8b, 0x2a, 0xd2, - 0xc1, 0xe5, 0x8d, 0xf4, 0x15, 0x14, 0x9e, 0x26, 0x39, 0x3e, 0x47, 0x68, 0x97, 0xd8, 0xb1, 0xc5, - 0x14, 0x35, 0xfb, 0xb6, 0x91, 0xe2, 0x3a, 0xf8, 0x6a, 0x18, 0x73, 0x39, 0x89, 0x42, 0x99, 0xdc, - 0x8c, 0x29, 0xac, 0x2f, 0xd9, 0x98, 0x4f, 0x02, 0x61, 0x98, 0x4d, 0xfc, 0xd5, 0x2d, 0xa6, 0xa3, - 0x08, 0x5f, 0xfd, 0x98, 0x50, 0x43, 0xcb, 0x7e, 0x3f, 0x6f, 0xd9, 0x15, 0xa7, 0xde, 0x7b, 0xb2, - 0xf4, 0xdc, 0xb0, 0xf2, 0x09, 0xc2, 0xf8, 0xb0, 0x9e, 0xb6, 0x71, 0x3f, 0x03, 0xb2, 0xcc, 0xb9, - 0xe4, 0x8b, 0xa3, 0xfe, 0xa0, 0xb7, 0x3f, 0xf8, 0xa4, 0x55, 0x20, 0x4d, 0xa8, 0x75, 0xba, 0xdd, - 0xfe, 0x91, 0xf6, 0x4c, 0x51, 0x43, 0xbd, 0x7e, 0xf7, 0xd1, 0xfe, 0xa0, 0xdf, 0x6b, 0x95, 0x34, - 0xd4, 0xed, 0x0c, 0xba, 0xfd, 0x47, 0xfd, 0x5e, 0xab, 0xec, 0xfc, 0xa3, 0x60, 0xfa, 0xbb, 0x6e, - 0x6e, 0xd6, 0xef, 0x71, 0x4f, 0xc8, 0xf5, 0x8f, 0x88, 0xd7, 0xa0, 0x6e, 0xed, 0xb9, 0x9f, 0x44, - 0xda, 0x1c, 0x41, 0x7e, 0x01, 0xdb, 0xbe, 0xe5, 0x77, 0x73, 0x91, 0xf7, 0xde, 0x62, 0xa7, 0xbc, - 0xea, 0x93, 0x7b, 0xc9, 0xc2, 0x9a, 0x67, 0xcb, 0xcf, 0xc1, 0xce, 0xbb, 0xb0, 0x95, 0xa7, 0xc8, - 0x1d, 0xf6, 0xb5, 0xdc, 0x61, 0x0b, 0xce, 0x37, 0x45, 0xd8, 0x5e, 0xf8, 0x03, 0x6d, 0x7d, 0xcd, - 0x5f, 0x7c, 0xd5, 0x28, 0x2e, 0xbd, 0x6a, 0x90, 0x77, 0x81, 0x64, 0x49, 0xdc, 0xec, 0x78, 0xd8, - 0xca, 0x10, 0x9a, 0xbb, 0x2a, 0xdb, 0x44, 0x94, 0x5f, 0xa5, 0x89, 0x20, 0x3f, 0x85, 0x1d, 0x19, - 0x79, 0x82, 0x05, 0x6e, 0x20, 0xc2, 0xb3, 0xf4, 0xaf, 0xe0, 0xf6, 0x06, 0x4a, 0x59, 0x18, 0xbb, - 0x8f, 0x91, 0xf2, 0x91, 0x08, 0xcf, 0x92, 0xff, 0xe8, 0x88, 0x5c, 0x44, 0xa1, 0x48, 0x3d, 0xb6, - 0x26, 0xdd, 0xa5, 0xeb, 0xa7, 0x7f, 0x5e, 0xae, 0x10, 0xb9, 0xd4, 0xbe, 0x52, 0xc2, 0x17, 0x51, - 0xd2, 0x91, 0x00, 0x94, 0x3d, 0xb7, 0x63, 0x49, 0xb6, 0x05, 0x2c, 0xe4, 0x5b, 0xc0, 0x03, 0x68, - 0xd8, 0xff, 0xa9, 0x4f, 0x74, 0x5d, 0x2e, 0x62, 0x34, 0x7c, 0x6b, 0xfe, 0xc5, 0xce, 0xfc, 0x9f, - 0xed, 0xc7, 0xf6, 0x8f, 0x6d, 0x2b, 0x74, 0x4f, 0x33, 0xd0, 0x2c, 0xb7, 0xf3, 0x87, 0x02, 0x6c, - 0x69, 0x15, 0x33, 0x5f, 0xfe, 0x21, 0x34, 0xe2, 0x14, 0x4a, 0xe6, 0xcb, 0x9d, 0xb9, 0xfc, 0x39, - 0x29, 0xcd, 0x12, 0x92, 0x3b, 0xb0, 0x23, 0xa7, 0x4f, 0x6d, 0xe1, 0x95, 0x0f, 0x65, 0x14, 0xde, - 0x9f, 0x29, 0x9e, 0x74, 0x64, 0x2b, 0xf7, 0xc8, 0xbb, 0x70, 0x21, 0xf1, 0xc6, 0x9c, 0xc1, 0x3c, - 0xf4, 0x2c, 0x6f, 0x38, 0x5f, 0x15, 0xd2, 0xee, 0x46, 0x17, 0x57, 0x9c, 0x4c, 0xd2, 0xb8, 0xd3, - 0xcb, 0x95, 0xe5, 0xf3, 0x12, 0x54, 0xec, 0xeb, 0xa8, 0x29, 0x0d, 0x16, 0xca, 0x46, 0x6e, 0x39, - 0x17, 0xb9, 0xd7, 0xa0, 0x3e, 0x7f, 0x1c, 0xd8, 0xc0, 0x79, 0x69, 0x8e, 0x98, 0x27, 0x71, 0x25, - 0xdb, 0x11, 0xff, 0xb5, 0x08, 0x17, 0x32, 0xaa, 0xe9, 0xd1, 0x2c, 0x0a, 0xc9, 0x5d, 0xa8, 0x30, - 0x5c, 0xa1, 0x8e, 0x5b, 0x77, 0x9c, 0x95, 0xdd, 0x82, 0x21, 0xde, 0x33, 0x3f, 0xd4, 0x72, 0x90, - 0xb7, 0x60, 0x33, 0x0a, 0x7c, 0x4b, 0x32, 0x4c, 0x8b, 0x50, 0x1e, 0x69, 0x5b, 0x18, 0x0d, 0xd9, - 0x09, 0x7c, 0x4d, 0x43, 0x92, 0x50, 0xe9, 0xa2, 0x5c, 0xb1, 0xda, 0x5d, 0x80, 0xcd, 0x83, 0xfe, - 0x67, 0xdd, 0x0e, 0xed, 0xb9, 0x9d, 0x5e, 0x0f, 0xf3, 0x9d, 0xc0, 0x56, 0xa7, 0xdb, 0x3d, 0x1c, - 0x0e, 0x4e, 0x8e, 0x2d, 0xae, 0x40, 0x2e, 0xc2, 0x76, 0x42, 0xd6, 0xeb, 0x3f, 0xea, 0x9b, 0x5b, - 0x70, 0x07, 0x5a, 0x29, 0x21, 0xed, 0x3f, 0x3e, 0x7c, 0x82, 0xb7, 0x21, 0x40, 0xe5, 0xd1, 0x61, - 0xf7, 0x40, 0xdf, 0x85, 0xfa, 0xea, 0x18, 0x0e, 0x2c, 0xb4, 0x41, 0xb6, 0xa1, 0x31, 0xdc, 0xef, - 0xb9, 0xc3, 0xa3, 0x5e, 0x47, 0x0b, 0xa8, 0x90, 0x16, 0x34, 0x07, 0x9d, 0xc7, 0x7d, 0xb7, 0xfb, - 0xa0, 0x33, 0xf8, 0xa4, 0xdf, 0x6b, 0x55, 0x9d, 0x63, 0xd3, 0x2d, 0x2c, 0xe5, 0x1f, 0x76, 0xa0, - 0xfc, 0x0b, 0x95, 0x4c, 0x48, 0x7a, 0xbd, 0x62, 0x28, 0x5d, 0xf9, 0xbc, 0x74, 0x7f, 0xf3, 0xe7, - 0x8d, 0xbd, 0xdb, 0xf7, 0x12, 0x93, 0x3c, 0xad, 0xe0, 0xea, 0xbd, 0xff, 0x04, 0x00, 0x00, 0xff, - 0xff, 0x6c, 0x00, 0x17, 0x3d, 0x2d, 0x22, 0x00, 0x00, + // 3057 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x39, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0xc6, 0x07, 0xf1, 0xd1, 0x00, 0x41, 0x68, 0x44, 0x4b, 0x10, 0x25, 0x97, 0xa4, 0xb5, 0x5d, + 0xd6, 0x7b, 0xe5, 0x47, 0xbd, 0x27, 0xbf, 0xc4, 0x8e, 0x24, 0x97, 0x03, 0x01, 0xb0, 0x45, 0x51, + 0x02, 0x99, 0x21, 0x21, 0xc7, 0xa9, 0x54, 0x6d, 0x46, 0xbb, 0x23, 0x62, 0xcd, 0xc5, 0x2e, 0xb2, + 0x33, 0xa0, 0x02, 0x1f, 0x52, 0x95, 0xfc, 0x82, 0x54, 0x2e, 0xf1, 0xd1, 0xe7, 0x54, 0x4e, 0xa9, + 0xca, 0x21, 0xb7, 0x9c, 0x52, 0xb9, 0xe7, 0x98, 0xfc, 0x82, 0x54, 0x7e, 0x40, 0x8e, 0xa9, 0xe9, + 0x99, 0xfd, 0xc2, 0x87, 0x42, 0x56, 0x4e, 0x39, 0x61, 0xbb, 0xa7, 0xbb, 0xb7, 0xb7, 0xbf, 0x7b, + 0x00, 0x9b, 0x53, 0xe6, 0x45, 0x5e, 0x70, 0xb2, 0x3b, 0x8d, 0x42, 0x19, 0x92, 0x1a, 0xfe, 0xbc, + 0x98, 0xbd, 0xdc, 0xb9, 0xec, 0x8c, 0x99, 0xb4, 0x3d, 0x97, 0x07, 0xd2, 0x93, 0x73, 0x7d, 0xbc, + 0x73, 0x59, 0xcc, 0x03, 0xc7, 0x16, 0x5c, 0x4a, 0x2f, 0x38, 0x11, 0x06, 0x69, 0xb1, 0xe9, 0xd4, + 0xf7, 0x1c, 0x26, 0xbd, 0x30, 0xb0, 0x27, 0x5c, 0x32, 0x97, 0x49, 0x66, 0x4f, 0xb8, 0x10, 0xec, + 0x84, 0x6b, 0x1a, 0x8b, 0xc1, 0xf5, 0x4f, 0xb9, 0x74, 0xc6, 0x5e, 0x70, 0xf2, 0x88, 0x39, 0xa7, + 0xdc, 0x1d, 0x4d, 0xfb, 0x4c, 0xb2, 0x3e, 0x97, 0xcc, 0xf3, 0x05, 0xb9, 0x09, 0x0d, 0x64, 0x0a, + 0x66, 0x93, 0x17, 0x3c, 0xea, 0x14, 0x6e, 0x15, 0xee, 0x6c, 0x52, 0x50, 0xa8, 0x21, 0x62, 0xc8, + 0x6d, 0x68, 0xca, 0x50, 0x32, 0x3f, 0xa6, 0x28, 0x22, 0x45, 0x03, 0x71, 0x9a, 0xc4, 0xfa, 0x45, + 0x15, 0x2a, 0x4a, 0xf6, 0x6c, 0x4a, 0xb6, 0x61, 0xc3, 0xf1, 0x43, 0xe7, 0x14, 0x05, 0x95, 0xa9, + 0x06, 0x48, 0x0b, 0x8a, 0x9e, 0x8b, 0x9c, 0x75, 0x5a, 0xf4, 0x5c, 0xf2, 0x09, 0xd4, 0x9c, 0x30, + 0x90, 0xcc, 0x91, 0xa2, 0x53, 0xba, 0x55, 0xba, 0xd3, 0xb8, 0xf7, 0xf6, 0x6e, 0xfc, 0xf9, 0xbb, + 0x47, 0xf3, 0xc0, 0xd9, 0x0b, 0x84, 0x64, 0xbe, 0x8f, 0x1f, 0xd6, 0xd3, 0x94, 0xcf, 0xef, 0xd1, + 0x84, 0x89, 0x7c, 0x07, 0x1a, 0x4e, 0x38, 0x99, 0xcc, 0x02, 0x4f, 0x7a, 0x5c, 0x74, 0xca, 0x28, + 0xe3, 0x6a, 0x5e, 0x46, 0xcf, 0x10, 0xcc, 0x69, 0x96, 0x96, 0x1c, 0xc0, 0x56, 0x2c, 0xc6, 0xd8, + 0xa0, 0xb3, 0x71, 0xab, 0x70, 0xa7, 0x71, 0xef, 0xdd, 0x94, 0xfd, 0x35, 0x06, 0xa3, 0x8b, 0xdc, + 0x64, 0x04, 0x24, 0x23, 0x3f, 0x96, 0x59, 0xb9, 0x88, 0xcc, 0x15, 0x02, 0xc8, 0x07, 0x50, 0x9d, + 0x46, 0xe1, 0x4b, 0xcf, 0xe7, 0x9d, 0x2a, 0xca, 0xba, 0x96, 0xca, 0x8a, 0x65, 0x1c, 0x6a, 0x02, + 0x1a, 0x53, 0x92, 0x67, 0xd0, 0x32, 0x8f, 0xb1, 0x1e, 0xb5, 0x8b, 0xe8, 0xb1, 0xc0, 0x4c, 0xee, + 0x42, 0xd5, 0x44, 0x5c, 0xa7, 0x8e, 0x72, 0xde, 0xcc, 0x9b, 0xf8, 0x48, 0x1f, 0xd2, 0x98, 0x4a, + 0x19, 0x37, 0x0e, 0xd1, 0x58, 0x01, 0xb8, 0x90, 0x71, 0x17, 0xb8, 0xc9, 0x03, 0x68, 0xbc, 0x9c, + 0xf9, 0xfe, 0x3e, 0x9f, 0xab, 0x6c, 0xe9, 0x34, 0x16, 0x2d, 0xa1, 0xb4, 0x30, 0x87, 0x9f, 0xce, + 0x7c, 0x9f, 0x66, 0xa9, 0x95, 0x67, 0x32, 0x60, 0xac, 0x50, 0xf3, 0x42, 0x9e, 0x59, 0x16, 0x40, + 0xba, 0xd0, 0x7e, 0xc5, 0xa4, 0x33, 0x3e, 0x08, 0xfc, 0x79, 0xd7, 0x71, 0xc2, 0x59, 0x20, 0x3b, + 0x9b, 0xab, 0xcc, 0x63, 0x0e, 0xe9, 0x12, 0x39, 0xb1, 0xe1, 0xea, 0x22, 0x2e, 0x56, 0xaf, 0x75, + 0x11, 0xf5, 0xd6, 0x49, 0xb1, 0xfe, 0x5e, 0x86, 0xe6, 0xb3, 0x99, 0x2f, 0xbd, 0xf8, 0x8d, 0x04, + 0xca, 0x01, 0x9b, 0x70, 0xcc, 0xcb, 0x3a, 0xc5, 0x67, 0x72, 0x03, 0xea, 0xd2, 0x9b, 0x70, 0x21, + 0xd9, 0x64, 0x8a, 0xd9, 0x59, 0xa2, 0x29, 0x42, 0x9d, 0xea, 0x1a, 0xe4, 0x84, 0x41, 0xa7, 0x84, + 0x6c, 0x29, 0x82, 0x7c, 0x02, 0xe0, 0x84, 0x7e, 0x18, 0xd9, 0x63, 0x26, 0xc6, 0x26, 0x01, 0x6f, + 0xa5, 0x4a, 0x67, 0xdf, 0xbd, 0xdb, 0x53, 0x84, 0x8f, 0x99, 0x18, 0xd3, 0xba, 0x13, 0x3f, 0x92, + 0x6b, 0xaa, 0x06, 0x28, 0x01, 0x9e, 0x8b, 0x09, 0x58, 0xa2, 0x55, 0x84, 0xf7, 0x5c, 0xf2, 0x1e, + 0x6c, 0x9d, 0xf2, 0xb9, 0xc3, 0x22, 0xd7, 0x36, 0x35, 0x12, 0xd3, 0xa9, 0x4e, 0x5b, 0x06, 0x7d, + 0xa8, 0xb1, 0xe4, 0x2a, 0x54, 0x4f, 0xf9, 0xdc, 0x9e, 0x79, 0x2e, 0xe6, 0x48, 0x9d, 0x56, 0x4e, + 0xf9, 0x7c, 0xe4, 0xb9, 0xe4, 0x21, 0x54, 0xbc, 0x09, 0x3b, 0xe1, 0x2a, 0xfe, 0x95, 0x66, 0xef, + 0xac, 0xd1, 0x6c, 0xcf, 0x14, 0xd9, 0x3d, 0x45, 0x4c, 0x0d, 0x0f, 0xb9, 0x0b, 0x97, 0x9d, 0x99, + 0x90, 0xe1, 0xc4, 0xfb, 0x4a, 0x97, 0x56, 0x54, 0x0c, 0x53, 0xa0, 0x4e, 0x49, 0xee, 0x08, 0x3f, + 0x6d, 0xe7, 0x36, 0xd4, 0x93, 0x6f, 0x54, 0x25, 0xd0, 0x0b, 0x5c, 0xfe, 0x93, 0x4e, 0xe1, 0x56, + 0xe9, 0x4e, 0x89, 0x6a, 0x60, 0xe7, 0x2f, 0x05, 0xd8, 0xcc, 0xbd, 0x2d, 0xab, 0x7c, 0x21, 0xa7, + 0x7c, 0xec, 0xaa, 0x62, 0xc6, 0x55, 0x1d, 0xa8, 0x4e, 0xd9, 0xdc, 0x0f, 0x99, 0x8b, 0xae, 0x68, + 0xd2, 0x18, 0x54, 0xaf, 0x7b, 0xe5, 0xb9, 0x52, 0xf9, 0x40, 0x19, 0x51, 0x03, 0xe4, 0x0a, 0x54, + 0xc6, 0xdc, 0x3b, 0x19, 0x4b, 0x63, 0x5b, 0x03, 0x91, 0x1d, 0xa8, 0xa9, 0x04, 0x17, 0xde, 0x57, + 0x1c, 0x6d, 0x5a, 0xa2, 0x09, 0x4c, 0xde, 0x86, 0xcd, 0x08, 0x9f, 0x6c, 0xc9, 0xa2, 0x13, 0x2e, + 0xd1, 0xa6, 0x25, 0xda, 0xd4, 0xc8, 0x63, 0xc4, 0xa5, 0x05, 0xbe, 0x96, 0x29, 0xf0, 0xd6, 0x9f, + 0x0b, 0x70, 0xf9, 0x69, 0xe8, 0x30, 0xdf, 0x78, 0xe6, 0xd0, 0x28, 0xf7, 0x2d, 0x28, 0x9f, 0xf2, + 0xb9, 0x40, 0x53, 0x34, 0xee, 0xdd, 0x4e, 0xbd, 0xb0, 0x82, 0x78, 0x77, 0x9f, 0xcf, 0x29, 0x92, + 0x93, 0xfb, 0xd0, 0x9c, 0x28, 0x37, 0x31, 0x93, 0x5d, 0x45, 0xcc, 0x89, 0x2b, 0xab, 0x9d, 0x48, + 0x73, 0xb4, 0xea, 0x0b, 0xa7, 0x4c, 0x88, 0x57, 0x61, 0xe4, 0x9a, 0xa8, 0x4d, 0xe0, 0x9d, 0xff, + 0x81, 0xd2, 0x3e, 0x9f, 0xaf, 0xcc, 0x05, 0x02, 0x65, 0xd5, 0xf4, 0xf0, 0x55, 0x4d, 0x8a, 0xcf, + 0xd6, 0xef, 0x0b, 0xf0, 0x66, 0x4e, 0x51, 0xce, 0xa3, 0xc7, 0xdc, 0xf7, 0x43, 0x15, 0xa1, 0x26, + 0x32, 0xed, 0x33, 0x1e, 0x09, 0x2f, 0x0c, 0x50, 0xd8, 0x06, 0x6d, 0x19, 0xf4, 0x73, 0x8d, 0x55, + 0x4e, 0x9e, 0x72, 0x8e, 0x41, 0xae, 0x25, 0x57, 0x14, 0xb8, 0xe7, 0x62, 0xdf, 0xe5, 0x67, 0x9e, + 0xc3, 0x6d, 0x54, 0x45, 0x6b, 0x0a, 0x1a, 0x35, 0x54, 0x0a, 0xa5, 0x04, 0x72, 0x3e, 0xe5, 0xe8, + 0xdd, 0x84, 0xe0, 0x78, 0x3e, 0xc5, 0xec, 0x15, 0xde, 0x49, 0xc0, 0xe4, 0x2c, 0xe2, 0xe8, 0xe5, + 0x26, 0x4d, 0x11, 0xd6, 0x37, 0x05, 0x68, 0x2b, 0xb5, 0xb3, 0x9d, 0x74, 0x4d, 0x77, 0x7e, 0x0f, + 0xb6, 0xbc, 0x0c, 0x95, 0x9d, 0xb4, 0xea, 0x56, 0x16, 0x9d, 0xd3, 0x19, 0x55, 0x2a, 0x2d, 0xa9, + 0x14, 0x1b, 0xb6, 0x9c, 0x8f, 0xdc, 0xd8, 0x44, 0x1b, 0x38, 0x3a, 0xc4, 0xa0, 0xf5, 0xb7, 0x02, + 0x5c, 0x5d, 0xd3, 0xec, 0xcf, 0x39, 0x47, 0xbc, 0x0d, 0x9b, 0xa6, 0x63, 0xd9, 0x98, 0xba, 0x46, + 0xa5, 0xa6, 0x41, 0xea, 0x3c, 0xbb, 0x06, 0x35, 0x1e, 0x08, 0x3b, 0xa3, 0x58, 0x95, 0x07, 0x02, + 0x6d, 0x7c, 0x1b, 0x9a, 0x3e, 0x13, 0xd2, 0x9e, 0x4d, 0x5d, 0x26, 0xb9, 0xae, 0x43, 0x65, 0xda, + 0x50, 0xb8, 0x91, 0x46, 0xa9, 0x6f, 0x16, 0x73, 0x21, 0xf9, 0xc4, 0x96, 0xec, 0x44, 0xb5, 0xf5, + 0x92, 0xfa, 0x66, 0x8d, 0x3a, 0x66, 0x27, 0x82, 0xbc, 0x0b, 0x2d, 0x5f, 0xc5, 0x88, 0x1d, 0x78, + 0xce, 0x29, 0xbe, 0x44, 0x97, 0xa2, 0x4d, 0xc4, 0x0e, 0x0d, 0xd2, 0xfa, 0x59, 0x05, 0xae, 0xad, + 0x9d, 0x6c, 0xc8, 0xff, 0xc2, 0x76, 0x56, 0x11, 0x1b, 0x79, 0xfd, 0xb9, 0xf9, 0x7a, 0x92, 0x51, + 0xe8, 0xa9, 0x3e, 0xf9, 0x0f, 0x36, 0x85, 0xf2, 0x2d, 0x73, 0x5d, 0xee, 0x62, 0x41, 0xad, 0x51, + 0x0d, 0xa8, 0x38, 0x79, 0xa1, 0x9c, 0xcc, 0x5d, 0x1c, 0x19, 0x6a, 0x34, 0x06, 0x15, 0xfd, 0x64, + 0xa6, 0x74, 0x6a, 0x68, 0x7a, 0x04, 0x14, 0x7d, 0xc4, 0x27, 0xe1, 0x19, 0x77, 0xb1, 0xa3, 0xd7, + 0x68, 0x0c, 0x92, 0x5b, 0xd0, 0x1c, 0x33, 0x61, 0xa3, 0x58, 0x7b, 0x26, 0xb0, 0x37, 0xd7, 0x28, + 0x8c, 0x99, 0xe8, 0x2a, 0xd4, 0x08, 0x0b, 0xfc, 0x19, 0x8f, 0xbc, 0x97, 0xf1, 0xe8, 0x2c, 0x24, + 0x93, 0x33, 0xdd, 0x7a, 0x4b, 0x94, 0x64, 0x8f, 0x8e, 0xf0, 0x04, 0x87, 0xe0, 0x68, 0x26, 0x64, + 0x4c, 0xb9, 0x85, 0x94, 0x0d, 0xc4, 0x19, 0x92, 0x8f, 0xe1, 0xba, 0x99, 0x0c, 0xed, 0x88, 0xff, + 0x78, 0xc6, 0x85, 0xd4, 0x5e, 0x44, 0x16, 0xde, 0x69, 0x23, 0x47, 0xc7, 0x90, 0x50, 0x4d, 0x81, + 0xce, 0x54, 0xfc, 0x7c, 0x3d, 0xbb, 0x4e, 0x83, 0x4b, 0x6b, 0xd9, 0x7b, 0x98, 0x19, 0x9f, 0xc0, + 0x8d, 0x45, 0x76, 0x65, 0x0e, 0xc9, 0xcd, 0xeb, 0x09, 0xf2, 0x5f, 0xcb, 0xf3, 0x53, 0xa4, 0xd0, + 0xef, 0x5f, 0x2f, 0x40, 0x2b, 0x70, 0x79, 0xbd, 0x00, 0xad, 0xc1, 0x6d, 0x68, 0xba, 0x9e, 0x98, + 0xfa, 0x6c, 0xae, 0xe3, 0x6b, 0x1b, 0x5d, 0xdf, 0x30, 0x38, 0x15, 0x63, 0xd6, 0xab, 0xe5, 0x7c, + 0x8f, 0xc7, 0x93, 0xd5, 0xf9, 0xbe, 0x14, 0xd4, 0xc5, 0x15, 0x41, 0xbd, 0x18, 0xb9, 0xa5, 0xa5, + 0xc8, 0xb5, 0x1e, 0xc1, 0xce, 0xe2, 0x8b, 0x0f, 0x67, 0x2f, 0x7c, 0xcf, 0xe9, 0x8d, 0xd9, 0x39, + 0x6b, 0x8d, 0xf5, 0xbb, 0x12, 0x6c, 0xe6, 0xd6, 0x8a, 0x7f, 0xc9, 0xd7, 0xc4, 0xc4, 0xbc, 0x09, + 0x8d, 0x69, 0xe4, 0x9d, 0x31, 0xc9, 0xed, 0x53, 0x3e, 0x37, 0xdd, 0x1b, 0x0c, 0x4a, 0x75, 0xa3, + 0x5b, 0xaa, 0xaa, 0x0a, 0x27, 0xf2, 0xa6, 0x4a, 0x2f, 0xcc, 0xcb, 0x26, 0xcd, 0xa2, 0x54, 0x33, + 0xff, 0x32, 0xf4, 0x02, 0x93, 0x95, 0x35, 0x6a, 0x20, 0xd5, 0xea, 0x74, 0xac, 0x72, 0x17, 0x9b, + 0x79, 0x8d, 0x26, 0x70, 0x9a, 0x34, 0xd5, 0x6c, 0xd2, 0x1c, 0x40, 0xdb, 0x78, 0x57, 0xd8, 0x32, + 0xb4, 0x95, 0x1c, 0x33, 0x21, 0xbd, 0xbb, 0x6e, 0x79, 0x32, 0xe4, 0xc7, 0xe1, 0x93, 0xd0, 0x0b, + 0x68, 0x2b, 0xca, 0xc1, 0xe4, 0x01, 0xd4, 0xe2, 0x91, 0xdd, 0xac, 0x08, 0x37, 0xd7, 0x08, 0x32, + 0xbb, 0x82, 0xa0, 0x09, 0x83, 0xea, 0x60, 0x3c, 0x70, 0xa2, 0xf9, 0x54, 0x26, 0x49, 0x9f, 0x22, + 0xb0, 0xbf, 0x4d, 0xb9, 0x23, 0x59, 0x9a, 0xfa, 0x29, 0x42, 0x35, 0x2d, 0x43, 0xaa, 0x12, 0x18, + 0x87, 0x8c, 0x26, 0x5a, 0xae, 0x95, 0xa2, 0xf7, 0xf9, 0x5c, 0x58, 0x3f, 0x2f, 0xc1, 0xf5, 0xd7, + 0x7c, 0x91, 0xf1, 0x57, 0x21, 0xf1, 0xd7, 0x5b, 0x00, 0x53, 0x8c, 0x0d, 0x74, 0x97, 0xf6, 0x7f, + 0x5d, 0x63, 0x94, 0xb7, 0x12, 0xa7, 0x97, 0xb2, 0x4e, 0x7f, 0x4d, 0x61, 0xbd, 0x0a, 0x55, 0xb3, + 0xcf, 0xa3, 0xf7, 0xea, 0xb4, 0xa2, 0xc0, 0x3d, 0x57, 0xc5, 0x6d, 0xbc, 0xf6, 0xcd, 0xd5, 0x69, + 0x45, 0x3b, 0x3e, 0xc1, 0xed, 0xa1, 0x13, 0x75, 0xfa, 0x56, 0xf5, 0xcb, 0x10, 0x20, 0xa7, 0x40, + 0x22, 0x7e, 0xc6, 0x99, 0xcf, 0x5d, 0x55, 0xe4, 0x22, 0x2e, 0x44, 0x32, 0xe8, 0x3e, 0x3c, 0x97, + 0x1b, 0x77, 0xa9, 0xe1, 0xef, 0xc6, 0xec, 0x83, 0x40, 0x46, 0x73, 0x7a, 0x29, 0x5a, 0xc4, 0xef, + 0xf4, 0xe1, 0xca, 0x6a, 0x62, 0xd2, 0x86, 0x92, 0xb2, 0x90, 0x1e, 0xa2, 0xd4, 0xa3, 0x52, 0xf7, + 0x8c, 0xf9, 0x33, 0x6e, 0xa2, 0x5f, 0x03, 0xf7, 0x8b, 0x1f, 0x15, 0xac, 0x5f, 0x16, 0xa1, 0xbd, + 0x98, 0x81, 0xe4, 0xe3, 0xcc, 0x2d, 0xc0, 0xd2, 0x80, 0xb8, 0xa6, 0x57, 0x66, 0xee, 0x00, 0x3e, + 0x83, 0xa6, 0x71, 0x94, 0x32, 0xa8, 0xe8, 0x14, 0x17, 0x27, 0xfd, 0xf5, 0x29, 0x4f, 0x1b, 0xd3, + 0xe4, 0x59, 0xed, 0x98, 0xd5, 0x78, 0xd0, 0x2c, 0x61, 0x08, 0xbf, 0x46, 0x8d, 0x78, 0xe6, 0x8c, + 0x39, 0xfe, 0x8d, 0x9b, 0x08, 0xeb, 0x43, 0xd8, 0xc2, 0x53, 0xa5, 0x90, 0x69, 0x5d, 0xe7, 0x2b, + 0x45, 0x0f, 0x61, 0x3b, 0x66, 0x7c, 0xa6, 0xef, 0x7a, 0x04, 0xe5, 0xec, 0xbc, 0xdc, 0xdf, 0x85, + 0x2b, 0x7a, 0x39, 0x95, 0xde, 0x99, 0x27, 0xe7, 0x3d, 0x1e, 0x48, 0x1e, 0xbd, 0x86, 0xbf, 0x0d, + 0x25, 0xcf, 0xd5, 0xe6, 0x6d, 0x52, 0xf5, 0x68, 0xf5, 0x75, 0x39, 0xcd, 0x4b, 0xe8, 0x3a, 0x0e, + 0xc7, 0xbc, 0x3d, 0xaf, 0x94, 0x81, 0xce, 0xcb, 0xbc, 0x94, 0xbe, 0x27, 0x26, 0x9e, 0x10, 0x17, + 0x10, 0xf3, 0x4d, 0x01, 0x9a, 0x4a, 0xce, 0xa3, 0x30, 0x3c, 0x9d, 0xb0, 0xe8, 0x74, 0x3d, 0xe3, + 0x2c, 0xf2, 0x8d, 0x19, 0xd4, 0x63, 0x32, 0xac, 0x96, 0x32, 0xc3, 0xea, 0x75, 0xa8, 0x63, 0xa3, + 0xb1, 0x15, 0xad, 0x4e, 0xe4, 0x1a, 0x22, 0x46, 0x91, 0x9f, 0x9d, 0x38, 0x36, 0xf2, 0x13, 0xc7, + 0x5b, 0x00, 0x2e, 0xf7, 0xb9, 0x9a, 0xdc, 0x98, 0xc4, 0x44, 0x2e, 0xd3, 0xba, 0xc1, 0x74, 0xa5, + 0xf5, 0x53, 0x78, 0x53, 0x69, 0x38, 0x08, 0xc4, 0x48, 0xf0, 0x48, 0xbd, 0x48, 0xaf, 0xe9, 0x6b, + 0x54, 0xdd, 0x81, 0xda, 0xcc, 0xd0, 0x19, 0x7d, 0x13, 0x18, 0xb7, 0xe6, 0x31, 0xf3, 0x70, 0x48, + 0xd7, 0x15, 0xa8, 0x8a, 0xf0, 0x5e, 0x6e, 0x20, 0x2a, 0xe7, 0xd4, 0xb3, 0x9e, 0xe8, 0xe4, 0xeb, + 0xf9, 0x9c, 0x45, 0x8f, 0x3d, 0x21, 0xc3, 0x68, 0x9e, 0x2d, 0x4b, 0x85, 0x5c, 0x59, 0x7a, 0x0b, + 0xc0, 0x51, 0x84, 0xfa, 0x5b, 0x8a, 0xfa, 0x5b, 0x0c, 0xa6, 0x2b, 0xad, 0x3f, 0x15, 0x80, 0x28, + 0x61, 0xe6, 0xea, 0xe9, 0xd0, 0x73, 0xd4, 0xba, 0xb1, 0x72, 0xa5, 0xca, 0xec, 0xac, 0xc5, 0x35, + 0x3b, 0x6b, 0x09, 0x37, 0x82, 0xa5, 0x9d, 0xb5, 0x8c, 0xe8, 0x78, 0x67, 0xbd, 0x0e, 0x75, 0x1c, + 0x01, 0x70, 0x69, 0xd5, 0x3b, 0x04, 0x2e, 0xad, 0x47, 0x2b, 0x97, 0xd6, 0x0a, 0x12, 0xac, 0x59, + 0x5a, 0xab, 0xd9, 0xa5, 0x75, 0x0c, 0x97, 0x97, 0xbf, 0x44, 0xac, 0xdf, 0xcb, 0x3f, 0x82, 0xda, + 0xd4, 0x10, 0x99, 0x62, 0x73, 0x23, 0x9f, 0xe7, 0x79, 0x49, 0x34, 0xa1, 0xb6, 0x7e, 0x53, 0x84, + 0x46, 0xe6, 0x42, 0x68, 0x8d, 0xdf, 0x3b, 0x50, 0x35, 0xe5, 0x3c, 0xb6, 0x97, 0x01, 0xb3, 0x2a, + 0x95, 0x72, 0x2a, 0xe5, 0x9b, 0x95, 0x1e, 0x1d, 0x32, 0xcd, 0x8a, 0x40, 0x79, 0xca, 0xe4, 0xd8, + 0x34, 0x1e, 0x7c, 0x4e, 0x3c, 0x55, 0xc9, 0x78, 0x2a, 0x7b, 0x17, 0xa3, 0x47, 0xf6, 0xe4, 0x2e, + 0x66, 0x1b, 0x36, 0xf8, 0x24, 0xfc, 0xd2, 0xc3, 0x7d, 0xbf, 0x4e, 0x35, 0xa0, 0x5c, 0xf5, 0x8a, + 0xf9, 0x3e, 0x97, 0x66, 0x86, 0x37, 0x90, 0x12, 0xae, 0xc2, 0xc8, 0x34, 0x73, 0x7c, 0x46, 0xb7, + 0x7a, 0xae, 0xcb, 0x03, 0xd3, 0xc4, 0x0d, 0xb4, 0x7e, 0x80, 0xb7, 0xbe, 0x36, 0xe6, 0x8a, 0xef, + 0xf1, 0x56, 0x9b, 0x2b, 0x63, 0x94, 0xe2, 0xca, 0xfb, 0x93, 0x52, 0x7e, 0xbd, 0xcf, 0xac, 0xd1, + 0xf8, 0x8c, 0x13, 0x2b, 0x8f, 0xbc, 0x33, 0xee, 0xda, 0x2f, 0xa3, 0x70, 0x62, 0xac, 0xd4, 0x30, + 0xb8, 0x4f, 0xa3, 0x70, 0x42, 0x1e, 0xc0, 0x8e, 0x9e, 0x2d, 0x05, 0x77, 0x6d, 0x3c, 0x30, 0x2b, + 0x32, 0x5e, 0xf0, 0xe8, 0x44, 0xbf, 0x8a, 0x93, 0xa6, 0xe0, 0x6e, 0x3f, 0x39, 0xdf, 0x53, 0xc7, + 0x7a, 0x5f, 0x0a, 0x9c, 0x58, 0xbc, 0x36, 0x2c, 0x68, 0x14, 0x4a, 0xff, 0x3f, 0xa8, 0x99, 0x36, + 0x12, 0xb7, 0xef, 0x35, 0x17, 0x88, 0x09, 0x99, 0x35, 0xd3, 0x3d, 0x23, 0x73, 0xe5, 0x49, 0xee, + 0xa2, 0x1d, 0xf0, 0x7a, 0xb4, 0xb0, 0xea, 0x16, 0xd2, 0xd0, 0xd2, 0x98, 0x4a, 0xbd, 0xd6, 0xdc, + 0xa3, 0xc5, 0x71, 0xbc, 0xcc, 0xa1, 0x4e, 0x69, 0x42, 0x66, 0xfd, 0xa3, 0xa0, 0x4b, 0xc8, 0x11, + 0x3b, 0x4b, 0xe6, 0x80, 0x6c, 0xbc, 0x16, 0xf2, 0xf1, 0xba, 0xea, 0x06, 0xeb, 0x06, 0xd4, 0x5f, + 0xb2, 0xb3, 0x70, 0x16, 0x79, 0x52, 0xbb, 0xa6, 0x46, 0x53, 0xc4, 0x6b, 0x6a, 0xeb, 0x6d, 0x68, + 0xea, 0xc9, 0xde, 0xce, 0xa6, 0x70, 0x43, 0xe3, 0xf4, 0xea, 0xf1, 0xdf, 0x70, 0x49, 0x17, 0x45, + 0x31, 0x0e, 0x23, 0x89, 0x53, 0x98, 0x30, 0xf1, 0xba, 0x85, 0x07, 0x47, 0x0a, 0xaf, 0xa6, 0x31, + 0xa1, 0xfa, 0x00, 0x0f, 0x84, 0xb9, 0xcb, 0x53, 0x8f, 0x2a, 0x8e, 0x3c, 0x61, 0x4b, 0x2e, 0xe2, + 0xb0, 0xad, 0x78, 0xe2, 0x98, 0x0b, 0xf9, 0xa4, 0x5c, 0x2b, 0xb7, 0x37, 0xac, 0x5f, 0x15, 0x74, + 0xf5, 0x5e, 0x1a, 0x64, 0xd7, 0x84, 0xe5, 0xe2, 0x58, 0xa7, 0x6d, 0x90, 0x1b, 0xeb, 0x06, 0x70, + 0x73, 0xac, 0xcb, 0xb0, 0xcd, 0x22, 0x67, 0xec, 0x9d, 0x71, 0x5b, 0xcc, 0xa6, 0x53, 0xa5, 0x3b, + 0x0f, 0xd8, 0x0b, 0xdf, 0x2c, 0x31, 0x35, 0x7a, 0xc3, 0x90, 0x75, 0x35, 0xd5, 0x91, 0x26, 0x1a, + 0x68, 0x1a, 0xeb, 0xb7, 0x05, 0x1d, 0x0c, 0xc7, 0x6a, 0x0b, 0x55, 0x7b, 0x2d, 0x8f, 0xce, 0x79, + 0x6f, 0xf2, 0x31, 0x54, 0xcc, 0x22, 0xab, 0xde, 0xd3, 0x5a, 0x1c, 0xfe, 0x33, 0x02, 0x77, 0x8f, + 0xd3, 0x15, 0x97, 0x1a, 0x26, 0xeb, 0x3e, 0x34, 0x32, 0x68, 0xd2, 0x80, 0xea, 0x68, 0xb8, 0x3f, + 0x3c, 0xf8, 0x7c, 0xd8, 0x7e, 0x43, 0x01, 0xc7, 0x74, 0x74, 0x74, 0x3c, 0xe8, 0xb7, 0x0b, 0xe4, + 0x12, 0x6c, 0x8e, 0x86, 0x08, 0x7e, 0x7e, 0x40, 0x8f, 0x1f, 0x7f, 0xd1, 0x2e, 0x5a, 0xdf, 0x94, + 0xf4, 0x12, 0xf8, 0x3c, 0xb3, 0x64, 0x9b, 0xe1, 0x74, 0x8d, 0xf2, 0x04, 0xca, 0x98, 0x3f, 0x26, + 0x98, 0xd4, 0xb3, 0xfa, 0x20, 0x19, 0x9a, 0x04, 0x2f, 0xca, 0x50, 0x05, 0x97, 0x33, 0x56, 0x25, + 0x28, 0x38, 0x89, 0x73, 0x3c, 0x45, 0x28, 0x97, 0x98, 0xb5, 0x45, 0x37, 0x35, 0x73, 0xb7, 0x91, + 0xe0, 0xba, 0x78, 0x6b, 0x18, 0x71, 0x31, 0x0d, 0x03, 0x11, 0x57, 0xc6, 0x04, 0x56, 0x45, 0x36, + 0xe2, 0x53, 0xdf, 0xd3, 0xcc, 0x3a, 0xfe, 0xea, 0x06, 0xd3, 0x95, 0x84, 0xaf, 0xbe, 0x4c, 0xa8, + 0xa1, 0x65, 0xff, 0x3f, 0x6f, 0xd9, 0x15, 0x5f, 0xbd, 0xfb, 0x7c, 0xe9, 0xba, 0x61, 0xe5, 0x15, + 0x84, 0xf6, 0x61, 0x3d, 0x19, 0xe3, 0xbe, 0x0f, 0x64, 0x99, 0x73, 0xc9, 0x17, 0x87, 0x83, 0x61, + 0x7f, 0x6f, 0xf8, 0x59, 0xbb, 0x40, 0x9a, 0x50, 0xeb, 0xf6, 0x7a, 0x83, 0x43, 0xe5, 0x99, 0xa2, + 0x82, 0xfa, 0x83, 0xde, 0xd3, 0xbd, 0xe1, 0xa0, 0xdf, 0x2e, 0x29, 0xa8, 0xd7, 0x1d, 0xf6, 0x06, + 0x4f, 0x07, 0xfd, 0x76, 0xd9, 0xfa, 0x6b, 0x41, 0xcf, 0x77, 0xbd, 0xdc, 0xae, 0xdf, 0xe7, 0x8e, + 0x27, 0xd6, 0x5f, 0x22, 0xde, 0x80, 0xba, 0xb1, 0xe7, 0x5e, 0x1c, 0x69, 0x29, 0x82, 0xfc, 0x10, + 0xb6, 0x5c, 0xc3, 0x6f, 0xe7, 0x22, 0xef, 0x83, 0xc5, 0x49, 0x79, 0xd5, 0x2b, 0x77, 0xe3, 0x07, + 0x63, 0x9e, 0x96, 0x9b, 0x83, 0xad, 0xf7, 0xa1, 0x95, 0xa7, 0xc8, 0x7d, 0xec, 0x1b, 0xb9, 0x8f, + 0x2d, 0x58, 0x7f, 0x2c, 0xc2, 0xd6, 0xc2, 0x1f, 0x68, 0xeb, 0x7b, 0xfe, 0xe2, 0xad, 0x46, 0x71, + 0xe9, 0x56, 0x83, 0xbc, 0x0f, 0x24, 0x4b, 0x62, 0x67, 0xd7, 0xc3, 0x76, 0x86, 0x50, 0xd7, 0xaa, + 0xec, 0x10, 0x51, 0xbe, 0xc8, 0x10, 0x41, 0x1e, 0x42, 0x53, 0x84, 0x8e, 0xc7, 0x7c, 0xdb, 0xf7, + 0x82, 0xd3, 0xf8, 0x5f, 0xcb, 0x85, 0xff, 0xc2, 0x8e, 0x90, 0xe2, 0xa9, 0x22, 0xa0, 0x0d, 0x91, + 0x02, 0xe4, 0x7b, 0xb0, 0xad, 0x36, 0xd4, 0x78, 0x90, 0xb4, 0xdd, 0xe4, 0x7f, 0xca, 0xd2, 0xf2, + 0xd2, 0xbe, 0x34, 0xa9, 0x52, 0xc2, 0x17, 0x51, 0xc2, 0x12, 0x00, 0x94, 0xbd, 0x32, 0x1b, 0x48, + 0x76, 0xda, 0x2b, 0xe4, 0xa7, 0xbd, 0x7d, 0x68, 0x98, 0xbf, 0xa4, 0x8f, 0x55, 0x0b, 0x2e, 0xa2, + 0xe3, 0xff, 0x2b, 0x7d, 0x63, 0x37, 0xfd, 0x13, 0xfb, 0x99, 0xf9, 0x0f, 0xdb, 0x08, 0xdd, 0x55, + 0x0c, 0x34, 0xcb, 0x6d, 0xfd, 0xba, 0x00, 0x2d, 0xa5, 0x62, 0xe6, 0xcd, 0xdf, 0x86, 0x46, 0x94, + 0x40, 0xf1, 0x2a, 0xb9, 0x9d, 0xca, 0x4f, 0x49, 0x69, 0x96, 0x90, 0xdc, 0x83, 0x6d, 0x31, 0x7b, + 0x61, 0x7a, 0xac, 0x78, 0x22, 0xc2, 0xe0, 0xd1, 0x5c, 0xf2, 0x78, 0xf8, 0x5a, 0x79, 0x46, 0xde, + 0x87, 0x4b, 0xf1, 0xf5, 0x45, 0xca, 0xa0, 0xef, 0x74, 0x96, 0x0f, 0xac, 0xaf, 0x0b, 0xc9, 0x20, + 0xa3, 0xfa, 0x28, 0x2e, 0x21, 0x49, 0x88, 0xa9, 0xc7, 0x95, 0x9d, 0xf2, 0x0a, 0x54, 0xcc, 0x45, + 0xa8, 0xee, 0x02, 0x06, 0xca, 0x06, 0x69, 0x39, 0x17, 0xa4, 0x37, 0xa0, 0x9e, 0xde, 0x03, 0x6c, + 0xe0, 0x6a, 0x94, 0x22, 0xd2, 0x7c, 0xad, 0x64, 0x87, 0xdf, 0x3f, 0x14, 0xe1, 0x52, 0x46, 0x35, + 0xb5, 0x85, 0x85, 0x01, 0xb9, 0x0f, 0x15, 0x86, 0x4f, 0xa8, 0x63, 0xeb, 0x9e, 0xb5, 0x72, 0x30, + 0xd0, 0xc4, 0xbb, 0xfa, 0x87, 0x1a, 0x0e, 0xf2, 0x0e, 0x6c, 0x86, 0xbe, 0x6b, 0x48, 0x46, 0x49, + 0xbf, 0xc9, 0x23, 0xcd, 0xb4, 0xa2, 0x20, 0xb3, 0x6c, 0xaf, 0x99, 0x3d, 0x62, 0x2a, 0xd5, 0x7f, + 0x2b, 0x46, 0xbb, 0x4b, 0xb0, 0xb9, 0x3f, 0xf8, 0xa2, 0xd7, 0xa5, 0x7d, 0xbb, 0xdb, 0xef, 0x63, + 0x6a, 0x13, 0x68, 0x75, 0x7b, 0xbd, 0x83, 0xd1, 0xf0, 0xf8, 0xc8, 0xe0, 0x0a, 0xe4, 0x32, 0x6c, + 0xc5, 0x64, 0xfd, 0xc1, 0xd3, 0x81, 0x2e, 0x78, 0xdb, 0xd0, 0x4e, 0x08, 0xe9, 0xe0, 0xd9, 0xc1, + 0x73, 0x2c, 0x7c, 0x00, 0x95, 0xa7, 0x07, 0xbd, 0x7d, 0x55, 0xf6, 0x54, 0x95, 0x18, 0x0d, 0x0d, + 0xb4, 0x41, 0xb6, 0xa0, 0x31, 0xda, 0xeb, 0xdb, 0xa3, 0xc3, 0x7e, 0x57, 0x09, 0xa8, 0x90, 0x36, + 0x34, 0x87, 0xdd, 0x67, 0x03, 0xbb, 0xf7, 0xb8, 0x3b, 0xfc, 0x6c, 0xd0, 0x6f, 0x57, 0xad, 0x1f, + 0xe9, 0xf6, 0x9b, 0x49, 0x39, 0xf2, 0xe1, 0x42, 0x8e, 0x2e, 0xc5, 0x62, 0x4a, 0x9c, 0x4f, 0xcf, + 0xc4, 0x49, 0xc5, 0x8c, 0x93, 0x1e, 0x6d, 0xfe, 0xa0, 0xb1, 0x7b, 0xf7, 0x41, 0xcc, 0xfc, 0xa2, + 0x82, 0x4f, 0x1f, 0xfc, 0x33, 0x00, 0x00, 0xff, 0xff, 0x35, 0x39, 0xcc, 0x36, 0x3a, 0x22, 0x00, + 0x00, } diff --git a/protocol/protobuf/pairing.proto b/protocol/protobuf/pairing.proto index efe21ae31..ea45a2aaa 100644 --- a/protocol/protobuf/pairing.proto +++ b/protocol/protobuf/pairing.proto @@ -1,5 +1,6 @@ syntax = "proto3"; +import "chat_identity.proto"; import "sync_settings.proto"; import 'application_metadata_message.proto'; @@ -322,7 +323,7 @@ message BackedUpProfile { string display_name = 2; uint64 display_name_clock = 3; repeated SyncProfilePicture pictures = 4; - repeated SyncSocialLinkSetting social_link_settings = 5; + SyncSocialLinks social_links = 5; repeated SyncEnsUsernameDetail ens_username_details = 6; } @@ -365,8 +366,7 @@ message SyncKeycardAction { } } -message SyncSocialLinkSetting { - string text = 1; - string url = 2; - uint64 clock = 3; -} +message SyncSocialLinks { + repeated SocialLink social_links = 1; + uint64 clock = 2; +} \ No newline at end of file diff --git a/protocol/v1/status_message.go b/protocol/v1/status_message.go index d4df847b9..449332e48 100644 --- a/protocol/v1/status_message.go +++ b/protocol/v1/status_message.go @@ -320,8 +320,8 @@ func (m *StatusMessage) HandleApplication() error { return m.unmarshalProtobufData(new(protobuf.SyncSavedAddress)) case protobuf.ApplicationMetadataMessage_SYNC_KEYCARD_ACTION: return m.unmarshalProtobufData(new(protobuf.SyncKeycardAction)) - case protobuf.ApplicationMetadataMessage_SYNC_SOCIAL_LINK_SETTING: - return m.unmarshalProtobufData(new(protobuf.SyncSocialLinkSetting)) + case protobuf.ApplicationMetadataMessage_SYNC_SOCIAL_LINKS: + return m.unmarshalProtobufData(new(protobuf.SyncSocialLinks)) case protobuf.ApplicationMetadataMessage_SYNC_ENS_USERNAME_DETAIL: return m.unmarshalProtobufData(new(protobuf.SyncEnsUsernameDetail)) case protobuf.ApplicationMetadataMessage_SYNC_KEYPAIR: diff --git a/protocol/wakusync/profile_response.go b/protocol/wakusync/profile_response.go index 0f8aa3a32..30ee6d3f1 100644 --- a/protocol/wakusync/profile_response.go +++ b/protocol/wakusync/profile_response.go @@ -9,7 +9,7 @@ import ( type BackedUpProfile struct { DisplayName string `json:"displayName,omitempty"` Images []images.IdentityImage `json:"images,omitempty"` - SocialLinks identity.SocialLinks `json:"socialLinks,omitempty"` + SocialLinks []*identity.SocialLink `json:"socialLinks,omitempty"` EnsUsernameDetails []*ens.UsernameDetail `json:"ensUsernameDetails,omitempty"` } @@ -21,7 +21,7 @@ func (sfwr *WakuBackedUpDataResponse) SetImages(images []images.IdentityImage) { sfwr.Profile.Images = images } -func (sfwr *WakuBackedUpDataResponse) SetSocialLinks(socialLinks identity.SocialLinks) { +func (sfwr *WakuBackedUpDataResponse) SetSocialLinks(socialLinks []*identity.SocialLink) { sfwr.Profile.SocialLinks = socialLinks } diff --git a/server/pairing/sync_device_test.go b/server/pairing/sync_device_test.go index 309bbddbe..2085f7064 100644 --- a/server/pairing/sync_device_test.go +++ b/server/pairing/sync_device_test.go @@ -167,12 +167,12 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() { }) require.NoError(s.T(), err) // generate social link - err = clientBackend.Messenger().SetSocialLinks(&identity.SocialLinks{{Text: identity.GithubID, URL: socialLinkURL, Clock: 1}}) + socialLinksToAdd := identity.SocialLinks{{Text: identity.GithubID, URL: socialLinkURL}} + err = clientBackend.Messenger().AddOrReplaceSocialLinks(socialLinksToAdd) require.NoError(s.T(), err) // generate ens username err = clientBackend.StatusNode().EnsService().API().Add(ctx, ensChainID, ensUsername) require.NoError(s.T(), err) - clientActiveAccount, err := clientBackend.GetActiveAccount() require.NoError(s.T(), err) clientKeystorePath := filepath.Join(clientTmpDir, keystoreDir, clientActiveAccount.KeyUID) @@ -196,9 +196,10 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() { require.NoError(s.T(), err) require.Equal(s.T(), 1, len(bookmarks)) require.Equal(s.T(), "status.im", bookmarks[0].Name) - serverSocialLink, err := serverBackend.Messenger().GetSocialLink(identity.GithubID) + serverSocialLinks, err := serverBackend.Messenger().GetSocialLinks() require.NoError(s.T(), err) - require.Equal(s.T(), socialLinkURL, serverSocialLink.URL) + require.Equal(s.T(), 1, len(serverSocialLinks)) + require.True(s.T(), socialLinksToAdd.Equal(serverSocialLinks)) uds, err := serverBackend.StatusNode().EnsService().API().GetEnsUsernames(ctx) require.NoError(s.T(), err) require.Equal(s.T(), 1, len(uds)) @@ -282,9 +283,9 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() { // generate social link serverMessenger := serverBackend.Messenger() - err = serverMessenger.SetSocialLinks(&identity.SocialLinks{{Text: identity.GithubID, URL: socialLinkURL, Clock: 1}}) + socialLinksToAdd := identity.SocialLinks{{Text: identity.GithubID, URL: socialLinkURL}} + err = serverMessenger.AddOrReplaceSocialLinks(socialLinksToAdd) require.NoError(s.T(), err) - // generate ens username err = serverBackend.StatusNode().EnsService().API().Add(ctx, ensChainID, ensUsername) require.NoError(s.T(), err) @@ -332,9 +333,10 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() { require.NoError(s.T(), err) require.Equal(s.T(), 1, len(bookmarks)) require.Equal(s.T(), "status.im", bookmarks[0].Name) - clientSocialLink, err := clientMessenger.GetSocialLink(identity.GithubID) + clientSocialLinks, err := clientMessenger.GetSocialLinks() require.NoError(s.T(), err) - require.Equal(s.T(), socialLinkURL, clientSocialLink.URL) + require.Equal(s.T(), 1, len(clientSocialLinks)) + require.True(s.T(), socialLinksToAdd.Equal(clientSocialLinks)) uds, err := clientBackend.StatusNode().EnsService().API().GetEnsUsernames(ctx) require.NoError(s.T(), err) require.Equal(s.T(), 1, len(uds)) diff --git a/services/accounts/settings.go b/services/accounts/settings.go index 388e80c72..5b9c227e7 100644 --- a/services/accounts/settings.go +++ b/services/accounts/settings.go @@ -2,6 +2,7 @@ package accounts import ( "context" + "errors" "github.com/status-im/status-go/multiaccounts/accounts" "github.com/status-im/status-go/multiaccounts/settings" @@ -168,6 +169,15 @@ func (api *SettingsAPI) GetSocialLinks() (identity.SocialLinks, error) { return api.db.GetSocialLinks() } -func (api *SettingsAPI) SetSocialLinks(socialLinks identity.SocialLinks) error { - return (*api.messenger).SetSocialLinks(&socialLinks) +func (api *SettingsAPI) AddOrReplaceSocialLinks(links identity.SocialLinks) error { + for _, link := range links { + if len(link.Text) == 0 { + return errors.New("`Text` field of a social link must be set") + } + if len(link.URL) == 0 { + return errors.New("`URL` field of a social link must be set") + } + } + + return (*api.messenger).AddOrReplaceSocialLinks(links) }