mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-29 13:52:07 +00:00
Merge branch 'main' into dev/bbl-network-upd
This commit is contained in:
@@ -750,7 +750,7 @@ void PressureAdvanceWizard::on_cali_save()
|
||||
CalibUtils::set_PA_calib_result({ new_pa_cali_result }, false);
|
||||
}
|
||||
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow Dynamics Calibration result has been saved to the printer"), wxEmptyString, wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow Dynamics Calibration result has been saved to the printer."), wxEmptyString, wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
}
|
||||
else if (curr_obj->get_printer_series() == PrinterSeries::SERIES_P1P) {
|
||||
@@ -817,7 +817,7 @@ void PressureAdvanceWizard::on_cali_save()
|
||||
|
||||
}
|
||||
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow Dynamics Calibration result has been saved to the printer"), wxEmptyString, wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow Dynamics Calibration result has been saved to the printer."), wxEmptyString, wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
}
|
||||
else {
|
||||
@@ -1170,7 +1170,7 @@ void FlowRateWizard::on_cali_save()
|
||||
}
|
||||
}
|
||||
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset"), wxEmptyString, wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset."), wxEmptyString, wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
}
|
||||
else if (m_cali_method == CalibrationMethod::CALI_METHOD_MANUAL) {
|
||||
@@ -1216,7 +1216,7 @@ void FlowRateWizard::on_cali_save()
|
||||
return;
|
||||
}
|
||||
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset"), wxEmptyString, wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("Flow rate calibration result has been saved to preset."), wxEmptyString, wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
}
|
||||
else {
|
||||
@@ -1499,7 +1499,7 @@ void MaxVolumetricSpeedWizard::on_cali_save()
|
||||
return;
|
||||
}
|
||||
|
||||
MessageDialog msg_dlg(nullptr, _L("Max volumetric speed calibration result has been saved to preset"), wxEmptyString, wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("Max volumetric speed calibration result has been saved to preset."), wxEmptyString, wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
show_step(start_step);
|
||||
}
|
||||
|
||||
@@ -1567,7 +1567,7 @@ void CalibrationFlowCoarseSavePage::set_curr_flow_ratio(const float value) {
|
||||
bool CalibrationFlowCoarseSavePage::get_result(float* out_value, wxString* out_name) {
|
||||
// Check if the value is valid
|
||||
if (m_optimal_block_coarse->GetSelection() == -1 || m_coarse_flow_ratio <= 0.0 || m_coarse_flow_ratio >= 2.0) {
|
||||
MessageDialog msg_dlg(nullptr, _L("Please choose a block with smoothest top surface"), wxEmptyString, wxICON_WARNING | wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("Please choose a block with smoothest top surface."), wxEmptyString, wxICON_WARNING | wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -216,11 +216,11 @@ void CalibrationFlowRateStartPage::create_page(wxWindow* parent)
|
||||
m_top_sizer->Add(m_page_caption, 0, wxEXPAND, 0);
|
||||
create_when(parent,
|
||||
_L("When to use Flow Rate Calibration"),
|
||||
_L("After using Flow Dynamics Calibration, there might still be some extrusion issues, such as:\
|
||||
\n1. Over-Extrusion: Excess material on your printed object, forming blobs or zits, or the layers seem thicker than expected and not uniform.\
|
||||
\n2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the top layer of the model, even when printing slowly.\
|
||||
\n3. Poor Surface Quality: The surface of your prints seems rough or uneven.\
|
||||
\n4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as they should be."));
|
||||
_L("After using Flow Dynamics Calibration, there might still be some extrusion issues, such as:\n"
|
||||
"1. Over-Extrusion: Excess material on your printed object, forming blobs or zits, or the layers seem thicker than expected and not uniform\n"
|
||||
"2. Under-Extrusion: Very thin layers, weak infill strength, or gaps in the top layer of the model, even when printing slowly\n"
|
||||
"3. Poor Surface Quality: The surface of your prints seems rough or uneven\n"
|
||||
"4. Weak Structural Integrity: Prints break easily or don't seem as sturdy as they should be"));
|
||||
|
||||
m_top_sizer->Add(m_when_title);
|
||||
m_top_sizer->Add(m_when_content);
|
||||
|
||||
@@ -38,27 +38,28 @@
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
static const std::vector<std::string> filament_vendors =
|
||||
static const std::vector<std::string> filament_vendors =
|
||||
{"3Dgenius", "3DJake", "3DXTECH", "3D BEST-Q", "3D Hero",
|
||||
"3D-Fuel", "Aceaddity", "AddNorth", "Amazon Basics", "AMOLEN",
|
||||
"Ankermake", "Anycubic", "Atomic", "AzureFilm", "BASF",
|
||||
"Bblife", "BCN3D", "Beyond Plastic", "California Filament", "Capricorn",
|
||||
"CC3D", "colorFabb", "Comgrow", "Cookiecad", "Creality",
|
||||
"CERPRiSE", "Das Filament", "DO3D", "DOW", "DSM",
|
||||
"Duramic", "ELEGOO", "Eryone", "Essentium", "eSUN",
|
||||
"Extrudr", "Fiberforce", "Fiberlogy", "FilaCube", "Filamentive",
|
||||
"Fillamentum", "FLASHFORGE", "Formfutura", "Francofil", "FusRock",
|
||||
"FilamentOne", "Fil X", "GEEETECH", "Giantarm", "Gizmo Dorks",
|
||||
"GreenGate3D", "HATCHBOX", "Hello3D", "IC3D", "IEMAI",
|
||||
"IIID Max", "INLAND", "iProspect", "iSANMATE", "Justmaker",
|
||||
"Keene Village Plastics", "Kexcelled", "LDO", "MakerBot", "MatterHackers",
|
||||
"MIKA3D", "NinjaTek", "Nobufil", "Novamaker", "OVERTURE",
|
||||
"OVVNYXE", "Polymaker", "Priline", "Printed Solid", "Protopasta",
|
||||
"Prusament", "Push Plastic", "R3D", "Re-pet3D", "Recreus",
|
||||
"Regen", "RatRig", "Sain SMART", "SliceWorx", "Snapmaker",
|
||||
"SnoLabs", "Spectrum", "SUNLU", "TTYT3D", "Tianse",
|
||||
"UltiMaker", "Valment", "Verbatim", "VO3D", "Voxelab",
|
||||
"VOXELPLA", "YOOPAI", "Yousu", "Ziro", "Zyltech"};
|
||||
"CERPRiSE", "Das Filament", "DO3D", "DOW", "DREMC",
|
||||
"DSM", "Duramic", "ELEGOO", "Eryone", "Essentium",
|
||||
"eSUN", "Extrudr", "Fiberforce", "Fiberlogy", "FilaCube",
|
||||
"Filamentive", "Fillamentum", "FLASHFORGE", "Formfutura", "Francofil",
|
||||
"FusRock", "FilamentOne", "Fil X", "GEEETECH", "Giantarm",
|
||||
"Gizmo Dorks", "GreenGate3D", "HATCHBOX", "Hello3D", "IC3D",
|
||||
"IEMAI", "IIID Max", "INLAND", "iProspect", "iSANMATE",
|
||||
"Justmaker", "Keene Village Plastics", "Kexcelled", "LDO", "MakerBot",
|
||||
"MatterHackers", "MIKA3D", "NinjaTek", "Nobufil", "Novamaker",
|
||||
"OVERTURE", "OVVNYXE", "Polymaker", "Priline", "Printed Solid",
|
||||
"Protopasta", "Prusament", "Push Plastic", "R3D", "Re-pet3D",
|
||||
"Recreus", "Regen", "RatRig", "Sain SMART", "SliceWorx",
|
||||
"Snapmaker", "SnoLabs", "Spectrum", "SUNLU", "TTYT3D",
|
||||
"Tianse", "UltiMaker", "Valment", "Verbatim", "VO3D",
|
||||
"Voxelab", "VOXELPLA", "YOOPAI", "Yousu", "Ziro",
|
||||
"Zyltech"};
|
||||
|
||||
static const std::vector<std::string> filament_types = {"PLA", "rPLA", "PLA+", "PLA Tough", "PETG", "ABS", "ASA", "FLEX", "HIPS", "PA", "PACF",
|
||||
"NYLON", "PVA", "PVB", "PC", "PCABS", "PCTG", "PCCF", "PHA", "PP", "PEI", "PET",
|
||||
|
||||
@@ -4154,7 +4154,7 @@ void GUI_App::on_http_error(wxCommandEvent &evt)
|
||||
|
||||
// Version limit
|
||||
if (code == HttpErrorVersionLimited) {
|
||||
MessageDialog msg_dlg(nullptr, _L("The version of Orca Slicer is too low and needs to be updated to the latest version before it can be used normally"), "", wxAPPLY | wxOK);
|
||||
MessageDialog msg_dlg(nullptr, _L("The version of Orca Slicer is too low and needs to be updated to the latest version before it can be used normally."), "", wxAPPLY | wxOK);
|
||||
if (msg_dlg.ShowModal() == wxOK) {
|
||||
}
|
||||
|
||||
|
||||
@@ -2631,15 +2631,15 @@ void MainFrame::init_menubar_as_editor()
|
||||
"", nullptr, [this](){return can_deselect(); }, this);
|
||||
//editMenu->AppendSeparator();
|
||||
//append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Mesh(TODO)"),
|
||||
// _L("Display triangles of models"), [this](wxCommandEvent& evt) {
|
||||
// _L("Display triangles of models."), [this](wxCommandEvent& evt) {
|
||||
// wxGetApp().app_config->set_bool("show_model_mesh", evt.GetInt() == 1);
|
||||
// }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_model_mesh").compare("true") == 0; }, this);
|
||||
//append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Shadow(TODO)"), _L("Display shadow of objects"),
|
||||
//append_menu_check_item(editMenu, wxID_ANY, _L("Show Model Shadow(TODO)"), _L("Display shadow of objects."),
|
||||
// [this](wxCommandEvent& evt) {
|
||||
// wxGetApp().app_config->set_bool("show_model_shadow", evt.GetInt() == 1);
|
||||
// }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_model_shadow").compare("true") == 0; }, this);
|
||||
//editMenu->AppendSeparator();
|
||||
//append_menu_check_item(editMenu, wxID_ANY, _L("Show Printable Box(TODO)"), _L("Display printable box"),
|
||||
//append_menu_check_item(editMenu, wxID_ANY, _L("Show Printable Box(TODO)"), _L("Display printable box."),
|
||||
// [this](wxCommandEvent& evt) {
|
||||
// wxGetApp().app_config->set_bool("show_printable_box", evt.GetInt() == 1);
|
||||
// }, nullptr, [this]() {return can_select(); }, [this]() { return wxGetApp().app_config->get("show_printable_box").compare("true") == 0; }, this);
|
||||
@@ -2681,7 +2681,7 @@ void MainFrame::init_menubar_as_editor()
|
||||
else
|
||||
viewMenu->Check(wxID_CAMERA_ORTHOGONAL + camera_id_base, true);
|
||||
}, perspective_item->GetId());
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Auto Perspective"), _L("Automatically switch between orthographic and perspective when changing from top/bottom/side views"),
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Auto Perspective"), _L("Automatically switch between orthographic and perspective when changing from top/bottom/side views."),
|
||||
[this](wxCommandEvent&) {
|
||||
wxGetApp().app_config->set_bool("auto_perspective", !wxGetApp().app_config->get_bool("auto_perspective"));
|
||||
m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT));
|
||||
@@ -2690,7 +2690,7 @@ void MainFrame::init_menubar_as_editor()
|
||||
[this]() { return wxGetApp().app_config->get_bool("auto_perspective"); }, this);
|
||||
|
||||
viewMenu->AppendSeparator();
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &G-code Window") + sep + "C", _L("Show G-code window in Preview scene"),
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &G-code Window") + sep + "C", _L("Show G-code window in Preview scene."),
|
||||
[this](wxCommandEvent &) {
|
||||
wxGetApp().toggle_show_gcode_window();
|
||||
m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT));
|
||||
@@ -2699,7 +2699,7 @@ void MainFrame::init_menubar_as_editor()
|
||||
[this]() { return wxGetApp().show_gcode_window(); }, this);
|
||||
|
||||
append_menu_check_item(
|
||||
viewMenu, wxID_ANY, _L("Show 3D Navigator"), _L("Show 3D navigator in Prepare and Preview scene"),
|
||||
viewMenu, wxID_ANY, _L("Show 3D Navigator"), _L("Show 3D navigator in Prepare and Preview scene."),
|
||||
[this](wxCommandEvent&) {
|
||||
wxGetApp().toggle_show_3d_navigator();
|
||||
m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT));
|
||||
@@ -2717,11 +2717,11 @@ void MainFrame::init_menubar_as_editor()
|
||||
this);
|
||||
|
||||
viewMenu->AppendSeparator();
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Labels") + "\t" + ctrl + "E", _L("Show object labels in 3D scene"),
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Labels") + "\t" + ctrl + "E", _L("Show object labels in 3D scene."),
|
||||
[this](wxCommandEvent&) { m_plater->show_view3D_labels(!m_plater->are_view3D_labels_shown()); m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, this,
|
||||
[this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->are_view3D_labels_shown(); }, this);
|
||||
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Overhang"), _L("Show object overhang highlight in 3D scene"),
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Overhang"), _L("Show object overhang highlight in 3D scene."),
|
||||
[this](wxCommandEvent &) {
|
||||
m_plater->show_view3D_overhang(!m_plater->is_view3D_overhang_shown());
|
||||
m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT));
|
||||
@@ -2729,7 +2729,7 @@ void MainFrame::init_menubar_as_editor()
|
||||
this, [this]() { return m_plater->is_view3D_shown(); }, [this]() { return m_plater->is_view3D_overhang_shown(); }, this);
|
||||
|
||||
append_menu_check_item(
|
||||
viewMenu, wxID_ANY, _L("Show Selected Outline (beta)"), _L("Show outline around selected object in 3D scene"),
|
||||
viewMenu, wxID_ANY, _L("Show Selected Outline (beta)"), _L("Show outline around selected object in 3D scene."),
|
||||
[this](wxCommandEvent&) {
|
||||
wxGetApp().toggle_show_outline();
|
||||
m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT));
|
||||
@@ -2738,13 +2738,13 @@ void MainFrame::init_menubar_as_editor()
|
||||
[this]() { return wxGetApp().show_outline(); }, this);
|
||||
|
||||
/*viewMenu->AppendSeparator();
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Wireframe") + "\tCtrl+Shift+Enter", _L("Show wireframes in 3D scene"),
|
||||
append_menu_check_item(viewMenu, wxID_ANY, _L("Show &Wireframe") + "\tCtrl+Shift+Enter", _L("Show wireframes in 3D scene."),
|
||||
[this](wxCommandEvent&) { m_plater->toggle_show_wireframe(); m_plater->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, this,
|
||||
[this]() { return m_plater->is_wireframe_enabled(); }, [this]() { return m_plater->is_show_wireframe(); }, this);*/
|
||||
|
||||
//viewMenu->AppendSeparator();
|
||||
////BBS orthogonal view
|
||||
//append_menu_check_item(viewMenu, wxID_ANY, _L("Show Edges(TODO)"), _L("Show Edges"),
|
||||
//append_menu_check_item(viewMenu, wxID_ANY, _L("Show Edges(TODO)"), _L("Show Edges."),
|
||||
// [this](wxCommandEvent& evt) {
|
||||
// wxGetApp().app_config->set("show_build_edges", evt.GetInt() == 1 ? "true" : "false");
|
||||
// }, nullptr, [this]() {return can_select(); }, [this]() {
|
||||
|
||||
@@ -1274,7 +1274,7 @@ void NotificationManager::UpdatedItemsInfoNotification::add_type(InfoItemType ty
|
||||
case InfoItemType::MmuSegmentation: text += format(_L_PLURAL("%1$d Object has color painting.", "%1$d Objects have color painting.",(*it).second), (*it).second) + "\n"; break;
|
||||
// BBS
|
||||
//case InfoItemType::Sinking: text += format(("%1$d Object has partial sinking.", "%1$d Objects have partial sinking.", (*it).second), (*it).second) + "\n"; break;
|
||||
case InfoItemType::CutConnectors: text += format(_L_PLURAL("%1$d object was loaded as a part of cut object.", "%1$d objects were loaded as parts of cut object", (*it).second), (*it).second) + "\n"; break;
|
||||
case InfoItemType::CutConnectors: text += format(_L_PLURAL("%1$d object was loaded as a part of cut object.", "%1$d objects were loaded as parts of cut object.", (*it).second), (*it).second) + "\n"; break;
|
||||
default: BOOST_LOG_TRIVIAL(error) << "Unknown InfoItemType: " << (*it).second; break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3644,7 +3644,7 @@ void StatusPanel::on_ams_setting_click(SimpleEvent &event)
|
||||
m_ams_setting_dlg->update_ams_img(DeviceManager::get_printer_ams_img(obj->printer_type));
|
||||
std::string ams_id = m_ams_control->GetCurentShowAms();
|
||||
if (obj->amsList.size() == 0) {
|
||||
/* wxString txt = _L("AMS settings are not supported for external spool");
|
||||
/* wxString txt = _L("AMS settings are not supported for external spool.");
|
||||
MessageDialog msg_dlg(nullptr, txt, wxEmptyString, wxICON_WARNING | wxOK);
|
||||
msg_dlg.ShowModal();*/
|
||||
return;
|
||||
@@ -3672,7 +3672,7 @@ void StatusPanel::on_filament_extrusion_cali(wxCommandEvent &event)
|
||||
std::string ams_id = m_ams_control->GetCurentAms();
|
||||
std::string tray_id = m_ams_control->GetCurrentCan(ams_id);
|
||||
if (tray_id.empty() && ams_id.compare(std::to_string(VIRTUAL_TRAY_ID)) != 0) {
|
||||
wxString txt = _L("Please select an AMS slot before calibration");
|
||||
wxString txt = _L("Please select an AMS slot before calibration.");
|
||||
MessageDialog msg_dlg(nullptr, txt, wxEmptyString, wxICON_WARNING | wxOK);
|
||||
msg_dlg.ShowModal();
|
||||
return;
|
||||
|
||||
@@ -2206,6 +2206,7 @@ void TabPrint::build()
|
||||
optgroup->append_single_option_line("support_interface_speed");
|
||||
optgroup = page->new_optgroup(L("Overhang speed"), L"param_overhang_speed", 15);
|
||||
optgroup->append_single_option_line("enable_overhang_speed", "slow-down-for-overhang");
|
||||
|
||||
// Orca: DEPRECATED
|
||||
// optgroup->append_single_option_line("overhang_speed_classic", "slow-down-for-overhang");
|
||||
optgroup->append_single_option_line("slowdown_for_curled_perimeters");
|
||||
@@ -4166,6 +4167,17 @@ PageShp TabPrinter::build_kinematics_page()
|
||||
}
|
||||
auto optgroup = page->new_optgroup(L("Advanced"), "param_advanced");
|
||||
optgroup->append_single_option_line("emit_machine_limits_to_gcode");
|
||||
|
||||
// resonance avoidance ported over from qidi slicer
|
||||
optgroup = page->new_optgroup(L("Resonance Avoidance"));
|
||||
optgroup->append_single_option_line("resonance_avoidance");
|
||||
// Resonance‑avoidance speed inputs
|
||||
{
|
||||
Line resonance_line = {L("Resonance Avoidance Speed"), L("")};
|
||||
resonance_line.append_option(optgroup->get_option("min_resonance_avoidance_speed"));
|
||||
resonance_line.append_option(optgroup->get_option("max_resonance_avoidance_speed"));
|
||||
optgroup->append_line(resonance_line);
|
||||
}
|
||||
|
||||
const std::vector<std::string> speed_axes{
|
||||
"machine_max_speed_x",
|
||||
@@ -4424,7 +4436,6 @@ if (is_marlin_flavor)
|
||||
optgroup->append_single_option_line("deretraction_speed", "", extruder_idx);
|
||||
optgroup->append_single_option_line("retraction_minimum_travel", "", extruder_idx);
|
||||
optgroup->append_single_option_line("retract_when_changing_layer", "", extruder_idx);
|
||||
optgroup->append_single_option_line("retract_on_top_layer", "", extruder_idx);
|
||||
optgroup->append_single_option_line("wipe", "", extruder_idx);
|
||||
optgroup->append_single_option_line("wipe_distance", "", extruder_idx);
|
||||
optgroup->append_single_option_line("retract_before_wipe", "", extruder_idx);
|
||||
@@ -4644,7 +4655,7 @@ void TabPrinter::toggle_options()
|
||||
// user can customize other retraction options if retraction is enabled
|
||||
//BBS
|
||||
bool retraction = have_retract_length || use_firmware_retraction;
|
||||
std::vector<std::string> vec = {"z_hop", "retract_when_changing_layer", "retract_on_top_layer"};
|
||||
std::vector<std::string> vec = {"z_hop", "retract_when_changing_layer"};
|
||||
for (auto el : vec)
|
||||
toggle_option(el, retraction, i);
|
||||
|
||||
@@ -4709,6 +4720,10 @@ void TabPrinter::toggle_options()
|
||||
for (int i = 0; i < max_field; ++i)
|
||||
toggle_option("machine_max_junction_deviation", gcf == gcfMarlinFirmware, i);
|
||||
toggle_line("machine_max_junction_deviation", gcf == gcfMarlinFirmware);
|
||||
|
||||
bool resonance_avoidance = m_config->opt_bool("resonance_avoidance");
|
||||
toggle_option("min_resonance_avoidance_speed", resonance_avoidance);
|
||||
toggle_option("max_resonance_avoidance_speed", resonance_avoidance);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user