Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Airway - Change recovery position & reword check airway hints #445

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 18 additions & 13 deletions addons/airway/ACE_Medical_Treatment_Actions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ class ACE_Medical_Treatment_Actions {
medicRequired = QGVAR(medLvl_Larynxtubus);
treatmentTime = QGVAR(Larynxtubus_time);
items[] = {"kat_larynx"};
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus'));
callbackSuccess = QFUNC(treatmentAdvanced_airway);
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus'));
callbackSuccess = QUOTE([ARR_3(_medic,_patient,(_patient getVariable [ARR_2(QQGVAR(occluded),false)]))] call FUNC(handleRecoveryPosition); [ARR_6(_medic,_patient,_bodyPart,_className,objNull,_usedItem)] call FUNC(treatmentAdvanced_airway););
callbackFailure = "";
callbackProgress = "";
callbackProgress = QUOTE(!([(_args select 1)] call ACEFUNC(common,isAwake)) && !((_args select 1) getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && !((_args select 1) getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus'));
consumeItem = 1;
animationPatient = "";
animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback";
Expand All @@ -32,15 +32,15 @@ class ACE_Medical_Treatment_Actions {
items[] = {};
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && (_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus'));
callbackSuccess = QFUNC(treatmentAdvanced_RemoveAirwayItem);
callbackProgress = "";
};
class Guedeltubus: Larynxtubus {
displayName = CSTRING(Guedeltubus_Display);
medicRequired = QGVAR(medLvl_Guedeltubus);
treatmentTime = QGVAR(Guedeltubus_time);
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && missionNamespace getVariable [ARR_2(QQGVAR(enable),true)] && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus') && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus'));
items[] = {"kat_guedel"};
icon = QPATHTOF(ui\guedel.paa);
callbackSuccess = QFUNC(treatmentAdvanced_airway);
callbackSuccess = QUOTE([ARR_3(_medic,_patient,(_patient getVariable [ARR_2(QQGVAR(occluded),false)]))] call FUNC(handleRecoveryPosition); [ARR_6(_medic,_patient,_bodyPart,_className,objNull,_usedItem)] call FUNC(treatmentAdvanced_airway););
};
class RemoveGuedeltubus: RemoveLarynxtubus {
displayName = CSTRING(Cancel_Guedeltubus);
Expand All @@ -62,17 +62,19 @@ class ACE_Medical_Treatment_Actions {
medicRequired = QGVAR(medLvl_Accuvac);
callbackStart = QFUNC(treatmentAdvanced_AccuvacStart);
callbackSuccess = QFUNC(treatmentAdvanced_accuvac);
callbackProgress = "";
sounds[] = {{QPATHTO_R(sounds\accuvac.wav),6,1,15}};
};
class Overstretch: Larynxtubus {
displayName = CSTRING(overstretch);
displayNameProgress = CSTRING(overstretching);
treatmentTime = QGVAR(Overstretch_time);
class HyperextendHead: Larynxtubus {
displayName = CSTRING(Hyperextend_diplayName);
displayNameProgress = CSTRING(Hyperextend_progress);
treatmentTime = QGVAR(Hyperextend_Time);
medicRequired = 0;
items[] = {};
icon = "";
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && !(_patient getVariable [ARR_2(QQGVAR(overstretch),false)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)]) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus') && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus'));
callbackSuccess = QFUNC(treatmentAdvanced_overstretchHead);
callbackSuccess = QFUNC(treatmentAdvanced_hyperextendHead);
callbackProgress = QUOTE(!([(_args select 1)] call ACEFUNC(common,isAwake)) && !((_args select 1) getVariable [ARR_2(QQGVAR(overstretch),false)]) && !((_args select 1) getVariable [ARR_2(QQGVAR(recovery),false)]) && !((_args select 1) getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus') && !((_args select 1) getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus'));
};
class BeginHeadTurning: Larynxtubus {
displayName = CSTRING(headTurning_begin);
Expand All @@ -83,6 +85,7 @@ class ACE_Medical_Treatment_Actions {
icon = "";
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)]) && !(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Larynxtubus') && (!(_patient getVariable [ARR_2(QQGVAR(airway_item),'')] == 'Guedeltubus') || !(missionNamespace getVariable [ARR_2(QQGVAR(block_headTurning_ifAirwayItem),true)])));
callbackSuccess = QFUNC(startHeadTurning);
callbackProgress = "";
sounds[] = {};
};
class RecoveryPosition: Larynxtubus {
Expand All @@ -93,9 +96,10 @@ class ACE_Medical_Treatment_Actions {
allowedSelections[] = {"Body"};
medicRequired = 0;
items[] = {};
condition = QUOTE((!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)])) && FUNC(checkRecovery));
condition = QUOTE((!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && !(_patient getVariable [ARR_2(QQGVAR(recovery),false)])) && [ARR_2(_medic,_patient)] call FUNC(checkRecovery));
icon = "";
callbackSuccess = QFUNC(treatmentAdvanced_RecoveryPosition);
callbackProgress = QUOTE(!([(_args select 1)] call ACEFUNC(common,isAwake) && !((_args select 1) getVariable [ARR_2(QQGVAR(recovery),false)])) && [ARR_2((_args select 0),(_args select 1))] call FUNC(checkRecovery));
animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon", "kat_recoveryposition"};
};
class CancelRecoveryPosition: Larynxtubus {
Expand All @@ -106,9 +110,10 @@ class ACE_Medical_Treatment_Actions {
allowedSelections[] = {"Body"};
medicRequired = 0;
items[] = {};
condition = QUOTE((!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && (_patient getVariable [ARR_2(QQGVAR(recovery),false)])));
condition = QUOTE(!([_patient] call ACEFUNC(common,isAwake)) && (missionNamespace getVariable [ARR_2(QQGVAR(enable),true)]) && (_patient getVariable [ARR_2(QQGVAR(recovery),false)]));
icon = "";
callbackSuccess = QFUNC(treatmentAdvanced_CancelRecoveryPosition);
callbackSuccess = QUOTE([ARR_2(_medic,_patient)] call FUNC(treatmentAdvanced_CancelRecoveryPosition));
callbackProgress = QUOTE(!([(_args select 1)] call ACEFUNC(common,isAwake)) && ((_args select 1) getVariable [ARR_2(QQGVAR(recovery),false)]));
animationPatientUnconscious = "";
animationPatientUnconsciousExcludeOn[] = {"ainjppnemstpsnonwrfldnon"};
};
Expand Down
3 changes: 2 additions & 1 deletion addons/airway/XEH_PREP.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ PREP(checkAirway);
PREP(checkRecovery);
PREP(handleAirway);
PREP(handlePuking);
PREP(handleRecoveryPosition);
PREP(init);
PREP(startHeadTurning);
PREP(treatmentAdvanced_Accuvac);
Expand All @@ -11,7 +12,7 @@ PREP(treatmentAdvanced_airway);
PREP(treatmentAdvanced_airwayLocal);
PREP(treatmentAdvanced_CancelRecoveryPosition);
PREP(treatmentAdvanced_CancelRecoveryPositionLocal);
PREP(treatmentAdvanced_overstretchHead);
PREP(treatmentAdvanced_hyperextendHead);
PREP(treatmentAdvanced_RecoveryPosition);
PREP(treatmentAdvanced_RecoveryPositionLocal);
PREP(treatmentAdvanced_RemoveAirwayItem);
Expand Down
2 changes: 1 addition & 1 deletion addons/airway/XEH_postInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ if !(GVAR(enable)) exitWith {};

[QGVAR(airwayFeedback), {
params ["_medic","_output"];
[_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured);
[_output, 2, _medic] call ACEFUNC(common,displayTextStructured);
}] call CBA_fnc_addEventHandler;

["ace_unconscious", {
Expand Down
28 changes: 19 additions & 9 deletions addons/airway/XEH_preInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,10 @@ In real life, this will happen sometimes, not quiet often.

// Settable action time for Head overstretching
[
QGVAR(Overstretch_time),
QGVAR(Hyperextend_Time),
"SLIDER",
[LLSTRING(TIME_OVERSTRETCH),LLSTRING(TIME_OVERSTRETCH_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionOverstretch)],
[LLSTRING(Hyperextend_Time), LLSTRING(Hyperextend_Time_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionHyperextend)],
[1, 10, 3, 0],
true
] call CBA_Settings_fnc_init;
Expand All @@ -212,19 +212,29 @@ In real life, this will happen sometimes, not quiet often.
[
QGVAR(RecoveryPosition_Time),
"SLIDER",
[LLSTRING(TIME_RECOVERY),LLSTRING(TIME_RECOVERY_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionOverstretch)],
[1, 120, 6, 0],
[LLSTRING(SETTING_RecoveryPosition_Time), LLSTRING(SETTING_RecoveryPosition_Time_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionHyperextend)],
[1, 60, 6, 0],
true
] call CBA_Settings_fnc_init;

// Settable action time for Cancel recovery position
[
QGVAR(CancelRecoveryPosition_Time),
"SLIDER",
[LLSTRING(TIME_CANCELRECOVERY),LLSTRING(TIME_CANCELRECOVERY_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionOverstretch)],
[1, 120, 6, 0],
[LLSTRING(SETTING_CancelRecoveryPosition_Time), LLSTRING(SETTING_CancelRecoveryPosition_Time_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionHyperextend)],
[1, 60, 3, 0],
true
] call CBA_Settings_fnc_init;

// Settable maximum time required for occlusion to be cleared from patient in recovery position
[
QGVAR(RecoveryPosition_TimeToDrain),
"SLIDER",
[LLSTRING(SETTING_RecoveryPosition_TimeToDrain), LLSTRING(SETTING_RecoveryPosition_TimeToDrain_DESC)],
[CBA_SETTINGS_CAT, LSTRING(SubCategory_RecoveryPositionHyperextend)],
[0, 30, 10, 0],
true
] call CBA_Settings_fnc_init;

Expand Down
38 changes: 25 additions & 13 deletions addons/airway/functions/fnc_checkAirway.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,43 @@

params ["_medic", "_patient"];

private _messageairwayobstruction = LLSTRING(message_obstruction_no);
private _messageairwayOccluded = LLSTRING(message_Occluded_no);
private _obstruction = LSTRING(noObstruction);
private _occluded = LSTRING(noOccluded);
private _hintAirwayObstruction = LLSTRING(AirwayStatus_noObstruction);
private _hintAirwayOcclusion = LLSTRING(AirwayStatus_noOcclusion);
private _obstruction = LSTRING(AirwayStatus_noObstruction_short);
private _occlusion = LSTRING(AirwayStatus_noOcclusion_short);

private _hintWidth = 14;
private _hintSize = 2;

if (_patient getVariable [QGVAR(obstruction), false]) then {
_messageairwayobstruction = LLSTRING(message_obstruction_yes);
_obstruction = LSTRING(obstruction);
_hintWidth = 17;
_hintAirwayObstruction = LLSTRING(AirwayStatus_Obstruction);
_obstruction = LSTRING(AirwayStatus_Obstruction_short);
if (_patient getVariable [QGVAR(overstretch), false]) then {
_messageairwayobstruction = LLSTRING(message_obstructionTemporarilyMitigated);
_obstruction = LLSTRING(mitigatedObstruction);
_hintAirwayObstruction = LLSTRING(AirwayStatus_mitigatedObstruction);
_obstruction = LLSTRING(AirwayStatus_mitigatedObstruction_short);
};
if (GVAR(autoTriage)) then {
_patient setVariable [QACEGVAR(medical,triageLevel), 3, true];
};
};
if (_patient getVariable [QGVAR(occluded), false]) then {
_messageairwayOccluded = LLSTRING(message_Occluded_yes);
_occluded = LSTRING(Occluded);
_hintAirwayOcclusion = LLSTRING(AirwayStatus_Occlusion);
_occlusion = LSTRING(AirwayStatus_Occlusion_short);
if (GVAR(autoTriage)) then {
_patient setVariable [QACEGVAR(medical,triageLevel), 3, true];
};
};
if (!(_patient getVariable [QGVAR(occluded), false] && _patient getVariable [QGVAR(obstruction), false]) && GVAR(autoTriage)) then {_patient setVariable [QACEGVAR(medical,triageLevel), 0, true]};
private _message = format ["%1, %2", _messageairwayobstruction, _messageairwayOccluded];
[_message, 2, _medic] call ACEFUNC(common,displayTextStructured);

[_patient, "activity", LSTRING(checkAirway_log), [[_medic] call ACEFUNC(common,getName), _obstruction, _occluded]] call ACEFUNC(medical_treatment,addToLog);
private _message = format ["%1<br />%2", _hintAirwayObstruction, _hintAirwayOcclusion];

if (!(_patient getVariable [QGVAR(occluded), false]) && !(_patient getVariable [QGVAR(obstruction), false])) then {
_message = LLSTRING(AirwayStatus_Clear);
_hintSize = 1.5;
_hintWidth = 10;
};

[_message, _hintSize, _medic, _hintWidth] call ACEFUNC(common,displayTextStructured);

[_patient, "activity", LSTRING(checkAirway_log), [[_medic] call ACEFUNC(common,getName), _obstruction, _occlusion]] call ACEFUNC(medical_treatment,addToLog);
24 changes: 24 additions & 0 deletions addons/airway/functions/fnc_handleRecoveryPosition.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "..\script_component.hpp"
/*
* Author: Blue
* Handle cancelling recovery position if patient is in one
*
* Arguments:
* 0: Medic <OBJECT>
* 1: Patient <OBJECT>
* 2: Hint is delayed? <BOOL>
*
* Return Value:
* None
*
* Example:
* [player, cursorTarget, false] call kat_airway_fnc_handleRecoveryPosition;
*
* Public: No
*/

params ["_medic", "_patient", ["_delayed", false]];

if (_patient getVariable [QGVAR(recovery), false]) then {
[_medic, _patient, _delayed] call FUNC(treatmentAdvanced_CancelRecoveryPosition);
};
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,20 @@
* Arguments:
* 0: Medic <OBJECT>
* 1: Patient <OBJECT>
* 2: Hint is delayed? <BOOL>
*
* Return Value:
* None
*
* Example:
* [player, cursorTarget] call kat_airway_fnc_RecoveryPosition
* [player, cursorTarget] call kat_airway_fnc_treatmentAdvanced_CancelRecoveryPosition;
*
* Public: No
*/

params ["_medic", "_patient"];
params ["_medic", "_patient", ["_delayed", false]];

[QGVAR(cancelRecoveryPositionLocal), [_medic, _patient], _patient] call CBA_fnc_targetEvent;
[_patient, "activity", LSTRING(CancelRecoveryPosition_Log), [[_medic] call ACEFUNC(common,getName)]] call ACEFUNC(medical_treatment,addToLog);

[QGVAR(cancelRecoveryPositionLocal), [_medic, _patient, _delayed], _patient] call CBA_fnc_targetEvent;
[_patient, "ainjppnemstpsnonwrfldnon", 2] call ACEFUNC(common,doAnimation);
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,32 @@
* Arguments:
* 0: Medic <OBJECT>
* 1: Patient <OBJECT>
* 2: Hint is delayed? <BOOL>
*
* Return Value:
* None
*
* Example:
* [player, cursorTarget] call kat_airway_fnc_CancelRecoveryPositionLocal
* [player, cursorTarget] call kat_airway_fnc_treatmentAdvanced_CancelRecoveryPositionLocal;
*
* Public: No
*/

params ["_medic", "_patient"];
params ["_medic", "_patient", ["_delayed", false]];

_patient setVariable [QGVAR(recovery), false, true];
_patient setVariable [QGVAR(overstretch), false, true];
_patient setVariable [QGVAR(occluded), (_patient getVariable [QGVAR(wasOccluded), false]), true];
_patient call FUNC(handlePuking);

private _output = LLSTRING(Recovery_Cancel);
[_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured);
private _output = LLSTRING(RecoveryPosition_Cancel);

if (_delayed) then {
[{
params ["_medic", "_output"];

[_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured);
}, [_medic, _output], 2.5] call CBA_fnc_waitAndExecute;
} else {
[_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured);
};
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* None
*
* Example:
* [player, cursorTarget] call kat_airway_fnc_RecoveryPosition
* [player, cursorTarget] call kat_airway_fnc_treatmentAdvanced_RecoveryPosition;
*
* Public: No
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
* None
*
* Example:
* [player, cursorTarget] call kat_airway_fnc_RecoveryPositionLocal
* [player, cursorTarget] call kat_airway_fnc_treatmentAdvanced_RecoveryPositionLocal;
*
* Public: No
*/
Expand All @@ -20,26 +20,36 @@ params ["_medic", "_patient"];

_patient setVariable [QGVAR(recovery), true, true];
_patient setVariable [QGVAR(overstretch), true, true];
_patient setVariable [QGVAR(occluded), false, true];

private _output = LLSTRING(Recovery_Info);
private _output = LLSTRING(RecoveryPosition_Ready);
[_output, 2, _medic] call ACEFUNC(common,displayTextStructured);

_patient setVariable [QGVAR(wasOccluded), (_patient getVariable [QGVAR(occluded), false])];

if (GVAR(RecoveryPosition_TimeToDrain) > 0 && GVAR(wasOccluded)) then {
[{
params ["_patient"];

_patient setVariable [QGVAR(occluded), false, true];
_patient setVariable [QGVAR(wasOccluded), false];
}, [_patient], (random GVAR(RecoveryPosition_TimeToDrain) max 1)] call CBA_fnc_waitAndExecute;
} else {
_patient setVariable [QGVAR(occluded), false, true];
_patient setVariable [QGVAR(wasOccluded), false];
};

[{
params ["_medic", "_patient"];
_patient call ACEFUNC(medical_status,isBeingDragged) || _patient call ACEFUNC(medical_status,isBeingCarried) || !(isNull objectParent _patient);

_patient call ACEFUNC(medical_status,isBeingDragged) || _patient call ACEFUNC(medical_status,isBeingCarried) || !(_patient getVariable [QGVAR(recovery), false]) || !(isNull objectParent _patient);
}, {
params ["_medic", "_patient"];
_patient setVariable [QGVAR(recovery), false, true];
_patient setVariable [QGVAR(overstretch), false, true];

_output = LLSTRING(Recovery_Cancel);
[_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured);
}, [_medic, _patient], 3600, {
params ["_medic", "_patient"];
if (_patient getVariable [QGVAR(recovery), false]) then {
[LLSTRING(RecoveryPosition_Cancel), 1.5, _medic] call ACEFUNC(common,displayTextStructured);
};

_patient setVariable [QGVAR(recovery), false, true];
_patient setVariable [QGVAR(overstretch), false, true];

_output = LLSTRING(Recovery_Cancel);
[_output, 1.5, _medic] call ACEFUNC(common,displayTextStructured);
}] call CBA_fnc_waitUntilAndExecute;
_patient setVariable [QGVAR(occluded), (_patient getVariable [QGVAR(wasOccluded), false]), true];
}, [_medic, _patient], 3600, {}] call CBA_fnc_waitUntilAndExecute;
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
params ["_medic", "_patient","_classname", "_usedItem"];

if (_patient getVariable [QGVAR(occluded), false]) exitWith {
[QGVAR(airwayFeedback), [_medic, LLSTRING(Airway_NotClearForItem)], _medic] call CBA_fnc_targetEvent;
[QGVAR(airwayFeedback), [_medic, LLSTRING(AirwayStatus_NotClearForItem)], _medic] call CBA_fnc_targetEvent;
[_medic, _usedItem] call ACEFUNC(common,addToInventory);
};

Expand Down
Loading
Loading