darkwing/server/services/browser_profile_services/config/
mod.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
//! Configuration module for browser profile services.
//!
//! This module contains the core configuration types and implementations for
//! managing browser profiles, including fingerprinting data and
//! browser-specific settings.

mod additional;
pub(super) mod consts;
mod dolphin_specific;
mod fonts;
mod geolocation;
mod hints;
mod media_devices;
mod navigator;
mod passwords;
mod ports;
mod screen;
mod synchronize;
mod videocard;
mod voices;

pub use additional::Additional;
pub use dolphin_specific::DolphinSpecific;
pub use fonts::Fonts;
pub use geolocation::Geolocation;
pub use hints::Hints;
pub use media_devices::MediaDevices;
pub use navigator::Navigator;
use passwords::Passwords;
pub use ports::PortsProtection;
pub use screen::Screen;
use serde::Deserialize;
pub use serde::Serialize;
pub use synchronize::Synchronize;
pub use videocard::{WebGL, WebGPU};
use voices::SpeechVoices;
pub use voices::Voices;

use crate::server::{
  dtos::{
    browser_profile_dto::BrowserProfileFullData, start_dto::StartRequest,
  },
  error::{AppResult, Error},
};

/// Trait for converting browser profile data and start request into
/// configuration types.
///
/// This trait is implemented by various configuration components to construct
/// themselves from the browser profile data and start request information.
trait FromStartRequest<T> {
  /// Creates a new instance from the provided browser profile data and start
  /// request.
  ///
  /// # Arguments
  /// * `bp` - The full browser profile data
  /// * `request` - The start request containing runtime configuration
  /// * `navigator` - The navigator configuration
  /// * `screen` - The screen configuration
  /// * `token` - Authentication token
  ///
  /// # Returns
  /// * `Result<T, Error>` - The constructed configuration instance or an error
  fn from_start_request(
    bp: &BrowserProfileFullData,
    request: &StartRequest,
    navigator: &Navigator,
    screen: &Screen,
    token: &str,
  ) -> Result<T, Error>;
}

/// JSON configuration for browser fingerprinting and behavior settings.
///
/// This struct contains all the configuration data needed to properly
/// fingerprint and configure a browser instance, including hardware, software,
/// and network settings.
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct BrowserProfileConfig {
  /// Additional browser configuration settings
  pub additional: Additional,

  /// Geolocation settings
  pub geolocation: Geolocation,

  /// Screen and display configuration
  pub screen: Screen,

  /// Navigator and browser identification settings
  pub navigator: Navigator,

  /// Client hints configuration
  pub hints: Hints,

  /// WebGL configuration and capabilities
  pub webgl: WebGL,

  /// WebGPU configuration and capabilities (optional)
  #[serde(skip_serializing_if = "Option::is_none")]
  pub webgpu: Option<WebGPU>,

  /// Legacy voice configuration (deprecated)
  /// Will be replaced by `speech_voices` in future versions
  pub voices: Voices,

  /// Speech synthesis voices configuration
  pub speech_voices: SpeechVoices,

  /// Font configuration (deprecated)
  pub fonts: Fonts,

  /// Media devices configuration
  pub media_devices: MediaDevices,

  /// Network ports protection settings
  pub ports_protection: PortsProtection,

  /// Dolphin-specific configuration
  pub dolphin: DolphinSpecific,

  /// Browser synchronization settings
  #[serde(rename = "synhronize")]
  pub synchronize: Synchronize,

  /// Password store configuration (optional)
  #[serde(rename = "passwords_store")]
  #[serde(skip_serializing_if = "Option::is_none")]
  pub passwords: Option<Passwords>,
}

impl BrowserProfileConfig {
  /// Creates a new browser profile configuration.
  ///
  /// # Arguments
  /// * `bp` - The full browser profile data
  /// * `request` - The start request containing runtime configuration
  /// * `token` - Authentication token
  ///
  /// # Returns
  /// * `AppResult<Self>` - The constructed configuration or an error
  pub fn new(
    bp: &BrowserProfileFullData,
    request: StartRequest,
    token: String,
  ) -> AppResult<Self> {
    let navigator = Navigator::from_start_request(
      bp,
      &request,
      &Default::default(),
      &Default::default(),
      &token,
    )?;

    let screen = Screen::from_start_request(
      bp,
      &request,
      &Default::default(),
      &Default::default(),
      &token,
    )?;

    Ok(Self {
      synchronize: Synchronize::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      additional: Additional::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      geolocation: Geolocation::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      hints: Hints::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      webgl: WebGL::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      webgpu: Option::<WebGPU>::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      voices: Voices::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      speech_voices: SpeechVoices::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      fonts: Fonts::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      media_devices: MediaDevices::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      ports_protection: PortsProtection::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      dolphin: DolphinSpecific::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      passwords: Option::<Passwords>::from_start_request(
        bp, &request, &navigator, &screen, &token,
      )?,
      navigator,
      screen,
    })
  }

  /// Serializes the configuration to a JSON string.
  ///
  /// # Returns
  /// * `Result<String, Error>` - The JSON string or a serialization error
  pub fn json(&self) -> Result<String, Error> {
    serde_json::to_string(self).map_err(Error::SerdeJson)
  }
}

#[cfg(test)]
mod tests {
  use super::*;
  use pretty_assertions::assert_eq;
  use voices::Voice;

  #[test]
  fn test_config_basic_serialize() {
    let config = BrowserProfileConfig { additional: Additional { is_chrome_icon: false, accelerated_2d_canvas: true, profile_name: "manual geo".to_string(), rect_noise: 1.0, is_webrtc_enabled: true, webrtc_ip: "77.246.103.64".to_string(), is_windows: true, is_win10: true,is_fake_media: false, profile_icon: 0, is_canvas_blocked: false, ostype: 0, canvas_noise_seed: 0, webgl_noise_seed: 0,  extensions_new_naming: true, smart_paste_shift: 1.05, is_real_webrtc: false, is_webrtc_connection_enabled: false, is_webrtc_realtime_ip_update_enabled: true, should_show_profile_name: true }, geolocation: Geolocation { install: true, latitude: 52.3759, longitude: 4.8975, accuracy: 10 }, screen: Screen { is_real: true, width: 1440, height: 900, dpr: 1.0, depth: 24 }, navigator: Navigator { app_code_name: "Mozilla".to_string(), app_name: "Netscape".to_string(), connection: navigator::Connection { downlink: 10.2, effective_type: "4g".to_string(), rtt: 50, save_data: false }, device_memory: 8, do_not_track: false, hardware_concurrency: 4, app_locale: "nl".to_string(), locale: "nl".to_string(), languages: vec!["nl-BE".to_string(), "nl".to_string(), "en-US".to_string(), "en".to_string()], accept_languages: "nl-BE,nl;q=0.9;en-US,en;q=0.8".to_string(), platform: "Win32".to_string(), product: "Gecko".to_string(), product_sub: "20030107".to_string(), user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36".to_string(), vendor: "Google Inc.".to_string(), vendor_sub: "".to_string(), timezone: "Europe/Amsterdam".to_string() }, hints: Hints { architecture: "x86".to_string(), bitness: "64".to_string(), model: "".to_string(), platform: "Windows".to_string(), platform_version: "10.0.0".to_string(), ua_full_version: "130.0.6723.92".to_string(), mobile: false, ua_header: "\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"91\", \"Google Chrome\";v=\"91\"".to_string(), viewport_width: 1440 }, webgl: WebGL { unmasked_vendor: "Google Inc. (AMD)".to_string(), unmasked_renderer: "ANGLE (AMD, AMD FirePro M6100 Direct3D11 vs_5_0 ps_5_0, D3D11)".to_string(), extra_params: None }, webgpu: Some(WebGPU { vendor: "amd".to_string(), architecture: "gcn-2".to_string(), device: "".to_string(), description: "".to_string(), driver: "".to_string(), limits: videocard::WebGPULimits { max_bind_groups: 4, max_bindings_per_bind_group: 640, max_buffer_size: 2147483648, max_color_attachments_bytes_per_sample: 32, max_color_attachments: 8, max_compute_invocations_per_workgroup: 1024, max_compute_workgroup_size_x: 1024, max_compute_workgroup_size_y: 1024, max_compute_workgroup_size_z: 64, max_compute_workgroup_storage_size: 32768, max_compute_workgroups_per_dimension: 65535, max_dynamic_storage_buffers_per_pipeline_layout: 8, max_dynamic_uniform_buffers_per_pipeline_layout: 10, max_inter_stage_shader_components: 60, max_inter_stage_shader_variables: 16, max_sampled_textures_per_shader_stage: 16, max_samplers_per_shader_stage: 16, max_storage_buffer_binding_size: 2147483647, max_storage_buffers_per_shader_stage: 8, max_storage_textures_per_shader_stage: 8, max_texture_array_layers: 256, max_texture_dimension_1d: 8192, max_texture_dimension_2d: 8192, max_texture_dimension_3d: 2048, max_uniform_buffer_binding_size: 65536, max_uniform_buffers_per_shader_stage: 12, max_vertex_attributes: 16, max_vertex_buffer_array_stride: 2048, max_vertex_buffers: 8, min_storage_buffer_offset_alignment: 256, min_uniform_buffer_offset_alignment: 256 } }), voices: Voices(vec![Voice { language: "en-US".to_string(), name: "Microsoft David - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Mark - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Zira - English (United States)".to_string() }]), speech_voices: SpeechVoices { enabled: false, voices: Voices(vec![Voice { language: "en-US".to_string(), name: "Microsoft David - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Mark - English (United States)".to_string() }, Voice { language: "en-US".to_string(), name: "Microsoft Zira - English (United States)".to_string() }]) }, fonts: Fonts(vec![]), media_devices: MediaDevices { speaker: 0, microphone: 0, webcamera: 0, microphone_name: "".to_string(), webcamera_name: "".to_string() }, ports_protection: PortsProtection { enabled: true, blacklist: vec![3389, 5900, 5800, 7070, 6568, 5938, 63333, 5901, 5902, 5903, 5950, 5931, 5939, 6039, 5944, 6040, 5279, 2112] }, dolphin: DolphinSpecific { profile_id: 502826677, anty_token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiMGQ4YjYwYjY0MDJhMzY5NjY5Y2IxODhhNTQ0NTIwMWI4NTFlN2I0MTA1NTUwMmQ4NmUyODAxOTFmYzY3MzZmYTAxOTRjNDNkOWE1ZjAwYzgiLCJpYXQiOjE3MzEzNDIzNDEuMTUyMzY0LCJuYmYiOjE3MzEzNDIzNDEuMTUyMzY2LCJleHAiOjE3MzEzNDU5NDEuMTM0NjAxLCJzdWIiOiIxNTQiLCJzY29wZXMiOltdfQ.LMgdZ1fXVTuFeBKu8sg83eLpHqJcY_IwzdS5blOunhkUB2KEcpUHtgdyo6ns3S23noM6r7Rh9GmIag1M-FCLgTfCfXAjGOh7gG6JNVgtOiuMf0Vtd477o6gRKOrCLFrXoc3EsFaQ9YTn6239BIjCw2PbFFCo1dm6wHU94FQ91BIUcIjKOilBwXlxadFyoVOhMfEMRd08nJkrj2ZoFGakBc-6EWNOGZTw_rMAEgNmgyAXt66RCQQhxj7wp-f2qT-RXq9cXff_67rX8iR8LiWB6zVJ8srYtdHOuQrdWcm47v0AxF3MEG1MU1jo6IbnGiXVbyXTI_9Sh6OR1unkJDQxa5kzdKu9qm0jOkNh2Fjhnoox9IQMCZ9KRqV6lgeGQfqskxcQrJR76But8nOqvkyKXX0thOVHOtYebJgrJdsJBfCBU737_q0zqZgKOOnKd2JWJ9HmuSaJBzAXdw6G6uUTTXKxfthywCpFlH54pn36UHcDFyz4KNtLY_0So-RSK9kDanBgF6fnemwYM8JrjxuD6d8m6TFWlJMAIrWAjE6R3Z-wxEckAEv7mtDEMYfcfuPldeAzZ0aboJhoob-1LGe3b-YL9K1SaHNg1GVaWzA_DPm_fSdTJxYlKdjR6iSvrisW9ls7vzBsqeF_Uq6Glr9qgZkx4tX7yOj3S7hVZie_O-8".into(), dolphin_integration_token: "aHR0cHM6Ly9jbG91ZC5kb2xwaGluLnRlY2gvYXBpL3YxOjpleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpTVXpJMU5pSjkuZXlKaGRXUWlPaUl4SWl3aWFuUnBJam9pTVRrNU1HSm1ObVV6WkRNNE0yWXdORGswTldJelpUVmxaR1ZpT0RCa09HTmxObUV5WVdGalkyWmlaamxpTnpWak56aGtOamcwWW1ObFpXUTJZbU5pWmpFME1EUXdaRFprT0dOaE4ySTBZekVpTENKcFlYUWlPakUzTWpZd05qSTJNVGt1TmpRNE1qWXNJbTVpWmlJNk1UY3lOakEyTWpZeE9TNDJORGd5TmpJc0ltVjRjQ0k2TVRnNE16Z3lPVEF4T1M0Mk16azROallzSW5OMVlpSTZJamN3TlRGak5EQmpMV00wTm1FdE5EQmlOeTA0T0dJMUxUZzBNell4TWpjNVpUWXpZaUlzSW5OamIzQmxjeUk2VzExOS51bldyZ1hlSE83OUI3bkZzdUFma2FRWDYwT1MxelVwRDVUYmdBSW5wWFVxUmN2YmR6WGlJRVJydDVlU3VuOEpUWW1TNWIwa2RxdWUxSnY3MzVNRkc1Yi1Nb3A2Z1BuSWktUW9KTnpad252U1pJN1ZvMEtaWDhSTzIyVG1JV3p3QzZkaDZ2bkZaQWlmc0d4YWdtUE80ak1Tc2xQaGI1Z3l2NEU0NzRacjJUcnFOVlB1a3FBV3ZlMGFVa0MxUW9OY1lZWDZJVi1wTDN5dldtRHR4b3ltTVZJdGtzSF9WOERjcGFvOEhGVVFjXy1Dd3gtdGhqU0ZfSTFoY1pKZ1k4MXNCVllkWFd0UlhYQk10R0Y3VkdJaDFSUmJtN0VJUWxwck1jWlhzVFFpX2xlV0hfczd0T2NCUkhzU3liaFBPZXNPY0pUX2tBMGR5dW1oMzhxRW5xZzh0QmQ4QXNPMlVwT3RJLUVWc1VMbFdObUhDQ1JxWGNVWC10VkJCUWQxSVBnRjBna0RlOGxocVpfdmZrbHltTmZvOVZrdUlzYjBfY0VVdDVQTGh6UnVBWXA5WGNXelRTUDZpdTFfU2NoQTZnTG1DSC01LUEzZDhLNEFEWU9PLTNHOF9uOTdGZHRtcnVUb1JJMFpLMjNpOVhWRnRQNnJVVm5aVkRkbnAwOGpwdktpY25vRjQ2V2h5UV94bFRDNnVkNEFlTkVGaE9CVGJscnhDWDNudTNvTVBxZXBkdXBqSVBoeDEyMW9Vc2VuM3l2WUs5c0kxY3VVZlhReEpXRDd3Q2tGNmZLcWIxemZjNDdVVGJWN1lTUGtjSXZMVk5BOVZybF9Na3NRbWZkQldrbW1sN0ZXZGhtLVJNTGVUaWkyYmxDVWZUM2lZa1NqNjhZek1MSFZSd3FUdjZsMDo6Y2xvdWQ=".to_string(), base_url: "https://dolphin-anty-api.com".to_string(), api_version: "2022.1.1".to_string(), user_language: "ru".to_string() }, synchronize: Synchronize { session_name: "".to_string(), is_owned: false }, passwords: None };

    assert_eq!(
      config.json().unwrap(),
      r#"{"additional":{"is_chrome_icon":false,"accelerated_2d_canvas":true,"profile_name":"manual geo","rect_noise":1.0,"is_webrtc_enabled":true,"webrtc_ip":"77.246.103.64","is_windows":true,"is_win10":true,"canvas_config_1":5,"canvas_config_2":3,"webgl_config_1":0,"webgl_config_2":0,"is_fake_media":false,"profile_icon":0,"is_canvas_blocked":false,"ostype":0,"canvas_noise_seed":0,"webgl_noise_seed":0,"audio_noise_seed":0,"extensions_new_naming":true,"smart_paste_shift":1.05,"is_real_webrtc":false,"is_webrtc_connection_enabled":false,"is_webrtc_realtime_ip_update_enabled":true,"should_show_profile_name":true},"geolocation":{"install":true,"latitude":52.3759,"longitude":4.8975,"accuracy":10},"screen":{"is_real":true,"width":1440,"height":900,"dpr":1.0,"depth":24},"navigator":{"app_code_name":"Mozilla","app_name":"Netscape","connection":{"downlink":10.2,"effective_type":"4g","rtt":50,"save_data":false},"device_memory":8,"do_not_track":false,"hardware_concurrency":4,"app_locale":"nl","locale":"nl","languages":["nl-BE","nl","en-US","en"],"accept_languages":"nl-BE,nl;q=0.9;en-US,en;q=0.8","platform":"Win32","product":"Gecko","product_sub":"20030107","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36","vendor":"Google Inc.","vendor_sub":"","timezone":"Europe/Amsterdam"},"hints":{"architecture":"x86","bitness":"64","model":"","platform":"Windows","platform_version":"10.0.0","ua_full_version":"130.0.6723.92","mobile":false,"ua_header":"\" Not A;Brand\";v=\"99\", \"Chromium\";v=\"91\", \"Google Chrome\";v=\"91\"","viewport_width":1440},"webgl":{"unmasked_vendor":"Google Inc. (AMD)","unmasked_renderer":"ANGLE (AMD, AMD FirePro M6100 Direct3D11 vs_5_0 ps_5_0, D3D11)"},"webgpu":{"vendor":"amd","architecture":"gcn-2","device":"","description":"","driver":"","limits":{"max_bind_groups":4,"max_bindings_per_bind_group":640,"max_buffer_size":2147483648,"max_color_attachments_bytes_per_sample":32,"max_color_attachments":8,"max_compute_invocations_per_workgroup":1024,"max_compute_workgroup_size_x":1024,"max_compute_workgroup_size_y":1024,"max_compute_workgroup_size_z":64,"max_compute_workgroup_storage_size":32768,"max_compute_workgroups_per_dimension":65535,"max_dynamic_storage_buffers_per_pipeline_layout":8,"max_dynamic_uniform_buffers_per_pipeline_layout":10,"max_inter_stage_shader_components":60,"max_inter_stage_shader_variables":16,"max_sampled_textures_per_shader_stage":16,"max_samplers_per_shader_stage":16,"max_storage_buffer_binding_size":2147483647,"max_storage_buffers_per_shader_stage":8,"max_storage_textures_per_shader_stage":8,"max_texture_array_layers":256,"max_texture_dimension_1d":8192,"max_texture_dimension_2d":8192,"max_texture_dimension_3d":2048,"max_uniform_buffer_binding_size":65536,"max_uniform_buffers_per_shader_stage":12,"max_vertex_attributes":16,"max_vertex_buffer_array_stride":2048,"max_vertex_buffers":8,"min_storage_buffer_offset_alignment":256,"min_uniform_buffer_offset_alignment":256}},"voices":[{"lang":"en-US","name":"Microsoft David - English (United States)"},{"lang":"en-US","name":"Microsoft Mark - English (United States)"},{"lang":"en-US","name":"Microsoft Zira - English (United States)"}],"speech_voices":{"enabled":false,"voices":[{"lang":"en-US","name":"Microsoft David - English (United States)"},{"lang":"en-US","name":"Microsoft Mark - English (United States)"},{"lang":"en-US","name":"Microsoft Zira - English (United States)"}]},"fonts":[],"media_devices":{"speaker":0,"microphone":0,"webcamera":0,"microphone_name":"","webcamera_name":""},"ports_protection":{"enabled":true,"blacklist":[3389,5900,5800,7070,6568,5938,63333,5901,5902,5903,5950,5931,5939,6039,5944,6040,5279,2112]},"dolphin":{"profile_id":502826677,"anty_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiIyIiwianRpIjoiMGQ4YjYwYjY0MDJhMzY5NjY5Y2IxODhhNTQ0NTIwMWI4NTFlN2I0MTA1NTUwMmQ4NmUyODAxOTFmYzY3MzZmYTAxOTRjNDNkOWE1ZjAwYzgiLCJpYXQiOjE3MzEzNDIzNDEuMTUyMzY0LCJuYmYiOjE3MzEzNDIzNDEuMTUyMzY2LCJleHAiOjE3MzEzNDU5NDEuMTM0NjAxLCJzdWIiOiIxNTQiLCJzY29wZXMiOltdfQ.LMgdZ1fXVTuFeBKu8sg83eLpHqJcY_IwzdS5blOunhkUB2KEcpUHtgdyo6ns3S23noM6r7Rh9GmIag1M-FCLgTfCfXAjGOh7gG6JNVgtOiuMf0Vtd477o6gRKOrCLFrXoc3EsFaQ9YTn6239BIjCw2PbFFCo1dm6wHU94FQ91BIUcIjKOilBwXlxadFyoVOhMfEMRd08nJkrj2ZoFGakBc-6EWNOGZTw_rMAEgNmgyAXt66RCQQhxj7wp-f2qT-RXq9cXff_67rX8iR8LiWB6zVJ8srYtdHOuQrdWcm47v0AxF3MEG1MU1jo6IbnGiXVbyXTI_9Sh6OR1unkJDQxa5kzdKu9qm0jOkNh2Fjhnoox9IQMCZ9KRqV6lgeGQfqskxcQrJR76But8nOqvkyKXX0thOVHOtYebJgrJdsJBfCBU737_q0zqZgKOOnKd2JWJ9HmuSaJBzAXdw6G6uUTTXKxfthywCpFlH54pn36UHcDFyz4KNtLY_0So-RSK9kDanBgF6fnemwYM8JrjxuD6d8m6TFWlJMAIrWAjE6R3Z-wxEckAEv7mtDEMYfcfuPldeAzZ0aboJhoob-1LGe3b-YL9K1SaHNg1GVaWzA_DPm_fSdTJxYlKdjR6iSvrisW9ls7vzBsqeF_Uq6Glr9qgZkx4tX7yOj3S7hVZie_O-8","dolphin_integration_token":"aHR0cHM6Ly9jbG91ZC5kb2xwaGluLnRlY2gvYXBpL3YxOjpleUowZVhBaU9pSktWMVFpTENKaGJHY2lPaUpTVXpJMU5pSjkuZXlKaGRXUWlPaUl4SWl3aWFuUnBJam9pTVRrNU1HSm1ObVV6WkRNNE0yWXdORGswTldJelpUVmxaR1ZpT0RCa09HTmxObUV5WVdGalkyWmlaamxpTnpWak56aGtOamcwWW1ObFpXUTJZbU5pWmpFME1EUXdaRFprT0dOaE4ySTBZekVpTENKcFlYUWlPakUzTWpZd05qSTJNVGt1TmpRNE1qWXNJbTVpWmlJNk1UY3lOakEyTWpZeE9TNDJORGd5TmpJc0ltVjRjQ0k2TVRnNE16Z3lPVEF4T1M0Mk16azROallzSW5OMVlpSTZJamN3TlRGak5EQmpMV00wTm1FdE5EQmlOeTA0T0dJMUxUZzBNell4TWpjNVpUWXpZaUlzSW5OamIzQmxjeUk2VzExOS51bldyZ1hlSE83OUI3bkZzdUFma2FRWDYwT1MxelVwRDVUYmdBSW5wWFVxUmN2YmR6WGlJRVJydDVlU3VuOEpUWW1TNWIwa2RxdWUxSnY3MzVNRkc1Yi1Nb3A2Z1BuSWktUW9KTnpad252U1pJN1ZvMEtaWDhSTzIyVG1JV3p3QzZkaDZ2bkZaQWlmc0d4YWdtUE80ak1Tc2xQaGI1Z3l2NEU0NzRacjJUcnFOVlB1a3FBV3ZlMGFVa0MxUW9OY1lZWDZJVi1wTDN5dldtRHR4b3ltTVZJdGtzSF9WOERjcGFvOEhGVVFjXy1Dd3gtdGhqU0ZfSTFoY1pKZ1k4MXNCVllkWFd0UlhYQk10R0Y3VkdJaDFSUmJtN0VJUWxwck1jWlhzVFFpX2xlV0hfczd0T2NCUkhzU3liaFBPZXNPY0pUX2tBMGR5dW1oMzhxRW5xZzh0QmQ4QXNPMlVwT3RJLUVWc1VMbFdObUhDQ1JxWGNVWC10VkJCUWQxSVBnRjBna0RlOGxocVpfdmZrbHltTmZvOVZrdUlzYjBfY0VVdDVQTGh6UnVBWXA5WGNXelRTUDZpdTFfU2NoQTZnTG1DSC01LUEzZDhLNEFEWU9PLTNHOF9uOTdGZHRtcnVUb1JJMFpLMjNpOVhWRnRQNnJVVm5aVkRkbnAwOGpwdktpY25vRjQ2V2h5UV94bFRDNnVkNEFlTkVGaE9CVGJscnhDWDNudTNvTVBxZXBkdXBqSVBoeDEyMW9Vc2VuM3l2WUs5c0kxY3VVZlhReEpXRDd3Q2tGNmZLcWIxemZjNDdVVGJWN1lTUGtjSXZMVk5BOVZybF9Na3NRbWZkQldrbW1sN0ZXZGhtLVJNTGVUaWkyYmxDVWZUM2lZa1NqNjhZek1MSFZSd3FUdjZsMDo6Y2xvdWQ=","base_url":"https://dolphin-anty-api.com","api_version":"2022.1.1","user_language":"ru"},"synhronize":{"name_session":""}"#
    );
  }
}