class Config {

        public static final String DEFAULT_AHC_PROPERTIES = "ahc-default.properties";
        public static final String CUSTOM_AHC_PROPERTIES = "ahc.properties";

        private final ConcurrentHashMap<String, String> propsCache = new ConcurrentHashMap<>();
        private final Properties defaultProperties = parsePropertiesFile(DEFAULT_AHC_PROPERTIES, true);
        private volatile Properties customProperties = parsePropertiesFile(CUSTOM_AHC_PROPERTIES, false);

        public void reload() {
            customProperties = parsePropertiesFile(CUSTOM_AHC_PROPERTIES, false);
            propsCache.clear();
        }

        /**
         * Parse a property file.
         *
         * @param file     the file to parse
         * @param required if true, the file must be present
         * @return the parsed properties
         * @throws RuntimeException if the file is required and not present or if the file can't be parsed
         */
        private Properties parsePropertiesFile(String file, boolean required) {<FILL_FUNCTION_BODY>}

        public String getString(String key) {
            return propsCache.computeIfAbsent(key, k -> {
                String value = System.getProperty(k);
                if (value == null) {
                    value = customProperties.getProperty(k);
                }
                if (value == null) {
                    value = defaultProperties.getProperty(k);
                }
                return value;
            });
        }

        @Nullable
        public String[] getStringArray(String key) {
            String s = getString(key);
            s = s.trim();
            if (s.isEmpty()) {
                return null;
            }
            String[] rawArray = s.split(",");
            String[] array = new String[rawArray.length];
            for (int i = 0; i < rawArray.length; i++) {
                array[i] = rawArray[i].trim();
            }
            return array;
        }

        public int getInt(String key) {
            return Integer.parseInt(getString(key));
        }

        public boolean getBoolean(String key) {
            return Boolean.parseBoolean(getString(key));
        }

        public Duration getDuration(String key) {
            return Duration.parse(getString(key));
        }
    }

            Properties props = new Properties();

            try (InputStream is = getClass().getResourceAsStream(file)) {
                if (is != null) {
                    try {
                        props.load(is);
                    } catch (IOException e) {
                        throw new IllegalArgumentException("Can't parse config file " + file, e);
                    }
                } else if (required) {
                    throw new IllegalArgumentException("Can't locate config file " + file);
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }

            return props;
        
<no_super_class>