// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public interface ApplicableForPath {
//     @NotNull
//     Configuration applyForPaths(@NotNull Configuration configuration, @NotNull PathsParam pathsParam);
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public static class PathsParam {
//     private final List<String> paths;
// 
//     private PathsParam(String path) {
//         this.paths = Collections.singletonList(path);
//     }
// 
//     private PathsParam(String... paths) {
//         this.paths = Arrays.asList(paths);
//     }
// 
//     List<String> getPaths() {
//         return paths;
//     }
// 
//     Configuration apply(Configuration configuration, ApplicableForPath action) {
//         return action.applyForPaths(configuration, this);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Options.java
// public class Options {
//     private static final Options EMPTY_OPTIONS = new Options(EnumSet.noneOf(Option.class));
//     private final EnumSet<Option> options;
// 
//     private Options(EnumSet<Option> options) {
//         this.options = options;
//     }
// 
//     public Options(Option first, Option... rest) {
//         this(EnumSet.of(first, rest));
//     }
// 
//     public static Options empty() {
//         return EMPTY_OPTIONS;
//     }
// 
//     public boolean contains(Option option) {
//         return options.contains(option);
//     }
// 
//     public Options with(Option option, Option... otherOptions) {
//         EnumSet<Option> optionsWith = EnumSet.copyOf(options);
//         optionsWith.addAll(EnumSet.of(option, otherOptions));
//         return new Options(optionsWith);
//     }
// 
// 
//     public Options without(Option option) {
//         EnumSet<Option> optionsWithout = EnumSet.copyOf(options);
//         optionsWithout.remove(option);
//         return new Options(optionsWithout);
//     }
// 
//     public Set<Option> values() {
//         return EnumSet.copyOf(options);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/PathOption.java
// public class PathOption {
//     private final List<String> paths;
//     private final Set<Option> options;
// 
//     /**
//      * True if this option is included, false if excluded.
//      */
//     private final boolean included;
// 
//     public PathOption(List<String> paths, Set<Option> options, boolean included) {
//         this.paths = Collections.unmodifiableList(paths);
//         this.options = Collections.unmodifiableSet(EnumSet.copyOf(options));
//         this.included = included;
//     }
// 
//     public List<String> getPaths() {
//         return paths;
//     }
// 
//     public Set<Option> getOptions() {
//         return options;
//     }
// 
//     boolean isIncluded() {
//         return included;
//     }
// 
//     public PathOption withPaths(List<String> newPoPaths) {
//         return new PathOption(newPoPaths, options, included);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/listener/DifferenceListener.java
// public interface DifferenceListener {
//     void diff(Difference difference, DifferenceContext context);
// }


import java.util.Set;
import static java.util.Arrays.asList;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.ApplicableForPath;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.PathsParam;
import net.javacrumbs.jsonunit.core.internal.Options;
import net.javacrumbs.jsonunit.core.internal.PathOption;
import net.javacrumbs.jsonunit.core.listener.DifferenceListener;
import org.hamcrest.Matcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
/**
 * Copyright 2009-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.javacrumbs.jsonunit.core;




/**
 * Comparison configuration. Immutable.
 */
public class Configuration {
    private static final DifferenceListener DUMMY_LISTENER = (difference, context) -> {};

    private static final String DEFAULT_IGNORE_PLACEHOLDER = "${json-unit.ignore}";
    private static final String ALTERNATIVE_IGNORE_PLACEHOLDER = "#{json-unit.ignore}";
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public interface ApplicableForPath {
//     @NotNull
//     Configuration applyForPaths(@NotNull Configuration configuration, @NotNull PathsParam pathsParam);
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/ConfigurationWhen.java
// public static class PathsParam {
//     private final List<String> paths;
// 
//     private PathsParam(String path) {
//         this.paths = Collections.singletonList(path);
//     }
// 
//     private PathsParam(String... paths) {
//         this.paths = Arrays.asList(paths);
//     }
// 
//     List<String> getPaths() {
//         return paths;
//     }
// 
//     Configuration apply(Configuration configuration, ApplicableForPath action) {
//         return action.applyForPaths(configuration, this);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/Options.java
// public class Options {
//     private static final Options EMPTY_OPTIONS = new Options(EnumSet.noneOf(Option.class));
//     private final EnumSet<Option> options;
// 
//     private Options(EnumSet<Option> options) {
//         this.options = options;
//     }
// 
//     public Options(Option first, Option... rest) {
//         this(EnumSet.of(first, rest));
//     }
// 
//     public static Options empty() {
//         return EMPTY_OPTIONS;
//     }
// 
//     public boolean contains(Option option) {
//         return options.contains(option);
//     }
// 
//     public Options with(Option option, Option... otherOptions) {
//         EnumSet<Option> optionsWith = EnumSet.copyOf(options);
//         optionsWith.addAll(EnumSet.of(option, otherOptions));
//         return new Options(optionsWith);
//     }
// 
// 
//     public Options without(Option option) {
//         EnumSet<Option> optionsWithout = EnumSet.copyOf(options);
//         optionsWithout.remove(option);
//         return new Options(optionsWithout);
//     }
// 
//     public Set<Option> values() {
//         return EnumSet.copyOf(options);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/internal/PathOption.java
// public class PathOption {
//     private final List<String> paths;
//     private final Set<Option> options;
// 
//     /**
//      * True if this option is included, false if excluded.
//      */
//     private final boolean included;
// 
//     public PathOption(List<String> paths, Set<Option> options, boolean included) {
//         this.paths = Collections.unmodifiableList(paths);
//         this.options = Collections.unmodifiableSet(EnumSet.copyOf(options));
//         this.included = included;
//     }
// 
//     public List<String> getPaths() {
//         return paths;
//     }
// 
//     public Set<Option> getOptions() {
//         return options;
//     }
// 
//     boolean isIncluded() {
//         return included;
//     }
// 
//     public PathOption withPaths(List<String> newPoPaths) {
//         return new PathOption(newPoPaths, options, included);
//     }
// }
// 
// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/listener/DifferenceListener.java
// public interface DifferenceListener {
//     void diff(Difference difference, DifferenceContext context);
// }


// Path: json-unit-core/src/main/java/net/javacrumbs/jsonunit/core/Configuration.java
import java.util.Set;
import static java.util.Arrays.asList;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.ApplicableForPath;
import net.javacrumbs.jsonunit.core.ConfigurationWhen.PathsParam;
import net.javacrumbs.jsonunit.core.internal.Options;
import net.javacrumbs.jsonunit.core.internal.PathOption;
import net.javacrumbs.jsonunit.core.listener.DifferenceListener;
import org.hamcrest.Matcher;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;

/**
 * Copyright 2009-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.javacrumbs.jsonunit.core;




/**
 * Comparison configuration. Immutable.
 */
public class Configuration {
    private static final DifferenceListener DUMMY_LISTENER = (difference, context) -> {};

    private static final String DEFAULT_IGNORE_PLACEHOLDER = "${json-unit.ignore}";
    private static final String ALTERNATIVE_IGNORE_PLACEHOLDER = "#{json-unit.ignore}";
    private static final Configuration EMPTY_CONFIGURATION = new Configuration(null, Options.empty(), DEFAULT_IGNORE_PLACEHOLDER, Matchers.empty(), Collections.emptySet(), DUMMY_LISTENER, Collections.emptyList());