protected static Set<Node> readNodes(ConfigurationNode data) {
        Set<Node> nodes = new HashSet<>();

        for (ConfigurationNode appended : data.getNode("permissions").getChildrenList()) {
            String plainValue = appended.getValue(Types::strictAsString);
            if (plainValue != null && !plainValue.isEmpty()) {
                nodes.add(NodeBuilders.determineMostApplicable(plainValue).build());
                continue;
            }

            NodeEntry entry = parseNode(appended, "permission");
            if (entry == null || entry.key.isEmpty()) {
                continue;
            }

            nodes.add(readAttributes(
                    NodeBuilders.determineMostApplicable(entry.key).value(entry.attributes.getNode("value").getBoolean(true)),
                    entry.attributes
            ));
        }

        for (ConfigurationNode appended : data.getNode("parents").getChildrenList()) {
            String plainValue = appended.getValue(Types::strictAsString);
            if (plainValue != null) {
                nodes.add(Inheritance.builder(plainValue).build());
                continue;
            }

            NodeEntry entry = parseNode(appended, "group");
            if (entry == null || entry.key.isEmpty()) {
                continue;
            }

            nodes.add(readAttributes(
                    Inheritance.builder(entry.key),
                    entry.attributes
            ));
        }

        for (ConfigurationNode appended : data.getNode("prefixes").getChildrenList()) {
            NodeEntry entry = parseNode(appended, "prefix");
            if (entry == null) {
                continue;
            }

            nodes.add(readAttributes(
                    Prefix.builder(entry.key, entry.attributes.getNode("priority").getInt(0)),
                    entry.attributes
            ));
        }

        for (ConfigurationNode appended : data.getNode("suffixes").getChildrenList()) {
            NodeEntry entry = parseNode(appended, "suffix");
            if (entry == null) {
                continue;
            }

            nodes.add(readAttributes(
                    Suffix.builder(entry.key, entry.attributes.getNode("priority").getInt(0)),
                    entry.attributes
            ));
        }

        for (ConfigurationNode appended : data.getNode("meta").getChildrenList()) {
            NodeEntry entry = parseNode(appended, "key");
            if (entry == null || entry.key.isEmpty()) {
                continue;
            }

            nodes.add(readAttributes(
                    Meta.builder(entry.key, entry.attributes.getNode("value").getString("null")),
                    entry.attributes
            ));
        }

        return nodes;
    }
Saves a configuration node to the given location

@param location the location
@param name the name of the object
@param node the node
@throws IOException if an io error occurs
common/src/main/java/me/lucko/luckperms/common/storage/implementation/file/AbstractConfigurateStorage.java