internal void AccessoryTransferredHandler(int SourceSlotIndex, int DestinationSlotIndex, int CoordinateIndex)
            {
                if (!MakerAPI.InsideAndLoaded)
                {
                    return;
                }

                Logger.Log(DebugLogLevel, $"[AccessoryTransferredHandler][{ChaControl.chaFile.parameter?.fullname}] Fired!!");

                CheckOutfitTriggerInfoCount(CoordinateIndex);

                if (!TriggerEnabled)
                {
                    Logger.Log(DebugLogLevel, $"[AccessoryTransferredHandler][{ChaControl.chaFile.parameter?.fullname}] TriggerEnabled false");
                    return;
                }
                OutfitTriggerInfo Todo = CharaTriggerInfo.ElementAtOrDefault(CoordinateIndex);

                CopySlotTriggerInfo(Todo.Parts[SourceSlotIndex], Todo.Parts[DestinationSlotIndex]);
                Todo.Parts[DestinationSlotIndex].Slot = DestinationSlotIndex;
            }
            internal void SyncOutfitTriggerInfo(int CoordinateIndex)
            {
                if (!TriggerEnabled)
                {
                    Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}] TriggerEnabled false");
                    return;
                }

                List <ChaFileAccessory.PartsInfo> PartsInfo = MoreAccessories_Support.GetCoordinatePartsInfo(ChaControl, CoordinateIndex);
                OutfitTriggerInfo OutfitTriggerInfo         = CharaTriggerInfo.ElementAtOrDefault(CoordinateIndex);

                Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}]Process OutfitTriggerInfo for Coordinate {CoordinateIndex}");

                List <AccTriggerInfo> TriggerParts = OutfitTriggerInfo.Parts;
                int PartsInfoCount    = PartsInfo.Count();
                int TriggerPartsCount = TriggerParts.Count();

                Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}][{CoordinateIndex}] Count {TriggerPartsCount} : {PartsInfoCount}");

                if (TriggerPartsCount > PartsInfoCount)
                {
                    CharaTriggerInfo[CoordinateIndex].Parts = CharaTriggerInfo[CoordinateIndex].Parts.Take(PartsInfoCount).ToList();
                    Logger.LogWarning($"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}] AccTriggerInfo for Coordinate {CoordinateIndex} Slot {TriggerPartsCount} -> {PartsInfoCount}");
                }
                else if (TriggerPartsCount < PartsInfoCount)
                {
                    for (int j = TriggerPartsCount; j < PartsInfoCount; j++)
                    {
                        CharaTriggerInfo[CoordinateIndex].Parts.Add(new AccTriggerInfo(j));
                    }
                    Logger.Log(DebugLogLevel, $"[SyncOutfitTriggerInfo][{ChaControl.chaFile.parameter?.fullname}] AccTriggerInfo for Coordinate {CoordinateIndex} Slot {TriggerPartsCount} -> {PartsInfoCount - 1}");
                }
                for (int i = 0; i < PartsInfoCount; i++)
                {
                    AccTriggerInfo TriggerPart = TriggerParts.ElementAtOrDefault(i);
                    if ((TriggerPart.Kind != -1) && (PartsInfo[i].type == 120))
                    {
                        CharaTriggerInfo[CoordinateIndex].Parts[i] = new AccTriggerInfo(i);
                        Logger.LogMessage($"AccTriggerInfo for Coordinate {CoordinateIndex} Slot {i + 1:00} has been reset");
                    }
                    else
                    {
                        if (TriggerPart.Kind == -1)
                        {
                            CharaTriggerInfo[CoordinateIndex].Parts[i] = new AccTriggerInfo(i);
                        }
                        else if (MathfEx.RangeEqualOn(0, TriggerPart.Kind, 7))
                        {
                            CharaTriggerInfo[CoordinateIndex].Parts[i].Group = "";
                        }
                        else if (TriggerPart.Kind == 9)
                        {
                            CharaTriggerInfo[CoordinateIndex].Parts[i].Group = PartsInfo[i].parentKey;
                        }
                        else if (TriggerPart.Kind > 9)
                        {
                            CharaTriggerInfo[CoordinateIndex].Parts[i].Group = "custom_" + (TriggerPart.Kind - 9).ToString();
                        }
                    }
                }
            }
            internal void AccSlotChangedHandler(int SlotIndex, bool Skip = false)
            {
                Logger.Log(DebugLogLevel, $"[AccSlotChangedHandler][{ChaControl.chaFile.parameter?.fullname}] Fired!!");

                if (!MakerAPI.InsideAndLoaded)
                {
                    return;
                }

                if (!TriggerEnabled)
                {
                    Logger.Log(DebugLogLevel, $"[AccSlotChangedHandler][{ChaControl.chaFile.parameter?.fullname}] TriggerEnabled false");
                    return;
                }
                CurOutfitTriggerInfo = CharaTriggerInfo.ElementAtOrDefault(CurrentCoordinateIndex);
                if (CurOutfitTriggerInfo == null)                 // basically won't happen
                {
                    Logger.Log(DebugLogLevel, $"[AccSlotChangedHandler][{ChaControl.chaFile.parameter?.fullname}] CurOutfitTriggerInfo is null");
                    return;
                }

                CheckOutfitTriggerInfoCount(CurrentCoordinateIndex);

                Logger.Log(DebugLogLevel, $"[AccSlotChangedHandler][{ChaControl.chaFile.parameter?.fullname}][SlotIndex]: {SlotIndex}");

                List <ChaFileAccessory.PartsInfo> PartsInfo = CharaAccInfo;

                ChaFileAccessory.PartsInfo PartInfo = PartsInfo.ElementAtOrDefault(SlotIndex);
                if ((PartInfo == null) || (CurOutfitTriggerInfo.Parts.ElementAtOrDefault(SlotIndex) == null))
                {
                    Logger.LogError($"[AccSlotChangedHandler][{ChaControl.chaFile.parameter?.fullname}][PartInfo: {PartInfo}][CurSlotTriggerInfo: {CurSlotTriggerInfo}]");
                    return;
                }

                CopySlotTriggerInfo(CurOutfitTriggerInfo.Parts[SlotIndex], CurSlotTriggerInfo);

                if (!Skip)
                {
                    if ((CurSlotTriggerInfo.Kind > -1) && (PartInfo.type == 120))
                    {
                        CurOutfitTriggerInfo.Parts[SlotIndex] = new AccTriggerInfo(SlotIndex);
                        Logger.LogMessage($"AccTriggerInfo for Coordinate {CurrentCoordinateIndex} Slot {CurSlotTriggerInfo.Slot + 1:00} has been reset");
                    }
                }

                int ddASSListVal = CurSlotTriggerInfo.Kind < 10 ? ddASSListVals.IndexOf(CurSlotTriggerInfo.Kind) : CurSlotTriggerInfo.Kind;

                GameObject.Find("ddASSList").GetComponentInChildren <TMP_Dropdown>().value = ddASSListVal;
                GameObject.Find("tglASS0").GetComponentInChildren <Toggle>().isOn          = CurSlotTriggerInfo.State[0];
                GameObject.Find("tglASS1").GetComponentInChildren <Toggle>().isOn          = CurSlotTriggerInfo.State[1];
                GameObject.Find("tglASS2").GetComponentInChildren <Toggle>().isOn          = CurSlotTriggerInfo.State[2];
                GameObject.Find("tglASS3").GetComponentInChildren <Toggle>().isOn          = CurSlotTriggerInfo.State[3];

                int refIndex = ddASSListVal < 10 ? ddASSListVal : 9;

                GameObject.Find("tglASS0").GetComponentInChildren <TextMeshProUGUI>().alpha = clothesStates[refIndex][0] ? 1f : 0.2f;
                GameObject.Find("tglASS1").GetComponentInChildren <TextMeshProUGUI>().alpha = clothesStates[refIndex][1] ? 1f : 0.2f;
                GameObject.Find("tglASS2").GetComponentInChildren <TextMeshProUGUI>().alpha = clothesStates[refIndex][2] ? 1f : 0.2f;
                GameObject.Find("tglASS3").GetComponentInChildren <TextMeshProUGUI>().alpha = clothesStates[refIndex][3] ? 1f : 0.2f;

                foreach (string group in VirtualGroupNames)
                {
                    Object.Destroy(GameObject.Find(group));
                }
                VirtualGroupNames.Clear();

                FillVirtualGroupStates();

                AnchorOffsetMinY = (int)GameObject.Find("tglASS0").GetComponent <RectTransform>().offsetMin.y - 80;

                List <string> names = VirtualGroupStates.OrderBy(x => x.Key).Select(x => x.Key).ToList <string>();

                foreach (string group in names)
                {
                    CreateMakerVirtualGroupToggle(group);
                }

                GameObject    accw   = GameObject.Find("04_AccessoryTop/AcsMoveWindow01");
                RectTransform windRt = accw.transform.Find("BasePanel/imgWindowBack").GetComponent <RectTransform>();

                windRt.offsetMin = new Vector2(0, ContainerOffsetMinY - 40 * names.Count());

                Logger.Log(DebugLogLevel, $"[AccSlotChangedHandler][{ChaControl.chaFile.parameter?.fullname}][Slot: {CurSlotTriggerInfo.Slot}][Kind: {CurSlotTriggerInfo.Kind}][State: {CurSlotTriggerInfo.State[0]}|{CurSlotTriggerInfo.State[1]}|{CurSlotTriggerInfo.State[2]}|{CurSlotTriggerInfo.State[3]}]");

                ChaControl.StartCoroutine(CoroutineSyncAllAccToggle(CoroutineSlotChangeDelay.Value));
            }