class DosAttributeProvider extends AttributeProvider {

  private static final ImmutableSet<String> ATTRIBUTES =
      ImmutableSet.of("readonly", "hidden", "archive", "system");

  private static final ImmutableSet<String> INHERITED_VIEWS = ImmutableSet.of("basic", "owner");

  @Override
  public String name() {
    return "dos";
  }

  @Override
  public ImmutableSet<String> inherits() {
    return INHERITED_VIEWS;
  }

  @Override
  public ImmutableSet<String> fixedAttributes() {
    return ATTRIBUTES;
  }

  @Override
  public ImmutableMap<String, ?> defaultValues(Map<String, ?> userProvidedDefaults) {<FILL_FUNCTION_BODY>}

  private static Boolean getDefaultValue(String attribute, Map<String, ?> userProvidedDefaults) {
    Object userProvidedValue = userProvidedDefaults.get(attribute);
    if (userProvidedValue != null) {
      return checkType("dos", attribute, userProvidedValue, Boolean.class);
    }

    return false;
  }

  @Override
  public @Nullable Object get(File file, String attribute) {
    if (ATTRIBUTES.contains(attribute)) {
      return file.getAttribute("dos", attribute);
    }

    return null;
  }

  @Override
  public void set(File file, String view, String attribute, Object value, boolean create) {
    if (supports(attribute)) {
      checkNotCreate(view, attribute, create);
      file.setAttribute("dos", attribute, checkType(view, attribute, value, Boolean.class));
    }
  }

  @Override
  public Class<DosFileAttributeView> viewType() {
    return DosFileAttributeView.class;
  }

  @Override
  public DosFileAttributeView view(
      FileLookup lookup, ImmutableMap<String, FileAttributeView> inheritedViews) {
    return new View(lookup, (BasicFileAttributeView) inheritedViews.get("basic"));
  }

  @Override
  public Class<DosFileAttributes> attributesType() {
    return DosFileAttributes.class;
  }

  @Override
  public DosFileAttributes readAttributes(File file) {
    return new Attributes(file);
  }

  /** Implementation of {@link DosFileAttributeView}. */
  private static final class View extends AbstractAttributeView implements DosFileAttributeView {

    private final BasicFileAttributeView basicView;

    public View(FileLookup lookup, BasicFileAttributeView basicView) {
      super(lookup);
      this.basicView = checkNotNull(basicView);
    }

    @Override
    public String name() {
      return "dos";
    }

    @Override
    public DosFileAttributes readAttributes() throws IOException {
      return new Attributes(lookupFile());
    }

    @Override
    public void setTimes(FileTime lastModifiedTime, FileTime lastAccessTime, FileTime createTime)
        throws IOException {
      basicView.setTimes(lastModifiedTime, lastAccessTime, createTime);
    }

    @Override
    public void setReadOnly(boolean value) throws IOException {
      lookupFile().setAttribute("dos", "readonly", value);
    }

    @Override
    public void setHidden(boolean value) throws IOException {
      lookupFile().setAttribute("dos", "hidden", value);
    }

    @Override
    public void setSystem(boolean value) throws IOException {
      lookupFile().setAttribute("dos", "system", value);
    }

    @Override
    public void setArchive(boolean value) throws IOException {
      lookupFile().setAttribute("dos", "archive", value);
    }
  }

  /** Implementation of {@link DosFileAttributes}. */
  static class Attributes extends BasicAttributeProvider.Attributes implements DosFileAttributes {

    private final boolean readOnly;
    private final boolean hidden;
    private final boolean archive;
    private final boolean system;

    protected Attributes(File file) {
      super(file);
      this.readOnly = (boolean) file.getAttribute("dos", "readonly");
      this.hidden = (boolean) file.getAttribute("dos", "hidden");
      this.archive = (boolean) file.getAttribute("dos", "archive");
      this.system = (boolean) file.getAttribute("dos", "system");
    }

    @Override
    public boolean isReadOnly() {
      return readOnly;
    }

    @Override
    public boolean isHidden() {
      return hidden;
    }

    @Override
    public boolean isArchive() {
      return archive;
    }

    @Override
    public boolean isSystem() {
      return system;
    }
  }
}

    return ImmutableMap.of(
        "dos:readonly", getDefaultValue("dos:readonly", userProvidedDefaults),
        "dos:hidden", getDefaultValue("dos:hidden", userProvidedDefaults),
        "dos:archive", getDefaultValue("dos:archive", userProvidedDefaults),
        "dos:system", getDefaultValue("dos:system", userProvidedDefaults));
  
<methods>public non-sealed void <init>() ,public ImmutableSet<java.lang.String> attributes(com.google.common.jimfs.File) ,public Class<? extends java.nio.file.attribute.BasicFileAttributes> attributesType() ,public ImmutableMap<java.lang.String,?> defaultValues(Map<java.lang.String,?>) ,public abstract ImmutableSet<java.lang.String> fixedAttributes() ,public abstract java.lang.Object get(com.google.common.jimfs.File, java.lang.String) ,public ImmutableSet<java.lang.String> inherits() ,public abstract java.lang.String name() ,public java.nio.file.attribute.BasicFileAttributes readAttributes(com.google.common.jimfs.File) ,public abstract void set(com.google.common.jimfs.File, java.lang.String, java.lang.String, java.lang.Object, boolean) ,public boolean supports(java.lang.String) ,public abstract java.nio.file.attribute.FileAttributeView view(com.google.common.jimfs.FileLookup, ImmutableMap<java.lang.String,java.nio.file.attribute.FileAttributeView>) ,public abstract Class<? extends java.nio.file.attribute.FileAttributeView> viewType() <variables>