class AdvancedSynthesizerFilter extends AbstractAdvancedSynthesizerFilter {

  @Override
  protected Synthesizer getSynthesizer() {
    return PortugueseSynthesizer.INSTANCE;
  }
  
  @Override
  protected boolean isSuggestionException(String token, String desiredPostag) {
    if ((desiredPostag.equals("VMIP1P0") || desiredPostag.equals("VMIP2P0"))
        && !token.endsWith("s")) {
      return true;
    }
    return false;
  }

  protected String movePronounTag(String sourceTag, String destinationTag) {<FILL_FUNCTION_BODY>}

  @Override
  public String getCompositePostag(String lemmaSelect, String postagSelect, String originalPostag,
                                   String desiredPostag, String postagReplace) {
    if (Objects.equals(postagReplace, "keepPronoun")) {
      return movePronounTag(originalPostag, desiredPostag);
    }
    return super.getCompositePostag(lemmaSelect, postagSelect, originalPostag, desiredPostag, postagReplace);
  }
}

    String[] sourceTagParts = sourceTag.split(":");
    String newTag = destinationTag;
    if (sourceTagParts.length == 2) {
      String[] destinationTagParts = destinationTag.split(":");
      newTag = destinationTagParts[0] + ":" + sourceTagParts[1];
    }
    return newTag;
  
<methods>public non-sealed void <init>() ,public org.languagetool.rules.RuleMatch acceptRuleMatch(org.languagetool.rules.RuleMatch, Map<java.lang.String,java.lang.String>, int, org.languagetool.AnalyzedTokenReadings[], List<java.lang.Integer>) throws java.io.IOException,public java.lang.String getCompositePostag(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) <variables>