private void ContourListInspectorGUI()
    {
        // Adjust inspector capacity to contour count
        int ctCount = targetBuilder.ContourCount;

        if (contourInspectors == null)
        {
            contourInspectors = new ContourInspector[ctCount];
        }
        else
        {
            Array.Resize(ref contourInspectors, ctCount);
        }
        // Display each contour with expandable inspector
        string[] paletteOptions = targetBuilder.GetPaletteOptionNames();
        for (int cti = 0; cti < ctCount; cti++)
        {
            // Minimal inspector: palette option name
            EditorGUILayout.BeginHorizontal();
            EditorGUI.BeginChangeCheck();
            GUIStyle foldoutStyle = new GUIStyle(EditorStyles.foldout);
            foldoutStyle.focused.textColor = Color.blue;
            bool expand = EditorGUILayout.Foldout(contourInspectors[cti].inspectorState.HasFlag(ContourInspector.State.Expand), "Contour " + cti, foldoutStyle);
            if (EditorGUI.EndChangeCheck())
            {
                if (expand)
                {
                    contourInspectors[cti].inspectorState |= ContourInspector.State.Expand;
                }
                else
                {
                    contourInspectors[cti].inspectorState &= ~ContourInspector.State.Expand;
                }
                SceneView.RepaintAll();
                // Apply modifications in inspector
                EditorUtility.SetDirty(targetBuilder);
                return;
            }
            if (targetBuilder.palette != null)
            {
                EditorGUI.BeginChangeCheck();
                int paletteIndex = EditorGUILayout.Popup(targetBuilder.GetPaletteIndex(cti), paletteOptions);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(targetBuilder, "Set contour material");
                    targetBuilder.SetPaletteIndex(cti, paletteIndex);
                    // Apply modifications in inspector
                    EditorUtility.SetDirty(targetBuilder);
                }
            }
            EditorGUILayout.EndHorizontal();
            //Expanded inspector: contour blueprints
            ContourBlueprint[] blueprints = targetBuilder.contours[cti].blueprints;
            foreach (ContourBlueprint bp in blueprints)
            {
                bp.hideFlags = expand ? HideFlags.None : HideFlags.HideInInspector;
                //EditorUtility.SetDirty(bp);
            }
            if (expand)
            {
                // Adjust inspector to blueprint count
                int bpCount = blueprints.Length;
                if (contourInspectors[cti].blueprintEditors == null)
                {
                    contourInspectors[cti].blueprintEditors = new Editor[bpCount];
                }
                else
                {
                    Array.Resize(ref contourInspectors[cti].blueprintEditors, bpCount);
                }
                // Show editor for each blueprint of this contour
                EditorGUI.indentLevel++;
                if (bpCount > 0)
                {
                    for (int bpi = 0; bpi < bpCount; bpi++)
                    {
                        EditorGUILayout.BeginVertical("box");
                        ContourBlueprint bp = blueprints[bpi];
                        if (bp == null)
                        {
                            EditorGUILayout.HelpBox("Null blueprint", MessageType.Error);
                        }
                        else
                        {
                            EditorGUILayout.LabelField(bpi.ToString(), bp.GetType().Name);
                            Editor[] bpEditors = contourInspectors[cti].blueprintEditors;
                            CreateCachedEditor(bp, typeof(ContourBlueprintEditor), ref bpEditors[bpi]);
                            ContourBlueprintEditor bpEditor = (bpEditors[bpi] as ContourBlueprintEditor);
                            bpEditor.positionsDisplay = ContourBlueprintEditor.FieldDisplay.Hidden;
                            bpEditor.materialDisplay  = ContourBlueprintEditor.FieldDisplay.ReadOnly;
                            bpEditor.OnInspectorGUI();
                        }
                        EditorGUILayout.EndVertical();
                    }
                }
                else
                {
                    EditorGUILayout.HelpBox("This contour doesn't generate blueprints", MessageType.Info);
                }
                EditorGUI.indentLevel--;
            }
        }
    }