/// <summary>
        /// 指定されたブレンドシェイプに、<see cref="BlendShapePreset.Neutral"/>、および<see cref="BlendShapePreset.Blink"/>に含まれるシェイプキーと
        /// 同一のシェイプキーが含まれていれば、そのシェイプキーを複製します。
        /// </summary>
        /// <param name="avatar"></param>
        /// <param name="clip"></param>
        /// <param name="clips"></param>
        /// <returns>置換後のVRMのブレンドシェイプ一覧。</returns>
        private static IEnumerable <VRMBlendShapeClip> DuplicateShapeKeyToUnique(
            GameObject avatar,
            VRMBlendShapeClip clip,
            IEnumerable <VRMBlendShapeClip> clips
            )
        {
            string[] neutralAndBlinkShapeKeyNames = new[] { BlendShapePreset.Neutral, BlendShapePreset.Blink }
            .Select(selector: blendShapePreset => clips.FirstOrDefault(c => c.Preset == blendShapePreset))
            .SelectMany(selector: blendShapeClip =>
                        blendShapeClip ? blendShapeClip.ShapeKeyValues : new Dictionary <string, float>())
            .Select(selector: nameAndWeight => nameAndWeight.Key)
            .ToArray();

            Mesh mesh = avatar.transform.Find(VRChatUtility.AutoBlinkMeshPath).GetSharedMesh();

            foreach (var(oldName, weight) in clip.ShapeKeyValues)
            {
                if (!neutralAndBlinkShapeKeyNames.Contains(oldName))
                {
                    continue;
                }

                var newName    = BlendShapeReplacer.FeelingsShapeKeyPrefix + oldName;
                var index      = mesh.GetBlendShapeIndex(oldName);
                var frameCount = mesh.GetBlendShapeFrameCount(index);
                for (var i = 0; i < frameCount; i++)
                {
                    var deltaVertices = new Vector3[mesh.vertexCount];
                    var deltaNormals  = new Vector3[mesh.vertexCount];
                    var deltaTangents = new Vector3[mesh.vertexCount];

                    mesh.GetBlendShapeFrameVertices(index, i, deltaVertices, deltaNormals, deltaTangents);

                    mesh.AddBlendShapeFrame(
                        newName,
                        mesh.GetBlendShapeFrameWeight(shapeIndex: index, frameIndex: i),
                        deltaVertices,
                        deltaNormals,
                        deltaTangents
                        );
                }

                EditorUtility.SetDirty(mesh);

                clips = VRMUtility.ReplaceShapeKeyName(clips, oldName, newName);
            }

            return(clips);
        }