Merge branch 'master' of ssh://git.freeswitch.org:222/freeswitch
This commit is contained in:
commit
48f5724c27
|
@ -262,7 +262,6 @@ SPAN_DECLARE(void) fax_modems_start_slow_modem(fax_modems_state_t *s, int which)
|
|||
case FAX_MODEM_V21_RX:
|
||||
fsk_rx_init(&s->v21_rx, &preset_fsk_specs[FSK_V21CH2], FSK_FRAME_MODE_SYNC, (put_bit_func_t) hdlc_rx_put_bit, &s->hdlc_rx);
|
||||
fsk_rx_signal_cutoff(&s->v21_rx, -39.09f);
|
||||
//fax_modems_set_rx_handler(s, (span_rx_handler_t) &fsk_rx, &s->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &s->v21_rx);
|
||||
s->rx_frame_received = FALSE;
|
||||
break;
|
||||
case FAX_MODEM_V21_TX:
|
||||
|
|
|
@ -1977,6 +1977,7 @@ static int restart_rx_modem(t38_gateway_state_t *s)
|
|||
fax_modems_start_fast_modem(t, s->core.fast_rx_modem, s->core.fast_bit_rate, s->core.short_train, FALSE);
|
||||
s->core.fast_rx_active = s->core.fast_rx_modem;
|
||||
break;
|
||||
case FAX_MODEM_V21_RX:
|
||||
default:
|
||||
//fax_modems_start_slow_modem(t, FAX_MODEM_V21_RX);
|
||||
fax_modems_set_rx_handler(t, (span_rx_handler_t) &fsk_rx, &t->v21_rx, (span_rx_fillin_handler_t) &fsk_rx_fillin, &t->v21_rx);
|
||||
|
|
|
@ -120,7 +120,7 @@ static const struct command_response_s fax_send_test_seq[] =
|
|||
//<TSI frame data>
|
||||
EXCHANGE("\xFF\x03\x43\x32\x32\x32\x32\x32\x32\x32\x32\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x10\x03", "\r\nCONNECT\r\n"),
|
||||
//<DCS frame data>
|
||||
EXCHANGE("\xFF\x13\x83\x01\xC6\x80\x80\x80\x80\x01\xFD\x13\x10\x03", "\r\nOK\r\n"),
|
||||
EXCHANGE("\xFF\x13\x83\x01\xC6\x80\x80\x80\x80\x01\x10\x03", "\r\nOK\r\n"),
|
||||
//Do a wait for timed silence at this point, or there won't be one in the tests
|
||||
EXCHANGE("AT+FRS=7\r", "\r\nOK\r\n"),
|
||||
//EXCHANGE("AT+FTS=8;+FTM=96\r", "\r\nCONNECT\r\n"),
|
||||
|
|
|
@ -484,7 +484,7 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
end_of_page = t4_rx_put(&receive_state, block, i);
|
||||
}
|
||||
else if (strlen(buf) > 2 && sscanf(buf, "T.30 Rx: %x %x", (unsigned int *) &bit, (unsigned int *) &bit) == 2)
|
||||
else if (strlen(buf) > 2 && sscanf(buf, "T.30 Rx: %x %x %x %x", (unsigned int *) &bit, (unsigned int *) &bit, (unsigned int *) &bit, (unsigned int *) &pkt_no) == 4)
|
||||
{
|
||||
/* Useful for breaking up ECM logs */
|
||||
if (pkt_no != last_pkt_no + 1)
|
||||
|
@ -575,7 +575,7 @@ int main(int argc, char *argv[])
|
|||
if (compression < 0 || (block_size == 0 && compression_step >= 3))
|
||||
break;
|
||||
}
|
||||
t4_tx_set_tx_encoding(&send_state, compression);
|
||||
t4_tx_set_tx_encoding(&send_state, compression, T4_COMPRESSION_NONE);
|
||||
t4_rx_set_rx_encoding(&receive_state, compression);
|
||||
|
||||
rows_read = 0;
|
||||
|
@ -716,7 +716,7 @@ int main(int argc, char *argv[])
|
|||
compression = compression_sequence[compression_step++];
|
||||
}
|
||||
}
|
||||
t4_tx_set_tx_encoding(&send_state, compression);
|
||||
t4_tx_set_tx_encoding(&send_state, compression, T4_COMPRESSION_NONE);
|
||||
t4_rx_set_rx_encoding(&receive_state, compression);
|
||||
|
||||
if (t4_tx_start_page(&send_state))
|
||||
|
|
|
@ -1716,26 +1716,36 @@ void sofia_event_callback(nua_event_t event,
|
|||
switch_core_session_t *session;
|
||||
|
||||
if ((session = switch_core_session_locate(sofia_private->uuid))) {
|
||||
private_object_t *tech_pvt = switch_core_session_get_private(session);
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "detaching session %s\n", sofia_private->uuid);
|
||||
set_call_id(tech_pvt, sip);
|
||||
int end = 0;
|
||||
|
||||
if (!zstr(tech_pvt->call_id)) {
|
||||
tech_pvt->sofia_private = NULL;
|
||||
tech_pvt->nh = NULL;
|
||||
sofia_set_flag(tech_pvt, TFLAG_BYE);
|
||||
switch_mutex_lock(profile->flag_mutex);
|
||||
switch_core_hash_insert(profile->chat_hash, tech_pvt->call_id, strdup(switch_core_session_get_uuid(session)));
|
||||
switch_mutex_unlock(profile->flag_mutex);
|
||||
switch_core_session_rwunlock(session);
|
||||
} else {
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
|
||||
if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND && !switch_channel_test_flag(channel, CF_ANSWERED)) {
|
||||
private_object_t *tech_pvt = switch_core_session_get_private(session);
|
||||
|
||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "detaching session %s\n", sofia_private->uuid);
|
||||
|
||||
if (!zstr(tech_pvt->call_id)) {
|
||||
tech_pvt->sofia_private = NULL;
|
||||
tech_pvt->nh = NULL;
|
||||
sofia_set_flag(tech_pvt, TFLAG_BYE);
|
||||
switch_mutex_lock(profile->flag_mutex);
|
||||
switch_core_hash_insert(profile->chat_hash, tech_pvt->call_id, strdup(switch_core_session_get_uuid(session)));
|
||||
switch_mutex_unlock(profile->flag_mutex);
|
||||
} else {
|
||||
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
|
||||
}
|
||||
|
||||
end++;
|
||||
}
|
||||
|
||||
switch_core_session_rwunlock(session);
|
||||
|
||||
if (end) {
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
}
|
||||
goto end;
|
||||
break;
|
||||
case nua_i_invite:
|
||||
case nua_i_register:
|
||||
case nua_i_options:
|
||||
|
|
|
@ -2884,6 +2884,10 @@ void sofia_glue_deactivate_rtp(private_object_t *tech_pvt)
|
|||
switch_status_t sofia_glue_tech_set_video_codec(private_object_t *tech_pvt, int force)
|
||||
{
|
||||
|
||||
if (!tech_pvt->video_rm_encoding) {
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
if (tech_pvt->video_read_codec.implementation && switch_core_codec_ready(&tech_pvt->video_read_codec)) {
|
||||
if (!force) {
|
||||
return SWITCH_STATUS_SUCCESS;
|
||||
|
@ -2902,10 +2906,7 @@ switch_status_t sofia_glue_tech_set_video_codec(private_object_t *tech_pvt, int
|
|||
}
|
||||
}
|
||||
|
||||
if (!tech_pvt->video_rm_encoding) {
|
||||
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(tech_pvt->session), SWITCH_LOG_ERROR, "Can't load codec with no name?\n");
|
||||
return SWITCH_STATUS_FALSE;
|
||||
}
|
||||
|
||||
|
||||
if (switch_core_codec_init(&tech_pvt->video_read_codec,
|
||||
tech_pvt->video_rm_encoding,
|
||||
|
@ -3077,6 +3078,7 @@ switch_status_t sofia_glue_tech_set_codec(private_object_t *tech_pvt, int force)
|
|||
switch_core_session_unlock_codec_read(tech_pvt->session);
|
||||
}
|
||||
|
||||
sofia_glue_tech_set_video_codec(tech_pvt, force);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -5307,7 +5309,8 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
|||
|
||||
switch_snprintf(tmp, sizeof(tmp), "%d", tech_pvt->video_recv_pt);
|
||||
switch_channel_set_variable(tech_pvt->channel, "sip_video_recv_pt", tmp);
|
||||
|
||||
if (!match && vmatch) match = 1;
|
||||
|
||||
break;
|
||||
} else {
|
||||
vmatch = 0;
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
diff --git src/mod/xml_int/mod_xml_radius/mod_xml_radius.c src/mod/xml_int/mod_xml_radius/mod_xml_radius.c
|
||||
index 0707388..e9e6e2a 100644
|
||||
--- src/mod/xml_int/mod_xml_radius/mod_xml_radius.c
|
||||
+++ src/mod/xml_int/mod_xml_radius/mod_xml_radius.c
|
||||
@@ -367,6 +367,10 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
||||
switch_time_t time = profile->times->created;
|
||||
switch_time_exp_t tm;
|
||||
|
||||
+ if ( !time ) {
|
||||
+ goto err;
|
||||
+ }
|
||||
+
|
||||
switch_time_exp_lt(&tm, time);
|
||||
av_value = switch_mprintf("%04u-%02u-%02uT%02u:%02u:%02u.%06u%+03d%02d",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
@@ -381,6 +385,10 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
||||
switch_caller_profile_t *profile = switch_channel_get_caller_profile(channel);
|
||||
switch_time_t time = profile->times->answered;
|
||||
switch_time_exp_t tm;
|
||||
+
|
||||
+ if ( !time ) {
|
||||
+ goto err;
|
||||
+ }
|
||||
|
||||
switch_time_exp_lt(&tm, time);
|
||||
|
||||
@@ -397,6 +405,10 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
||||
switch_caller_profile_t *profile = switch_channel_get_caller_profile(channel);
|
||||
switch_time_t time = profile->times->hungup;
|
||||
switch_time_exp_t tm;
|
||||
+
|
||||
+ if ( !time ) {
|
||||
+ goto err;
|
||||
+ }
|
||||
|
||||
switch_time_exp_lt(&tm, time);
|
||||
|
||||
diff --git src/mod/xml_int/mod_xml_radius/xml_radius.conf.xml src/mod/xml_int/mod_xml_radius/xml_radius.conf.xml
|
||||
index eb3070c..6349d05 100644
|
||||
--- src/mod/xml_int/mod_xml_radius/xml_radius.conf.xml
|
||||
+++ src/mod/xml_int/mod_xml_radius/xml_radius.conf.xml
|
||||
@@ -22,7 +22,7 @@
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="src-gw-ip=%s"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="sip_from_user" format="src-gw-name=%s"/>
|
||||
<param vendor="Cisco" name="h323-conf-id" variable="Core-UUID" format="%s"/>
|
||||
- <param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="number"/>
|
||||
+ <param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="request-type=number"/>
|
||||
<param name="Called-Station-Id" variable="sip_to_user" format="%s"/>
|
||||
<param name="Calling-Station-Id" variable="sip_from_user" format="%s"/>
|
||||
<param name="User-Name" variable="sip_from_user" format="%s"/>
|
||||
@@ -48,7 +48,7 @@
|
||||
<param name="seqfile" value="/var/run/radius.seq"/>
|
||||
</connection>
|
||||
<fields>
|
||||
- <param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="user"/>
|
||||
+ <param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="request-type=user"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="src-gw-ip=%s"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="sip_from_user" format="src-gw-name=%s"/>
|
||||
<param name="User-Name" variable="sip_from_user" format="%s"/>
|
|
@ -367,6 +367,10 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
|||
switch_time_t time = profile->times->created;
|
||||
switch_time_exp_t tm;
|
||||
|
||||
if ( !time ) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch_time_exp_lt(&tm, time);
|
||||
av_value = switch_mprintf("%04u-%02u-%02uT%02u:%02u:%02u.%06u%+03d%02d",
|
||||
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
|
||||
|
@ -381,6 +385,10 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
|||
switch_caller_profile_t *profile = switch_channel_get_caller_profile(channel);
|
||||
switch_time_t time = profile->times->answered;
|
||||
switch_time_exp_t tm;
|
||||
|
||||
if ( !time ) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch_time_exp_lt(&tm, time);
|
||||
|
||||
|
@ -397,6 +405,10 @@ switch_status_t mod_xml_radius_add_params(switch_core_session_t *session, switch
|
|||
switch_caller_profile_t *profile = switch_channel_get_caller_profile(channel);
|
||||
switch_time_t time = profile->times->hungup;
|
||||
switch_time_exp_t tm;
|
||||
|
||||
if ( !time ) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
switch_time_exp_lt(&tm, time);
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="src-gw-ip=%s"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="sip_from_user" format="src-gw-name=%s"/>
|
||||
<param vendor="Cisco" name="h323-conf-id" variable="Core-UUID" format="%s"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="number"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="request-type=number"/>
|
||||
<param name="Called-Station-Id" variable="sip_to_user" format="%s"/>
|
||||
<param name="Calling-Station-Id" variable="sip_from_user" format="%s"/>
|
||||
<param name="User-Name" variable="sip_from_user" format="%s"/>
|
||||
|
@ -48,7 +48,7 @@
|
|||
<param name="seqfile" value="/var/run/radius.seq"/>
|
||||
</connection>
|
||||
<fields>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="user"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="request-type=user"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="ip" format="src-gw-ip=%s"/>
|
||||
<param vendor="Cisco" name="Cisco-AVPair" variable="sip_from_user" format="src-gw-name=%s"/>
|
||||
<param name="User-Name" variable="sip_from_user" format="%s"/>
|
||||
|
|
|
@ -580,11 +580,24 @@ static void *SWITCH_THREAD_FUNC echo_video_thread(switch_thread_t *thread, void
|
|||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
switch_status_t status;
|
||||
switch_frame_t *read_frame;
|
||||
switch_core_session_message_t msg = { 0 };
|
||||
|
||||
|
||||
msg.from = __FILE__;
|
||||
msg.message_id = SWITCH_MESSAGE_INDICATE_VIDEO_REFRESH_REQ;
|
||||
|
||||
switch_core_session_receive_message(session, &msg);
|
||||
|
||||
eh->up = 1;
|
||||
while (switch_channel_ready(channel)) {
|
||||
status = switch_core_session_read_video_frame(session, &read_frame, SWITCH_IO_FLAG_NONE, 0);
|
||||
|
||||
|
||||
if (switch_channel_test_flag(channel, CF_VIDEO_REFRESH_REQ)) {
|
||||
switch_core_session_receive_message(session, &msg);
|
||||
switch_channel_clear_flag(channel, CF_VIDEO_REFRESH_REQ);
|
||||
}
|
||||
|
||||
if (!SWITCH_READ_ACCEPTABLE(status)) {
|
||||
break;
|
||||
}
|
||||
|
@ -606,6 +619,8 @@ SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session, swi
|
|||
switch_status_t status;
|
||||
switch_frame_t *read_frame;
|
||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||
int orig_vid = switch_channel_test_flag(channel, CF_VIDEO);
|
||||
|
||||
#ifdef SWITCH_VIDEO_IN_THREADS
|
||||
struct echo_helper eh = { 0 };
|
||||
switch_thread_t *thread;
|
||||
|
@ -615,6 +630,9 @@ SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session, swi
|
|||
if (switch_channel_pre_answer(channel) != SWITCH_STATUS_SUCCESS) {
|
||||
return;
|
||||
}
|
||||
|
||||
restart:
|
||||
|
||||
#ifdef SWITCH_VIDEO_IN_THREADS
|
||||
if (switch_channel_test_flag(channel, CF_VIDEO)) {
|
||||
eh.session = session;
|
||||
|
@ -630,6 +648,12 @@ SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session, swi
|
|||
if (!SWITCH_READ_ACCEPTABLE(status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!orig_vid && switch_channel_test_flag(channel, CF_VIDEO)) {
|
||||
orig_vid = 1;
|
||||
goto restart;
|
||||
}
|
||||
|
||||
|
||||
switch_ivr_parse_all_events(session);
|
||||
|
||||
|
|
|
@ -780,6 +780,16 @@ static uint8_t check_channel_status(originate_global_t *oglobals, originate_stat
|
|||
|
||||
end:
|
||||
|
||||
if (rval == 0 && pickups) {
|
||||
for (i = 0; i < len; i++) {
|
||||
if (originate_status[i].peer_channel && switch_channel_test_flag(originate_status[i].peer_channel, CF_PICKUP) &&
|
||||
switch_channel_up(originate_status[i].peer_channel)) {
|
||||
switch_channel_hangup(originate_status[i].peer_channel, SWITCH_CAUSE_NO_ANSWER);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (pindex > -1 && caller_channel && switch_channel_ready(caller_channel) && !switch_channel_media_ready(caller_channel) &&
|
||||
switch_channel_media_ready(originate_status[pindex].peer_channel)) {
|
||||
inherit_codec(caller_channel, originate_status[pindex].peer_session);
|
||||
|
|
|
@ -175,6 +175,15 @@
|
|||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\applications\mod_callcenter\mod_callcenter.2010.vcxproj">
|
||||
<Name>mod_callcenter</Name>
|
||||
<Project>{47886a6c-cca6-4f9f-a7d4-f97d06fb2b1a}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>
|
||||
</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\applications\mod_commands\mod_commands.2010.vcxproj">
|
||||
<Name>mod_commands</Name>
|
||||
<Project>{30a5b29c-983e-4580-9fd0-d647ccdcc7eb}</Project>
|
||||
|
@ -211,6 +220,15 @@
|
|||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\applications\mod_directory\mod_directory.2010.vcxproj">
|
||||
<Name>mod_directory</Name>
|
||||
<Project>{b889a18e-70a7-44b5-b2c9-47798d4f43b3}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>
|
||||
</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\applications\mod_dptools\mod_dptools.2010.vcxproj">
|
||||
<Name>mod_dptools</Name>
|
||||
<Project>{b5881a85-fe70-4f64-8607-2caae52669c6}</Project>
|
||||
|
@ -508,6 +526,24 @@
|
|||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\endpoints\mod_rtmp\mod_rtmp_2010.vcxproj">
|
||||
<Name>mod_rtmp</Name>
|
||||
<Project>{48414740-c693-4968-9846-ee058020c64f}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>
|
||||
</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\endpoints\mod_skypopen\mod_skypopen.2010.vcxproj">
|
||||
<Name>mod_skypopen</Name>
|
||||
<Project>{c6e78a4c-db1e-47f4-9b63-4dc27d86343f}</Project>
|
||||
<Private>True</Private>
|
||||
<DoNotHarvest>
|
||||
</DoNotHarvest>
|
||||
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
||||
<RefTargetDir>MODLOCATION</RefTargetDir>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\src\mod\endpoints\mod_sofia\mod_sofia.2010.vcxproj">
|
||||
<Name>mod_sofia</Name>
|
||||
<Project>{0df3abd0-ddc0-4265-b778-07c66780979b}</Project>
|
||||
|
|
Loading…
Reference in New Issue